Java相同的变量在不同的地方有不同的值

标签 java libgdx

所以我有一个类,它处理作为 libgdx 应用程序一部分创建的屏幕的用户输入。 我的问题是变量cameraDelta(它是一个Vector2)在keyTyped 和getCameraDelta 中似乎具有不同的值。

在两种方法中在运行时使用 sys.out.println 都会显示每当按下任何“wasd”时值就会发生变化,并且该值会随着时间的推移而保持不变,但从 getCameraDelta 输出时该值始终保持在 (0, 0)

public class InputHandler implements InputProcessor {

    private Firetruck myTruck;
    private GameWorld myWorld;
    private int mouseX;
    private int mouseY;
    private Vector2 cameraDelta;

    public InputHandler(GameWorld myWorld) {
        this.myWorld = myWorld;
        myTruck = myWorld.getFiretruck();
        cameraDelta = new Vector2(0, 0);
    }

    @Override
    public boolean keyDown(int keycode) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean keyUp(int keycode) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean keyTyped(char character) {
        if (character == 'w') {
            cameraDelta.add(0, 5);
        } else if (character == 's') {
            cameraDelta.add(0, -5);
        } else if (character == 'd') {
            cameraDelta.add(5, 0);
        } else if (character == 'a') {
            cameraDelta.add(-5, 0);
        }
        return false;
    }

    public Vector2 getCameraDelta() {
        /*/
        Vector2 temp = this.cameraDelta.cpy();
        /*/
        Vector2 temp;
        temp = new Vector2(0, 0);
        temp.add(cameraDelta);
        Gdx.app.log("getCameraDelta", cameraDelta.toString());
        cameraDelta.x=0;
        cameraDelta.y=0;
        return temp;
    }

最佳答案

这是因为您要在新的 Vector2 实例中添加一个对象 cameraDelta。 java 中的对象是通过引用传递的,因此每当您对 cameraDelta 进行更改时,它会在使用的所有地方发生更改。例如:

public class Foo {
  public int fooNumber;
}

public class Bar {
  public Foo fooBar;

  public Bar() {
      fooBar = new Foo();
      fooBar.fooNumber = 1;
  }

  public void changeReference(Foo foo) {

      System.out.println(fooBar.fooNumber);  // RESULT -> 1

      fooBar = foo;  // here you're making your original foo to
      //point to the "foo" passed in the method

      foo.fooNumber = 0;

      System.out.println(fooBar.fooNumber); // RESULT -> 0
  }

  public static void main(String[] args) {
      Bar bar = new Bar();
      Foo foo = new Foo();
      bar.changeReference(foo);
      System.out.println(bar.fooBar.fooNumber); // RESULT -> 0
  }

}

关于Java相同的变量在不同的地方有不同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59797669/

相关文章:

libgdx - 如何在 libgdx 中补间 BitmapFontCache 的 alpha?

java - AsyncTask 不会延迟 Handler 中的操作

java - Apache Camel : Is it possible to configure WMQ without using Spring?

java - Android Studio LibGDX 游戏问题

java - libgdx 布娃娃物理与动画

java - LibGDX setScreen() 多次执行时会导致游戏崩溃

java - Libgdx画游戏逻辑

java - java 包装类

Java:可点击网格项目 - 使用什么? (JFrame 和 JPanel)?

java - 在 Android 中检查文件是否为空