我不知道发生了什么事。
这是我的课程
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值,并且值已更新,但是paint方法的值为0,我不明白为什么。
我不知道这是否是因为我正在使用线程...我不知道该怎么解决这个问题。
答案 0 :(得分:2)
我不知道是否是因为我正在使用线程...
是!允许JVM给每个线程一个自己的变量的副本。如果要使一个线程的更改在另一个线程中可见,则必须同步访问或将变量标记为volatile。一次更改两个变量似乎更合适。
作为一种快速的解决方案,请按以下方式编辑您的方法:
public synchronized boolean updatePosition(...) { ... }
public synchronized boolean paint(...) { ... }