我认为你所做的是最好的方法......你的游戏世界或多或少在 MainActivity 中定义,从它分支到 GameLoop 中的物理部分(+用户输入)和 MyGLSurfaceView 中的图形表示。
你失败的地方是你在 GameLoop 而不是 MainActivity 中定义了你的“球”。我建议您在 MainActivity 中创建所有现有对象,然后将它们发送到需要的地方,通常是多个地方。因此,对于您的“球”案例,您应该在 MainActivity 中创建它的一个实例并设置GameLoop.ball = ball
and MyGLSurfaceView.MyRenderer.ball = ball
。
在更一般的情况下,您将为您的游戏对象 GameObject 创建一个基类,然后对它们进行子类化,基类可能具有与游戏相同的方法move(double timeInterval)
,draw()
具体取决于游戏。现在您的 MainActivity 将持有某种类型的数组来保存所有 GameObject 对象,并负责创建这些对象并将它们发送到其他类,例如绘图引擎或物理引擎,这些类也应该有一个可以存储这些对象以供使用的数组。
现在,如果您管理这样的层次结构,您的绘图引擎将只循环其内部数组并绘制所有对象(除了设置矩阵和参数),这正是它应该做的。请注意,它甚至不必知道那些 X、Y 位置,因为它们仅用于 draw() 方法,该方法是 GameObject 本身的一部分。游戏的物理部分也是如此。
不过,这里有一些关于多线程的注意事项。在您的情况下,您似乎至少有 3 个线程:MainActivity、GameLoop、MyRenderer。您不能随时将 MainActivity 数组中的对象添加到 MyRenderer 数组中,您应该将消息排队到 GameLoop 以收集对象并在渲染周期完成时将它们添加到其数组中,删除和 GameLoop 线程也是如此。另一件事是加载 GL 内容:所有加载都应该在单个线程 (MyRenderer) 上,因此尽管 MainActivity 线程创建了它不应该初始化任何 GL 加载的项目,MyRenderer 线程应该询问对象是否已加载 GL 部分并调用如果需要加载,删除也是如此。
虽然这个问题与openGL无关,但游戏引擎的架构非常重要,应该提前规划。我希望您在使用 OOP 和设计引擎时都能对这个答案有所了解。另请注意,有许多很棒的方法可以创建这样的引擎,其他人可能不同意或有更好的解决方案。