Метод рисования Java не обновляет значение переменной - PullRequest
0 голосов
/ 25 сентября 2018

Я не понимаю, что происходит.

Это мой класс

public class MyGame extends JPanel implements ActionListener, KeyListener {

private static final long serialVersionUID = 1L;

private Timer timer;

private Image plyr;

public int x, y, x_pelota, y_pelota;
private boolean up, down, left, right;

public MyGame(){

    resetArrows();

    ImageIcon pertsonaiaIcon = new ImageIcon(this.getClass().getResource("img/plyr.png"));
    pertsonaia = pertsonaiaIcon.getImage();

    timer = new Timer(15, this);
    timer.start();
}

private void resetArrows() {
    up = false;
    down = false;
    left = false;
    right = false;
}

public boolean updatePosition(String object, int x, int y) {
    if (object.equals("Player")){
        if (up) {
            this.y = y + 5;
            this.x = x;
        }else if (down) {
            this.y = y - 5;
            this.x = x;
        }else if (left) {
            this.x = x - 5;
            this.y = y;
        }else if (right) {
            this.x = x + 5;
            this.y = y;
        }else {
            this.x = x;
            this.y = y;
        }
    }else {
        //Mover pelota
    }

    resetArrows();

    //if (Math.abs(x - x_pelota) < 2 && Math.abs(y - y_pelota) < 2)
        //return false;

    return true;
}

@Override
public void paint(Graphics g){
    super.paint(g);
    System.out.println(this.x);
    g.drawImage(plyr, this.x, this.y, this);
}

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

@Override
public void keyPressed(KeyEvent e) {
    int keyCode = e.getKeyCode();

    switch(keyCode) { 
    case KeyEvent.VK_UP:
        resetArrows();
        up = true;
        break;
    case KeyEvent.VK_DOWN:
        resetArrows();
        down = true;
        break;
    case KeyEvent.VK_LEFT:
        resetArrows();
        left = true;
        break;
    case KeyEvent.VK_RIGHT :
        resetArrows();
        right = true;
        break;
    }   
}

@Override
public void keyReleased(KeyEvent e) {}

@Override
public void keyTyped(KeyEvent e) {}

}

У меня есть Поток в другом классе, который вызывает этот класс 'Метод updatePosition, который должен обновлять значения переменных x и y, и это происходит!Я попытался напечатать значения this.x и this.y, и значения обновились, но метод рисования принимает 0, и я не понимаю, почему.

Я не знаю, так ли это, потому что я использую потоки... Я не знаю, что попытаться решить проблему.

1 Ответ

0 голосов
/ 25 сентября 2018

Я не знаю, так ли это, потому что я использую темы ...

Это так!JVM разрешено давать каждому потоку собственную копию переменных.Если вы хотите сделать изменения из одного потока видимыми в другом потоке, вы должны либо синхронизировать доступ, либо пометить переменные как изменчивые.Синхронизация кажется более подходящей, поскольку вы изменяете обе переменные за один раз.

В качестве быстрого решения отредактируйте ваши методы следующим образом:

public synchronized boolean updatePosition(...) { ... }
public synchronized boolean paint(...) { ... }
...