所以我正在使用OpenGL开发Android游戏;它与Breakout大致相似。到目前为止,当用户改变输入时,我已经在每个并条机上更新了游戏。但是,现在,我有一个球对象,其x和y坐标我想定期更新。我是通过游戏循环来做到这一点的,但是试图提取坐标比我预期的更令人困惑。
我的类层次结构如下: MainActivity有一个GameLoop实例。 GameLoop有一个Ball实例。 Ball有x和y字段以及用于更新它们的函数; GameLoop在新的Thread中重复调用这些函数。
MainActivity还有一个MyGLSurfaceView实例,它有一个MyRenderer实例,它在每个绘制框架上绘制我的所有对象 - 所以这就是我需要访问那些x和y坐标的地方。
所以我要做的就是将两个变量拉到我的层次结构的两个级别,然后向下拉两个不同的级别。我承认对OOP来说有些新手,我觉得这个程序的整个结构可能会被误导,所以我不知道从哪里开始。 :/
感谢您的帮助!我会发布代码,但我不确定哪些位会有任何帮助。
答案 0 :(得分:1)
根据我的观点,你所做的是最好的方法......你的游戏世界或多或少是在MainActivity中定义的,从它分支到GameLoop中的物理部分(+用户输入)和MyGLSurfaceView中的图形表示。
你失败的地方是你在GameLoop而不是MainActivity中定义了你的“球”。我建议你在MainActivity中创建所有现有对象,然后在需要的地方发送它们,通常在多个地方。因此,对于您的“球”案例,您应该在MainActivity中创建一个实例并设置GameLoop.ball = ball
和MyGLSurfaceView.MyRenderer.ball = ball
。
在更一般的情况下,您将为游戏对象GameObject创建一个基类,然后将它们子类化,基类可能会有move(double timeInterval)
和draw()
等方法,具体取决于游戏。现在你的MainActivity将包含一些类型的数组来保存所有GameObject对象,并负责创建这些对象并将它们发送到其他类,例如绘图引擎或物理引擎,它们也应该有一个数组,可以存储这些对象以供使用。 / p>
现在,如果您管理了这样的层次结构,您的绘图引擎将只循环其内部数组并绘制所有对象(除了设置矩阵和参数),这正是应该做的。注意它甚至不必知道那些X,Y位置,因为它们仅用于draw()方法,它是GameObject本身的一部分。对于游戏中的物理部分也是如此。
这里有一些关于多线程的注意事项。在你的情况下,你似乎至少有3个线程:MainActivity,GameLoop,MyRenderer。您不能随时将MainActivity数组中的对象添加到MyRenderer数组,您应该将消息排队到GameLoop以收集对象并在渲染周期完成时将它们添加到其数组中,同样适用于删除和GameLoop线程。另一件事是加载GL内容:所有加载应该在一个线程(MyRenderer)上,所以虽然MainActivity线程创建了它不应该初始化任何GL加载,MyRenderer线程应该询问对象是否已加载GL部分并调用如果需要,加载同样可以删除。另一件事是GameLoop线程在很多情况下会得到命令来创建/删除对象(用户双击 - >创建新球),永远不会直接在该线程上创建对象,使系统发送消息给MainActivity这样做。
虽然这个问题与openGL没有任何关系,但游戏引擎的架构非常重要,应该提前规划。我希望你能在两者中使用这个答案,使用OOP和设计引擎。另请注意,有很多很好的方法可以创建像这样的引擎,而其他人可能不同意或有更好的解决方案。