repaint () дважды после изменения переменной - PullRequest
0 голосов
/ 05 мая 2020

По сути, я пытаюсь создать игру-стрелялку, в которой изображение случайным образом появляется на панели, и после щелчка по нему счет обновляется, а pi c меняет положение, однако я хочу разместить другое изображение сверху мишени после стрельбы (щелчка) забрызгал помидор. Для этого я создал оператор if в компоненте рисования, чтобы проверить, должно ли отображаться изображение или нет, затем в прослушивателе, щелкнувшем мышью, я меняю статус tom_visible на true, перерисовываю, жду, меняю на false и снова перерисовываю, но видимо, это не работает. Есть ли способ заставить это работать или какой-либо другой способ сделать это? Вот он код: Спасибо

public Gameplay(){
        addMouseListener(this);
        addKeyListener(this);
        setFocusable(true);
        setFocusTraversalKeysEnabled(false);
        timer = new Timer(delay, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                count++;
            }
        });
        timer.setInitialDelay(0);
        timer.start();
    }
    @Override
    public void paintComponent(Graphics g){

        if (!play && !win){
            g.setFont(new Font("serif", Font.BOLD, 20));
            g.drawString("Press Enter to Start", 265,300);
        }

        g.setFont(new Font("serif", Font.BOLD, 20));
        g.drawString("Kills: "+ score, 600,40);
        g.drawString("Level: "+level, 40, 40);

        if (score >=maxScore){
            play = false;
            win = true;
            level++;
            squareWidth -= 10;
            squareHeight -= 10;
            a = (int)(Math.random() * (600/squareWidth));
            b = (int)(Math.random() * (600/squareHeight));
            timer.stop();
            g.setColor(Color.black);
            g.setFont(new Font("serif", Font.BOLD, 20));
            g.drawString("Time: " + (double)count/100, 310,300);
            g.drawString("Press Enter to play again: ", 250, 350);
        }

        //Target image
        if (play){
            BufferedImage villano_image = null;
            try {
                villano_image = ImageIO.read(new File("/Users/davidarias/IdeaProjects/Shoot/src/Villano.png"));
            } catch (IOException e) {
                e.printStackTrace();
            }
            g.drawImage(villano_image.getScaledInstance(squareWidth,squareHeight,Image.SCALE_DEFAULT),a*squareWidth, b*squareHeight, null);
        }
        if (tomato_visible){
            BufferedImage tomato_img = null;
            try {
                tomato_img = ImageIO.read(new File("/Users/davidarias/IdeaProjects/Shoot/src/tomato.png"));
            } catch (IOException e) {
                e.printStackTrace();
            }
            g.drawImage(tomato_img.getScaledInstance(squareWidth,squareHeight,Image.SCALE_DEFAULT),shot.x, shot.y, null);
        }

        //Sets the new cursor with pointer
        Toolkit toolkit = Toolkit.getDefaultToolkit();
        Image cursor_image = toolkit.getImage("/Users/davidarias/IdeaProjects/Shoot/src/gameplay pointer.png");
        Cursor c = toolkit.createCustomCursor(cursor_image.getScaledInstance(25,25, Image.SCALE_SMOOTH) , new Point(this.getX()+12,
                this.getY()+12), "img");
        this.setCursor (c);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        timer.start();
        repaint();
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        shot = new Point(e.getX(),e.getY());
        hitBox = new Rectangle(a*squareWidth, b*squareHeight, squareWidth, squareHeight);
        if(play){
            if (score < maxScore){
                if (hitBox.contains(shot)){
                    score++;
                    a = (int)(Math.random() * (600/squareHeight));
                    b = (int)(Math.random() * (600/squareWidth));
                }
                tomato_visible = true;
                repaint();
                try {
                    TimeUnit.MILLISECONDS.sleep(300);
                } catch (InterruptedException interruptedException) {
                    interruptedException.printStackTrace();
                }
                tomato_visible = false;
            }
        }
        repaint();

    }
...