java - 从方法创建对象(使用抽象方法)并将其添加到 "ArrayList"s

标签 java object arraylist

我正在尝试创建一个基本的贪吃蛇游戏。我有一个非常基本的 2D Java 游戏引擎。以下是所有更新和渲染的发生方式:

我有一个 GameObjectsArrayList ,它是我创建的一个类,有两个名为“update”和“render”的抽象方法(还有一些没有任何内容的变量)与问题有关,但告诉它可能会减少回答问题时的困惑)。我在游戏类中创建对象,如下面的示例代码所示,然后将它们添加到 ArrayList 中。然后我基本上使用增强的 for 循环来更新和渲染 ArrayList 中的所有对象。

我基本上想在游戏运行时以方法创建一个对象(每次吃“食物”时都会创建一个 body 部位)。

当我使用以下代码在方法内创建主体部分时,我在“渲染”部分中使用的每个变量都会收到错误消息

Cannot refer to a non-final variable body inside an inner class defined in a different method

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);
    }
};

另外,如果我不将任何内容放入渲染方法中,并且基本上将所有内容留空,并尝试将这个“头”添加到相同的 GameObjectsArrayList 中方法我得到 java.util.ConcurrentModificationException 异常。

更多信息:

  • 从一开始就存在的物体(头部和食物)是;

    • 在 Game 类中创建(而不是在任何类型的方法中)
    • 通过在 Game 类的构造函数中调用的方法添加到 GameObjectsArrayList

编辑 - 更多信息:

  • 当我将 body 设置为最终时,我收到一条错误消息 局部变量 主体可能尚未初始化

问题是:

  • 我应该在哪里以及如何定义“body”对象。
  • 我应该在哪里以及如何将其添加到对象的 ArrayList 中。

感谢您的考虑。

最佳答案

When I make body final, I get an error saying The local variable
body may not have been initialized.  

当你声明一个变量为final时,你必须立即给它赋值,或者在构造函数中赋值,否则你会得到一个错误。

我建议您将GameObjectGraphics分开,在初始化GameObject对象后修改Graphics对象至少。

对于GameObject,在子类(Body)中实现render()和update,您可以在每次创建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

关于java - 从方法创建对象(使用抽象方法)并将其添加到 "ArrayList"s,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23574167/

相关文章:

java - 不使用迭代器从用户输入中删除 arraylist 的元素

java - 将一个列表中的项目添加到java中的另一个列表中

java - CAS 客户端中的服务属性

java - 如何使用通用 JPanel() 管理 BorderLayout

java - 如何从子模块构建目录添加 Artifact ?

javascript - 在 JavaScript 中检查嵌套对象是否只包含单个键值对

javascript - 使用对象在数组内部循环以获取其中一个属性

java - Collections.sort() 不适用于自定义对象

java - 尝试添加到本地初始化的数组列表时出现 NullPointerException

java - 无法绘制多个实例