2014-10-19 90 views
1

我有三个类:运动,碰撞和变量(Variables类是我存储变量的地方,它们都是公共的和静态的,考虑到我是java新手,我不太了解static关键字的作用是什么,所以我的问题可能与static关键字有关)。在我的碰撞类中,有一种方法可以检查地图中的碰撞。现在,这个方法效果完美:Java:变量不增加

public void checkCollision(int x, int y) 
{ 

    if (x == 100){ 
     Variables.collisionRight = true; 

    } else { 
     Variables.collisionRight = false; 
    } 
} 

在这里,我有我的运动类中的方法不工作:

public void playerMovement (int x, int y) 
{ 
    if (RightKeyPressed == true & collisionRight == false) { 
     x += Variables.speed; 

    } 
} 

这是我如何调用这些方法:

someObject.checkCollision(Variables.playerX, Variables.playerY); 
someOtherObject.playerMovement(Variables.playerX, Variables.playerY); 

似乎对我来说问题是这条线:

x += Variables.speed; 

如果我改变

x 

Variables.playerX 

一切正常,但是这不是我想要的工作。

这不起作用。基本上应该是(Variables.playerX + = Variables.speed) 所有的方法都是样本。我想知道为什么我的x(Variables.playerX)变量不增加3(这是我的Variables.speed变量);我想知道为什么我的x(Variables.playerX)变量不增加3(这是我的Variables.speed变量)。

+1

只是说使用(RightKeyPressed&!collisionRight) – 2014-10-19 15:55:50

+1

您的标题没用。它应该描述具体问题。 – 2014-10-19 15:55:50

回答

2

发生了什么事是Variables.playerX正在通过由值x。当功能修改x时,它正在有效修改Variables.playerX的本地副本。

关于进一步的讨论,请参阅解决这一Is Java "pass-by-reference" or "pass-by-value"?Java is Pass-by-Value, Dammit!

的一种方式是通过使(基准于)Variables对象,而不是xy

public void playerMovement (Variables vars) 
{ 
    if (RightKeyPressed && !collisionRight) { 
     vars.x += vars.speed; 
    } 
} 

P.S.请注意我如何重写if条件。虽然你有什么是不正确的,但我们并没有明确地比较布尔值与truefalse。而且,&&||优先于布尔上下文中的&|,因为它们是short-circuit

+0

那么如何在该类中创建一个方法来改变我的'Variables.playerX'变量的值呢? – 2014-10-19 15:59:05

+0

@GeorgiTonchev:通过参考。查看更新后的答案。 – NPE 2014-10-19 16:00:55