2017-2018-1 JaWorld 团队作业--冲刺6(20162308)
实现
- 由于我在冲刺部分负责的是类之间的耦合,所以我就介绍一下本次游戏的总体实现。
- 我们定义了Sprite类,即精灵类,游戏中的飞机、子弹、奖励道具等都是继承自该类,我们通过moveTo()、move()等方法控制精灵的位置,通过beforeDraw()、onDraw()、afterDraw()实现相应的绘图逻辑。
- GameView是我们自定义的View类,由于View只支持单击事件,而不支持双击事件,所以我们自己定义了一个resolveTouchType()方法,通过这个方法可以合成我们自己想要的事件类型,比如双击事件。代码如下:
@Override
public boolean onTouchEvent(MotionEvent event){
//通过调用resolveTouchType方法,得到我们想要的事件类型
//需要注意的是resolveTouchType方法不会返回TOUCH_SINGLE_CLICK类型
//我们会在onDraw方法每次执行的时候,都会调用isSingleClick方法检测是否触发了单击事件
}
//合成我们想要的事件类型
private int resolveTouchType(MotionEvent event){
int touchType = -1;
int action = event.getAction();
touchX = event.getX();
touchY = event.getY();
if(action == MotionEvent.ACTION_MOVE){
long deltaTime = System.currentTimeMillis() - touchDownTime;
if(deltaTime > singleClickDurationTime){
//触点移动
touchType = TOUCH_MOVE;
}
}else if(action == MotionEvent.ACTION_DOWN){
//触点按下
touchDownTime = System.currentTimeMillis();
}else if(action == MotionEvent.ACTION_UP){
//触点弹起
touchUpTime = System.currentTimeMillis();
//计算触点按下到触点弹起之间的时间差
long downUpDurationTime = touchUpTime - touchDownTime;
//如果此次触点按下和抬起之间的时间差小于一次单击事件指定的时间差,
//那么我们就认为发生了一次单击
if(downUpDurationTime <= singleClickDurationTime){
//计算这次单击距离上次单击的时间差
long twoClickDurationTime = touchUpTime - lastSingleClickTime;
if(twoClickDurationTime <= doubleClickDurationTime){
//如果两次单击的时间差小于一次双击事件执行的时间差,
//那么我们就认为发生了一次双击事件
touchType = TOUCH_DOUBLE_CLICK;
//重置变量
lastSingleClickTime = -1;
touchDownTime = -1;
touchUpTime = -1;
}else{
//如果这次形成了单击事件,但是没有形成双击事件,那么我们暂不触发此次形成的单击事件
//我们应该在doubleClickDurationTime毫秒后看一下有没有再次形成第二个单击事件
//如果那时形成了第二个单击事件,那么我们就与此次的单击事件合成一次双击事件
//否则在doubleClickDurationTime毫秒后触发此次的单击事件
lastSingleClickTime = touchUpTime;
}
}
}
return touchType;
}
我们记录MotionEvent.ACTION_DOWN和MotionEvent.ACTION_UP的时间,一次单击事件由ACTION_DOWN和ACTION_UP两个事件合成,假设从ACTION_DOWN到ACTION_UP间隔小于200毫秒,我们就认为发生了一次单击事件。一次双击事件由两个点击事件合成,两个单击事件之间小于300毫秒,我们就认为发生了一次双击事件。在触发了双击事件的时候,我们就会触发炸弹,将屏幕内的敌机都炸毁。当处于ACTION_MOVE状态时,我们就通过event.getX()和event.getY()改变战斗机的位置。
我们还为GameView提供了start()、pause()、resume()和destroy()等方法,使其具备类似于Activity的生命周期,方便在Activity中对GameView进行状态管理。
不足的地方
- 在游戏的设计之初,我们计划设计出多种敌机,并且在游戏过程中有道具奖励。但在实际设计的过程中暂时还没实现。争取在最后一段时间将这个不足弥补。