我正在尝试创建一个基本的Snake游戏。我有一个非常基本的2D Java游戏引擎。这就是所有更新和渲染的发生方式:
我有一个ArrayList
GameObjects
这是我创建的一个类,它有两个抽象的方法,名为" update"和"渲染" (还有一些变量与问题无关但告诉它可能会减少回答时的混乱)。我在游戏类中创建对象,如下面的示例代码中所示,然后将它们添加到ArrayList
。然后我基本上使用增强的for循环来更新和渲染ArrayList
中的所有对象。
我基本上想要在方法中创建一个对象,而游戏正在运行(每次创建一个正文部分"食物"是吃掉)。
当我使用以下代码在方法中创建一个正文部分时,我在" render"中使用的每个变量都会出错。部分说
不能引用内部类中的非final变量体 用不同的方法定义
GameObject body = new GameObject(DOT_SIZE, DOT_SIZE, food.boardPosX, food.boardPosY) {
@Override
void update() {
//MOVE PART
}
@Override
void render(Graphics g) {
g.fillRect(body.pixelPosX, body.pixelPosY, body.pixelSizeX, body.pixelSizeY);
}
};
此外,如果我没有在渲染方法中添加任何内容,并且基本上将所有内容都留空,并尝试添加此内容,并且#34; head"使用同一方法ArrayList
GameObjects
我获得java.util.ConcurrentModificationException
例外。
更多信息:
从一开始就存在的物体(头部和食物);
ArrayList
类的构造函数中调用的方法中添加到GameObjects
的{{1}}。编辑 - 更多信息:
Game
。问题是:
感谢您的考虑。
答案 0 :(得分:1)
When I make body final, I get an error saying The local variable
body may not have been initialized.
当您将变量声明为final时,您必须立即为其赋值,或者在构造函数中指定值,否则您将收到错误。
我建议您将GameObject
与Graphics
分开,在Graphics
对象至少初始化后修改GameObject
对象。
对于GameObject
,实现render()并在子类(Body)中更新,您可以在每次创建body
对象时调用它。例如,将您的GameObject类作为抽象类,将这两个方法保持为抽象,创建类Body以从GameObject扩展并实现它们。
根据您提供的以下代码,
void render(Graphics g) {
g.fillRect(body.pixelPosX, body.pixelPosY, body.pixelSizeX, body.pixelSizeY);
}
我想你想要这样的事情:
void render(Graphics g) {
g.fillRect(this.pixelPosX, this.pixelPosY, this.pixelSizeX, this.pixelSizeY);
}
您尝试将当前对象的值分配给fillRect