Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 创建一个简单的游戏引擎_Java_Android - Fatal编程技术网

Java 创建一个简单的游戏引擎

Java 创建一个简单的游戏引擎,java,android,Java,Android,我正在进行我的第一个游戏,所有的设计和东西都完成了,只剩下编码了。 我已经成功地观看了万维网的教程,其中包含有关图形以及如何在其中成功创建线程同步的信息 就像现在我有一个SurfaceView类和一个Thread类。thread类使用此构造函数从我的SurfaceView类接收游戏引擎。 线程类构造函数中的简单代码: public Thread(SurfaceHolder localsurfaceHolder, Context context, Handler handl

我正在进行我的第一个游戏,所有的设计和东西都完成了,只剩下编码了。 我已经成功地观看了万维网的教程,其中包含有关图形以及如何在其中成功创建线程同步的信息

就像现在我有一个SurfaceView类和一个Thread类。thread类使用此构造函数从我的SurfaceView类接收游戏引擎。 线程类构造函数中的简单代码:

    public Thread(SurfaceHolder localsurfaceHolder,
    Context context,
    Handler handler, 
    SurfacefView localEngine) {

    surfaceHolder = localsurfaceHolder;
    this.handler = handler;
    this.context = context;
    engine = localEngine;
}
从surfaceCreated方法中的我的SurfaceView类:

thread = new GameThread(getHolder(), context, new Handler(), this);
还有我的代码,当创建曲面时,它将开始触发线程

现在来看真正的交易。很快,我想要一个游戏引擎,是完全从视图分离。问题是,;如何做到这一点?GameEngine类构造函数应该是什么样子?我应该把绘图/计算方法放在哪里?游戏引擎是什么

现在我的GameEngine类看起来像:

package com.myname.mygame;

public class GameEngine {

      //If im right, a constructor for the engine should be placed here
      //How and which parameters shall I change and send with from the view

}
提前谢谢

GameEngine类构造函数应该是什么样子

一个常见的模式是拥有一个facade类,该类为视图提供方法。这将是UI的主要控制类,因此任何更新模型状态的命令都将通过该类。因为您通常只需要一个实例,所以在这里单例是有用的

public class GameEngine {
    private static GameEngine instance = null;

    private GameEngine(){
       // init stuff here
    }

    public static GameEngine getInstance(){
       if(instance == null){
          instance = new GameEngine();
       }
       return instance;
    }
}
然后,控制类还将对象从核心传递回用户接口,用户接口可以通过getter方法访问。我不是说你必须这样做,这只是一种松散耦合的方式

我应该把图纸/计算方法放在哪里

计算运动、碰撞、人工智能和我在模型中加入的东西。这取决于你画的东西。为了更好的可移植性和内聚性,我通常会将这些东西放在视图中


玩得开心。

谢谢你的回答!我知道我应该把我的东西放在哪里。但是getInstance,当实例为空时,它只是第一次加载东西吗?还有一件事,为了以正确的方式触发和更新对象,我仍然不理解我必须建立的连接。例如,我应该如何在thread类中连接我的游戏引擎?当您第一次调用getInstance()时,它会运行该类的构造函数一次,因此对它的任何进一步调用都只使用现有模型。要连接引擎,只要在需要访问模型时从接口调用getInstance()。或者,当您第一次调用它时,您可以在接口中存储对它的引用。希望这有道理。我想我现在明白了。然后我还将必要的计算/绘制函数放入GameEngine,然后放入线程类,例如GameEngine.getInstance().calculateNow();访问GameEngine calculateNow()方法。是吗?是的,就是这样。正如我所说,我可能会在UI中保留绘图例程以实现内聚。此外,如果您要经常调用游戏引擎方法,那么最好存储对它的引用,因为调用它会有一点开销。内聚基本上意味着执行的任务与类的预期功能密切相关,视图中的类通常负责显示内容,而模型处理的是内部力学。此外,绘制方法设计用于图形环境,并且往往依赖于图形环境。比如说,如果您想移植您的模型以使用不同的图形库,那么您就不必重构模型中的代码。存储对facade的引用可以避免不必要地调用getInstance。