数天的面向对象编程
我迫切需要一种跟踪屏幕上所有道具的方法,所以我说:“每个道具都必须具有位置,尺寸,在每帧更新时更新所有信息的方法以及绘制形状的方法……为什么?我不开设超级班吗?”
那就是我所做的:
// GameProp.java
公共抽象类GameProp {
TupleFloat的私人位置;
私有的TupleFloat维度;
...
公共无效update(){
...
}
公共无效draw(){
...
}
...
}
然后,我可以编写所有其他扩展此父类的游戏道具:
- GamePropPlayer
- GamePropObstacle
- GamePropBackground
- GamePropPointsLine
- …
SurfaceView和Canvas,您最好的新朋友❤️
一旦掌握了基本逻辑,就必须展示道具。 那是这些朋友派上用场的地方。
- 如何在Android Studio中使用自定义视图创建板/网格
- 使用Zenobia水肺潜水模拟器探索真正的残骸
- CS373春季2019:Jesus Martinez
- Google印度挑战奖学金,旅程开始
- 精益启动技术介绍
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