我在网上浏览过,无法找到以下有效答案。 在Android中,当使用SurfaceView和Thread来促进游戏循环时,通常你的onDraw调用会永久运行。这对于渲染事物很好,但是因为你的游戏逻辑也在这个循环中(检查诸如游戏条件,鼠标事件等等),如果你的代码只需要运行一次怎么办?
由于我觉得这不清楚,让我举一个例子。
我正与几个州制作游戏。当状态设置为title时,游戏循环执行titleScreenRendering()方法,该方法的图像从0到1逐渐消失;类似于闪屏的东西。由于此调用是在游戏循环中,“titleScreenRendering”被调用9999999次,图像淡入逻辑也是如此,这显然不起作用。
我发现一种感觉像黑客的方法是只做一个布尔值并在第一次游戏循环运行方法时将其设置为false,这样在999999后续调用中至少代码的那部分是不再跑了。
我在这里做错了什么?我的设计是错误的,如果这是为什么99%的Android游戏教程似乎提倡这种方法?请让一些聪明的家伙指出我正确的方向。我想自己这样做,但我很想使用图书馆。
答案 0 :(得分:1)
我已经在Android中以与你正在做的事情类似的方式实现了我的游戏。我在引擎中添加了一个模拟屏幕的“图层”。在游戏核心循环中,我只绘制并更新屏幕。这样,如果我有几个屏幕,如菜单等,我当时只绘制和更新其中一个。引擎引用当前屏幕。
也可以将屏幕划分为状态。然后状态机或状态机知道在屏幕的特定状态下应该进行何种计算或绘画。
最终你需要某种逻辑(控制流),但我会尝试将逻辑封装到负责某些事情的类中。这样,以后更容易理解和重构游戏。
答案 1 :(得分:0)
您使用逻辑以一种不会影响性能的方式完成您想要做的事情。我不认为这里有问题。
如果这与您的状态机有关,只需确保从其他任何地方切换回状态(标题?)重置布尔值。
只需创建一个条件来决定函数是否运行。这些首次运行的方法存在并且很常见。通常,特别是在java中,您可以在构造函数中执行所有首次运行的东西。但这并不总是可选的或最佳的。
if( shouldInutRun != false ) {
initTitleScreen();
}
答案 2 :(得分:0)
如果您愿意,可以将您的游戏逻辑放在另一个主题上。在小型游戏中计算图形线程上的逻辑是好的,但是如果你的游戏有很多不同的部分,每次都不需要运行,那么你将浪费一些(尽管通常是无关紧要的)CPU能力来检查每个条件。你跑的时间。除此之外,对于游戏的每一步都有一个长达五页的onDraw方法看起来不太好。如果你的游戏有很多逻辑,这也可能会减慢渲染速度,因为系统会等到onDraw()返回之后才会在表面上显示任何内容。
考虑使用一个仅包含图形信息的Scene类,例如需要在哪里绘制的图形信息。从onDraw方法,从Scene类中的信息构造SurfaceView。从游戏逻辑线程,处理用户输入和精灵位置等...并构造/修改Scene对象。
最后一点,我还建议,如果你选择这样做,在绘图线程和逻辑线程之间进行同步,这样你就不会得到任何中途修改过的Scene对象。