Android开源 - 仿微信打飞机游戏

123z113 8年前
   <h2>游戏说明</h2>    <ol>     <li>飞机一直发射子弹,用手指滑动可以改变飞机的位置</li>     <li>不同的敌机抗击打能力不同,当敌机被击中一定子弹数量时会爆炸,爆炸有动画效果</li>     <li>每隔一段时间都会有双发子弹或炸弹等道具奖励</li>     <li>获得双发子弹之后,子弹变为双发</li>     <li> <p>获得炸弹道具之后,可以通过双击将屏幕内的所有敌机炸毁</p> <p><a href="/misc/goto?guid=4959675988306121910"><img alt="这里写图片描述" src="https://simg.open-open.com/show/385ded8dee7998c6e7244938416b65e9.png"></a></p> <p> </p> </li>    </ol>    <h2>实现</h2>    <ul>     <li> <p>我们定义了<code>Sprite</code>类,即精灵类,游戏中的飞机、子弹、奖励道具等都是继承自该类,我们通过moveTo()、move()等方法控制精灵的位置,通过beforeDraw()、onDraw()、afterDraw()实现相应的绘图逻辑。精灵类及其子类继承如下所示:</p> <p><a href="/misc/goto?guid=4959675988399562332"><img alt="这里写图片描述" src="https://simg.open-open.com/show/dd2424dff5ab88dc05c70320dbff7cfd.png"></a></p> </li>     <li> <p>GameView是我们自定义的View类,主要重写了<code>onDraw()</code>和<code>onTouchEvent()</code>方法。onDraw()源码如下所示:</p> <pre>  <code>@Override  protected void onDraw(Canvas canvas) {      //我们在每一帧都检测是否满足延迟触发单击事件的条件      if(isSingleClick()){          onSingleClick(touchX, touchY);      }        super.onDraw(canvas);        if(status == STATUS_GAME_STARTED){          drawGameStarted(canvas);      }else if(status == STATUS_GAME_PAUSED){          drawGamePaused(canvas);      }else if(status == STATUS_GAME_OVER){          drawGameOver(canvas);      }  }  </code></pre> <p>在某一时刻GameView有三种状态:游戏开始STATUS_GAME_STARTED、游戏暂停STATUS_GAME_PAUSED和游戏结束STATUS_GAME_OVER。在不同的状态下我们会调用不同的绘制方法,这几个方法中都会调用方法<code>postInvalidate()</code>,这样驱动着View不断重绘,进而不断调用<code>onDraw()</code>方法实现游戏的动态效果。关于绘图技巧,可以参见另一篇博文<a href="http://www.open-open.com/lib/view/open1447941223259.html">《Android中Canvas绘图基础详解(附源码下载)》</a>。</p> </li>     <li> <p>我们也重写了GameView的<code>onTouchEvent()</code>方法。由于View只支持单击事件,而不支持双击事件,所以我们自己定义了一个<code>resolveTouchType()</code>方法,通过这个方法可以合成我们自己想要的事件类型,比如双击事件。我们记录<code>MotionEvent.ACTION_DOWN</code>和<code>MotionEvent.ACTION_UP</code>的时间,一次单击事件由ACTION_DOWN和ACTION_UP两个事件合成,假设从ACTION_DOWN到ACTION_UP间隔小于200毫秒,我们就认为发生了一次单击事件。一次双击事件由两个点击事件合成,两个单击事件之间小于300毫秒,我们就认为发生了一次双击事件。在触发了双击事件的时候,我们就会触发炸弹,将屏幕内的敌机都炸毁。当处于ACTION_MOVE状态时,我们就通过<code>event.getX()</code>和<code>event.getY()</code>改变战斗机的位置。关于<code>MotionEvent</code>的详细信息可以参另一篇博文<a href="http://www.open-open.com/lib/view/open1470468705188.html">《Android中TouchEvent触摸事件机制》</a>。</p> </li>     <li> <p>我们还为GameView提供了start()、pause()、resume()和destroy()等方法,使其具备类似于Activity的生命周期,方便在Activity中对GameView进行状态管理。</p> </li>     <li> <p>小敌机类,体积小,抗打击能力低;中敌机类,体积中等,抗打击能力中等;大敌机类,体积大,抗打击能力强。当敌机销毁的时候,我们使用了爆炸效果,使用了如下的图片: <a href="/misc/goto?guid=4959675988523129806"><img alt="这里写图片描述" src="https://simg.open-open.com/show/eb1589093a5e3736ae49acafb2b72107.jpg"></a></p> <p>这张图片演示了爆炸从开始到结束14个阶段的效果图,我们用两帧绘制爆炸的一个阶段,这样完整绘制一个爆炸效果需要28帧,在绘制完最后一个阶段之后,<code>Explosion</code>类会销毁自己。</p> </li>    </ul>    <p> </p>