我目前正在使用名为libgdx的框架学习游戏编程。它允许用户制作可以在桌面上的Java虚拟机和Android手机上轻松运行的程序。我正在尝试制作一个基本程序,它将在屏幕上显示一个字符,并允许我使用键盘来回移动它。我创建了3个类 - 一个名为Assets
,它将文件加载到内存中并将它们转换为纹理和动画,一个名为InputHandler
,通过更改动画,移动方向等来响应键输入。 ,还有一个叫FightView
,它基本上就是所有渲染完成的地方。使用典型命令InputHandler
从FightView
类调用input = new InputHandler(anim, frame);
。 InputHandler
的构造函数如下所示:
public InputHandler(Animation animation, TextureRegion region){
Assets.load(); //loads textures from files into memory and creates animations from them
animation = Assets.playStance; //set initial animation to be used
region = animation.getKeyFrame(0, true); //make TextureRegion equal to first frame in animation
}
现在,我想要发生的只是传递给构造函数的Animation和TextureRegion被设置为上面引用的值,所以,例如,如果我在{{1}中提到region
声明FightView
后的类,它将被设置为input
。从我有限的Java经验来看,这是我认为应该发生的事情,但是我在编译时得到一个NullPointerException指向下面代码中的第二行:
animation.getKeyFrame(0, true);
显然, input = new InputHandler(anim, frame);
x = centreX - (frame.getRegionWidth() / 2);
仍然为null,即使在通过构造函数传递之后,(在构造函数的第三行中可以看到)应该为其赋值。请注意,在传递给构造函数之前,它们实际上都是null - 我正在尝试创建一个类,它将在frame
类中提供字段数据而不需要这样做。
任何帮助表示赞赏。这可能是错误的方法 - 我要做的是创建一个对象,在初始化时,将加载FightView
和Animation
s数据。
答案 0 :(得分:1)
您遇到的问题是由于对基本Java概念的误解。 Java按值传递参数,而不是参考。你写的东西永远不会像你期望的那样工作。
首先,我建议您解决一个更简单的问题,或者进行一次侧面访问以强化一些基本的Java概念和对象概念。
其次,这是达到你想要的简短答案。
将成员添加到InputHandler类以保存Animation和TextureRegion。在构造函数中(不带任何参数),你可以像你所做的那样分配值,除非你将它们分配给成员变量。
class InputHandler {
public Animation animation;
public TextureRegion region;
public InputHandler() {
Assets.load(); //loads textures from files into memory and creates animations from them
animation = Assets.playStance; //set initial animation to be used
region = animation.getKeyFrame(0, true); //make TextureRegion equal to first frame in animation
}
}
在构造InputHandler之后,您可以引用它的成员(在本例中为框架)并查看正确的值。
input = new InputHandler();
x = centreX - (input.frame.getRegionWidth() / 2);