不带框架的Android游戏入门

数天的面向对象编程

我迫切需要一种跟踪屏幕上所有道具的方法,所以我说:“每个道具都必须具有位置,尺寸,在每帧更新时更新所有信息的方法以及绘制形状的方法……为什么?我不开设超级班吗?”

那就是我所做的:

  // GameProp.java 
 公共抽象类GameProp { 
TupleFloat的私人位置;
私有的TupleFloat维度;
...
公共无效update(){
...
}
公共无效draw(){
...
}
...
}

然后,我可以编写所有其他扩展此父类的游戏道具:

  • GamePropPlayer
  • GamePropObstacle
  • GamePropBackground
  • GamePropPointsLine

SurfaceView和Canvas,您最好的新朋友❤️

一旦掌握了基本逻辑,就必须展示道具。 那是这些朋友派上用场的地方。

SurfaceView

我创建了“ MySurfaceView”类,该类扩展了基础SurfaceView并覆盖了对创建( surfaceCreated ),更改( surfaceChanged ),销毁( surfaceDestroyed )和触摸输入( onTouchEvent )做出反应的方法。 然后,我编写了一些处理游戏循环的方法:

  // MySurfaceView.java 
 公共类MySurfaceView扩展SurfaceView 
实现SurfaceHolder.Callback {
...
公共同步void startGameLoop(){
...
}
公共同步void stopGameLoop(){
...
}
私人TimerTask getGameLoopTask(){
....
}
...
}

宣布游戏循环的停止和开始已同步,以避免由于同时修改相同的类参数而引起的问题。

帆布

getGameLoopTask”方法返回一个TimerTask,该任务可以每N毫秒异步执行。 任务锁定画布,执行一帧并解锁画布,以显示更改:

  // MySurfaceView.getGameLoopTask() 
 如果(isGameLoopGoing && gameEngine!= null){ 
画布c = getHolder()。lockCanvas();
如果(c!= null){
gameEngine.gameLoop(timeScale,c);
}
尝试{
getHolder()。unlockCanvasAndPost(c);
} catch(Exception e){
//Log.e("Error“,” IllegalState“,e);
}
}

GameEngine.State ==结束? 还没有😐

核心游戏现在已经准备就绪,但是缺少一些用户界面,例如欢迎屏幕和菜单。 因此,我创建了一个“ GameState”父类,该类具有控制游戏特定场景的所有道具的方法。

 公共抽象类GameState { 
  ... 
 公共无效抽奖(画布c){} 
 公共无效更新(float timeScale){} 
 公开同步的boolean onInput(GameInput输入){ 
返回false;
}
  public void onResize(Rect surfaceRect){ 
this.surfaceRect = surfaceRect;
}
  ... 
}

然后,我扩展了该类,以构成我的游戏的所有场景:

  • GameStateStart
  • GameStatePlaying
  • GameStateEnd