Android游戏开发之飞行射击类游戏原理实现(二十)
Android游戏开发之飞行射击类游戏原理实现
![](http://hi.csdn.net/attachment/201108/9/0_1312896700YDMf.gif)
雨松MOMO原创文章如转载,请注明:转载自雨松MOMO的博客原文地址:http://blog.csdn.net/xys289187120/article/details/6673940
![](http://hi.csdn.net/attachment/201108/9/0_1312896700YDMf.gif)
1.地图滚动的原理实现
举个简单的例子吧,同学们都坐过火车吧,坐火车的时候都遇到过自己的火车明明是停止的但是旁边铁轨的火车在向后行驶,会有一种错觉感觉自己的火车是在向前行驶吧,呵呵。飞行射击类游戏的地图原理和这个完全一样。玩家在控制飞机在屏幕中飞行的位置,背景图片一直向后滚动从而给玩家一种错觉自己控制的飞机在向前飞行,如下图所示两张地图图片在屏幕背后交替滚动,这样就会给玩家产生向前移动的错觉。
![](http://hi.csdn.net/attachment/201108/9/0_1312898299j3C7.gif)
2.触摸屏幕控制主角飞机的移动范围
用手触摸屏幕中的任意一个点, 程序可以得到当前点的X , Y坐标 。 以当前飞机的X Y坐标为中心计算出当前飞机X,Y坐标点与目标X,Y点的距离 。因为飞机不可能直接就飞到目标点所以分别依次对当前坐标X,Y相加一次飞机移动的步长。 这里我们须要考虑飞机移动过程中玩家停止触摸屏幕,如果停止触摸飞机将原地停住不在向目标点移动,直到新的目标点出线即玩家新触摸屏幕的X,Y坐标。
![](http://hi.csdn.net/attachment/201108/9/0_1312898905f1e0.gif)
4、主角飞机子弹的实现原理与敌机的碰撞
因为子弹的数量会有很多,敌机的数量也会很多, 所以每一颗子弹须要用一个对象来记录这当前子弹的X,Y坐标 与在屏幕中的绘制区域,每一架敌机也是一个对象,也记录着它的X,Y坐标与在屏幕中的绘制区域,这样在处理碰撞的时候其实就是每一颗子弹的矩形区域 与每一架敌机的矩形区域的碰撞。通过遍历子弹对象与敌机对象就可以计算出碰撞的结果,从而拿到碰撞的敌机对象播放死亡爆炸动画。
说到这里有些同学可能会想如果按照这样的思路将会频繁的创建子弹对象与敌机对象这样会造成内存泄漏等严重的问题。仔细想一下屏幕中须要绘制的子弹数量与敌机数量肯定是有限的,我们可以初始化固定的子弹对象与敌机对象 只对这些对象进行更新逻辑与绘制 ,举个例子 当前游戏屏幕中我最多须要5架敌机,代码中我就只分配5个敌机对象,分别检测这些对象 如果被子弹打中 或者向下超过屏幕底边,这时候可以对这个对象进行属性的重置,让这架飞机从新出现在上方的战场上,这样就实现在不增加飞机对象的情况下让玩家感觉有打不完的飞机,子弹对象同理。
因为子弹的数量会有很多,敌机的数量也会很多, 所以每一颗子弹须要用一个对象来记录这当前子弹的X,Y坐标 与在屏幕中的绘制区域,每一架敌机也是一个对象,也记录着它的X,Y坐标与在屏幕中的绘制区域,这样在处理碰撞的时候其实就是每一颗子弹的矩形区域 与每一架敌机的矩形区域的碰撞。通过遍历子弹对象与敌机对象就可以计算出碰撞的结果,从而拿到碰撞的敌机对象播放死亡爆炸动画。
说到这里有些同学可能会想如果按照这样的思路将会频繁的创建子弹对象与敌机对象这样会造成内存泄漏等严重的问题。仔细想一下屏幕中须要绘制的子弹数量与敌机数量肯定是有限的,我们可以初始化固定的子弹对象与敌机对象 只对这些对象进行更新逻辑与绘制 ,举个例子 当前游戏屏幕中我最多须要5架敌机,代码中我就只分配5个敌机对象,分别检测这些对象 如果被子弹打中 或者向下超过屏幕底边,这时候可以对这个对象进行属性的重置,让这架飞机从新出现在上方的战场上,这样就实现在不增加飞机对象的情况下让玩家感觉有打不完的飞机,子弹对象同理。
![](http://hi.csdn.net/attachment/201108/9/0_1312899511d5mT.gif)
简单敌机类实现 敌人有两个状态 一个是生存状态 一个是死亡状态 代码中根据当前状态播放动画。
简单子弹类实现
这里推展一下知识,游戏中会有不同的敌人与不同的子弹,我们可以拓展一下对象类,那敌机来说 在对象类中可以声明一个飞机类型的成员变量 在绘制与更新敌机的时候可以根据敌机类型做相应的处理,比如敌机的绘制图片、飞行轨迹 、弹道AI、都可以根据它来实现。
这里在说一下代码设计模式中的工厂模式,工厂模式初学者会可能会觉得一头雾水,但不可否认它的抽象原理 可以让我们的代码变的拓展性更好。举个例子 比如游戏开发中我们需要3个玩家职业 A 弓箭手 B 斧头手 C魔法师 ,首先我们分析一下这3个职业的特点 它们的共同点为都需要控制人物行走点击攻击按钮播放攻击特效等, 它们的不同点为 弓箭手 攻击为射箭 、斧头手攻击为近身砍怪 、魔法师则为远程魔法攻击。工厂模式的原理为将他们的共同点拿出来 写在一个类中,这个类就是一个工厂类, 然后让他们三个分别去继承这个类 ,分别在自己的类中实现自己特殊的方法。 这样设计代码的话会使代码拓展性更佳,因为可以非常方便的添加和删除一个职业。不会因为可变因素修改大量代码导致项目Delay。
当然好东西可定会有它的弊端,因为使用工厂模式我们会写很多拓展类,这样无疑会增加大量的对象与调用方法等等,从运行效率上会大打折扣,所以开发者在设计代码的时候就要好好斟酌自己的代码如何来设计。
这里在说一下代码设计模式中的工厂模式,工厂模式初学者会可能会觉得一头雾水,但不可否认它的抽象原理 可以让我们的代码变的拓展性更好。举个例子 比如游戏开发中我们需要3个玩家职业 A 弓箭手 B 斧头手 C魔法师 ,首先我们分析一下这3个职业的特点 它们的共同点为都需要控制人物行走点击攻击按钮播放攻击特效等, 它们的不同点为 弓箭手 攻击为射箭 、斧头手攻击为近身砍怪 、魔法师则为远程魔法攻击。工厂模式的原理为将他们的共同点拿出来 写在一个类中,这个类就是一个工厂类, 然后让他们三个分别去继承这个类 ,分别在自己的类中实现自己特殊的方法。 这样设计代码的话会使代码拓展性更佳,因为可以非常方便的添加和删除一个职业。不会因为可变因素修改大量代码导致项目Delay。
当然好东西可定会有它的弊端,因为使用工厂模式我们会写很多拓展类,这样无疑会增加大量的对象与调用方法等等,从运行效率上会大打折扣,所以开发者在设计代码的时候就要好好斟酌自己的代码如何来设计。
![](http://hi.csdn.net/attachment/201108/9/0_13129023662X3Z.gif)
初始化游戏 在这里将代码中须要的所有资源所有对象全部初始化,也就是说游戏中不会在分配新对象内存。
更新游戏 更新2张背景地图坐标点,分别遍历子弹与敌机对象更新它们的逻辑
在漂亮的语言不如普通实用的代码片段,老规矩每篇文章都会附带源代码,最后如果你还是觉得我写的不够详细 看的不够爽 不要紧我把源代码的下载地址贴出来 欢迎大家一起讨论学习雨松MOMO希望可以和大家一起进步。
下载地址:http://download.csdn.net/source/3506841
下载地址:http://download.csdn.net/source/3506841