Android线程麻烦缠绕我的头围绕devise

我无法围绕游戏devise进行包装。 在Android平台上,我有一个活动,并设置其自定义表面视图的内容视图。 自定义表面视图作为我的面板,我创建所有类的实例,并在那里做所有的绘图和计算。

问题:我应该在我的活动中创建其他类的实例吗?

现在我创建一个处理游戏循环的自定义线程类。

问题:我如何在我所有的活动中使用这一课? 或者我每次都必须创建一个扩展的线程类的单独的实例吗?

在我之前的游戏中,我有多个级别必须创建线程类的实例,并且在线程类中,我必须为每个单独的级别设置构造函数方法,并在循环中使用switch语句来检查它需要呈现的级别并更新。 对不起,如果这听起来很混乱。

我只想知道我使用的方法效率低下(可能是这样),以及如何正确devise它。 我已经阅读了很多教程,并且对于这个特定的主题仍然有很多麻烦。 也许链接到一些教程,解释这个? 谢谢。

我强烈建议你使用渲染线程(使用Canvas / OpenGL ESCanvas可能更容易设置)以及游戏线程。

要实际“加载”游戏,您可以创建一个GameEngine类,并将其作为应用程序的中心点。 当您的渲染器准备就绪时,您可以创建对GameEngine实例的callback,该实例将使用Runnable为渲染创建并启动两个线程,为游戏逻辑运行另一个Runnable

示例代码:

申请开始

 private GameEngine engine; private CanvasRenderer renderer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Create instances of your two Runnable classes and pass that into // the GameEngine constructor. // Create an instance of the game engine. engine = new GameEngine(canvasRunnable, gamelogicRunnable); renderer = new CanvasRenderer(this, engine); setContentView(renderer); } 

CanvasRenderer

 private GameEngine engine; // Save your instance from the GameEngine reference in your constrcutor and make // a global initializion for your GameEngine instance. @Override public void surfaceCreated(SurfaceHolder holder) { // One time setup here. // When your view is ready, make this callback to the // GameEngine. engine.surfaceIsReady(); } 

GameEngine

 private Thread canvasThread; private CanvasRunnable canvasRunnable; // You should be able to figure out how to create a second thread // where you should put your game logic. :) // Constructor stuff like creating instances of your threads // and passing references as you wish to those. // Don't start the threads here. // Remember to set references from your Runnable's into your Thread's // instances here! /** * Callback. Now your renderer is ready and you * can start your threads. */ public void surfaceIsReady() { thread.setName("Canvas"); thread.start(); // Same for game logic. } 

通常情况下,你的游戏循环在一个Activity中是独立的。

当你切换活动,你暂停/杀死你的游戏循环。 单独的活动应该对应于暂停游戏(例如,因为您已经切换到“发送电子邮件给朋友”或“主菜单”活动)

对于额外的级别,你不应该创建或破坏任何新的线程…除非你切换到“级完成,加载下一级,请等待”活动,你将不得不重新启动“主游戏“无论如何,活动。 但即使在这种情况下,你并没有真正做出“额外”的线程,你只是在一个Activity中创建一个线程,然后依次查杀/重新启动/终止/重新启动…等Activity。 每次级别完成。

如果你懂德语, 这个教程是非常好的。

对于英语我可以推荐这个教程

关于线程类:我不知道是否真的有必要在应用程序中引用所有的类。 在我的游戏中,我是​​这样解决的:

负责绘制主GUI的类具有重写渲染方法。 在这个方法中,调用一个线程类来更新所有的GUI元素并处理用户input。

线程也负责维持一个固定的帧率。 根据你正在开发的游戏,这可能是重要的。