0

所以我正在使用 OpenGL 开发一款 Android 游戏;它与 Breakout 大致相似。到目前为止,当用户更改她的输入时,我已经在每个并条帧上更新游戏。不过,现在我有一个球对象,我想定期更新它的 x 和 y 坐标。我通过一个游戏循环来做到这一点,但尝试提取坐标比我预期的更令人困惑。

我的类层次结构是这样的: MainActivity 有一个 GameLoop 的实例。GameLoop 有一个 Ball 的实例。Ball 具有 x 和 y 字段以及用于更新它们的函数;GameLoop 在新线程中重复调用这些函数。

MainActivity 也有一个 MyGLSurfaceView 的实例,它有一个 MyRenderer 的实例,它在每个并条框上绘制我的所有对象——所以这是我需要访问那些 x 和 y 坐标的地方。

所以我想要做的是通过我的层次结构的两个级别向上拉两个变量,并通过两个不同的级别向下拉两个变量。诚然,我对 OOP 有点陌生,我觉得这个程序的整个结构可能会被误导,所以我不知道从哪里开始。:/

感谢您的帮助!我会发布代码,但我不确定哪些位会有所帮助。

4

1 回答 1

1

我认为你所做的是最好的方法......你的游戏世界或多或少在 MainActivity 中定义,从它分支到 GameLoop 中的物理部分(+用户输入)和 MyGLSurfaceView 中的图形表示。

你失败的地方是你在 GameLoop 而不是 MainActivity 中定义了你的“球”。我建议您在 MainActivity 中创建所有现有对象,然后将它们发送到需要的地方,通常是多个地方。因此,对于您的“球”案例,您应该在 MainActivity 中创建它的一个实例并设置GameLoop.ball = balland 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 和设计引擎时都能对这个答案有所了解。另请注意,有许多很棒的方法可以创建这样的引擎,其他人可能不同意或有更好的解决方案。

于 2013-03-20T10:12:10.050 回答