一年后回顾这个问题,我认为这是一个很难问的问题,而且有点尴尬。我不确定是要删除这个问题还是改写它,希望如果他们发现自己在我的鞋子里,这可能会有所帮助。
尽管阅读了关于setter和getter的内容,但我对类,范围,依赖关系的实际工作方式缺乏基本的了解。当时提出这个问题对于我把这两个部分放在一起非常有帮助,因为这是朝着正确的方向发展。
我通过整理自己的项目来学习Java。我目前正在开发一款简单的游戏,但是,我遇到了让我完全陷入困境的事情。我确定答案很简单,但是,我无法弄清楚为什么会这样。
我有一个方法:
public void inertia () {
y = speedY+y;
x= speedX+x;
}
然而,在我尝试过的两个课程中,它的表现不同。
当在[仅]一个类中调用它时,变量y似乎没有改变[在另一个类中]。当在[just the]中调用它时(一个负责动画的类,该类中使用的局部变量)并且sprite像预期的那样落在屏幕上[但是,原始类不会更新]。我只是想知道造成这种行为的原因。
我包含了一个JLabel来查看另一个类中的变量,并且它没有改变。
期望的结果是相应的x和y值改变,以便精灵将围绕JPanel移动
这是我想来的课程:
public class Mochi {
private float x;
private float y;
private float speedX = 0;
private float speedY = 3;
private float gravity = 3;
boolean mRunR = true;
public float getSpeedY(){
return this.speedY;
}
public float getSpeedX() {
return this.speedX;
}
public float getX() {
return this.x;
}
public float getY() {
return this.y;
}
// problem method below:
public void inertia () {
y = speedY+y;
x= speedX+x;
}
}
在测试动画时,我在这个课程中写了它,发现它可以在这里工作:
public class Animation {
Image ms = new ImageIcon("mochirs.png").getImage();
Image mws = new ImageIcon("mochiws.png").getImage();
Image currentSprite;
int aniTime = 1;
int sW = 21;
int sH = 14;
Mochi mochi = new Mochi();
int x = (int) mochi.getX();
int y = (int) mochi.getY();
int speedY = (int) mochi.getSpeedY();
int speedX = (int) mochi.getSpeedX();
boolean mRunR = mochi.mRunR;
public void inertia() {
y = speedY+y;
x = speedX+x;
}
public void draw (Graphics g) {
Graphics2D g2 = (Graphics2D) g.create();
g2.setClip(x, y, sW, sH);
g2.drawImage(currentSprite, x, y, sW, sH, null);
}
public void setCurrentSprite (){
if (mRunR == true) {
if (aniTime <= 5) {
currentSprite = mws;
aniTime ++;
}else if (aniTime <= 10) {
currentSprite = ms;
aniTime++;
}else {
aniTime = 1;
}
}
}
}
以下是调用方法:
public class DogLogic extends JPanel {
Animation animation = new Animation();
Mochi mochi = new Mochi();
int refreshRate = 30;
public DogLogic () {
JPanel testPain = new JPanel();
JLabel testLabel2= new JLabel (Integer.toString((int)mochi.getX()));
JLabel tl3 = new JLabel (Integer.toString((int) mochi.getY()));
JLabel tl4 = new JLabel (Integer.toString((int) mochi.getSpeedY()));
testPain.add(testLabel2, BorderLayout.SOUTH);
testPain.add(tl3);
testPain.add(tl4);
add (testPain);
gameStart();
}
public void gameStart() {
Thread gameThread = new Thread() {
public void run() {
while (true) {
gameUpdate();
repaint();
try {
Thread.sleep(1000/refreshRate);
}catch (InterruptedException e) {
System.out.println("An error in gameThread has occured");
}
}
}
};
gameThread.start();
}
public void gameUpdate () {
animation.setCurrentSprite();
mochi.inertia();
animation.intertia();
}
@Override
public void paintComponent (Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g.create();
animation.draw(g2);
}
}
我期待一个类自动地使用来自另一个类的变量,因为我当时不了解类,范围和依赖关系在Java中是如何工作的。
如果您发现自己有类似的问题,研究范围,依赖注入和基本的面向对象设计模式。
答案 0 :(得分:1)
动画类有两个变量x和y,在调用animation.inertia()
时会发生变化。
但是当您在DogLogic Class中调用mochi.inertia()
时,属于Mochi类的x和y会发生变化。动画类x和y根本不会改变。
因此,当仅调用mochi.inertia()
时,x和y在Animation类中保持不变。
在DogLogic Class中更新gameUpdate:
public void gameUpdate () {
animation.setCurrentSprite();
mochi.inertia();
animation.updateXY(this.mochi);
}
在动画类中:
public void updateXY( Mochi mochi){
x = (int) mochi.getX();
y = (int) mochi.getY();
}