飞机游戏是有使用类的封装那么各种判定都需要使用自定义事件的抛出和接收
分别用于 我方飞机抛出实时坐标给子弹定位初始位置
敌方飞机抛出坐标给我方子弹检测碰撞事件
敌方飞机抛出坐标给子弹定位初始位置
敌方飞机抛出坐标给我方飞机定位检测碰撞
敌方子弹抛出坐标给我方飞机定位检测碰撞
然后在检测碰撞的位置抛出事件给爆炸效果一个坐标,并且移除掉这个碰撞的物体。
那么整个游戏的逻辑就基本完成了
所有功能实现都是利用一个位置抛出然后接一个特效
难点 在于事件管理 因为数据的抛出需要及时移除 不然不断刷新和碰撞检测会导致资源浪费和检测已经碰撞过却没有移除掉碰撞检测的物体造成的BUG
层级 因为层级显示问题 需要调整好层级规划
//背景层
var gradient = new backGroundLayer();
this.addChild(gradient);
//我方子弹层
var zidan = new ZidanPlaneLayer();
this.addChild(zidan);
//敌方飞机层
var difanF = new EnEmyPlaneLayer();
this.addChild(difanF);
//敌方子弹层
var difanzi = new EnenyshotLayer();
this.addChild(difanzi);
//道具层
var prop = new StrangeLayer();
this.addChild(prop);
//我方飞机层
var myPlane = new MyPlane();
this.addChild(myPlane);
//爆炸效果层
var boom = new BoomLayer();
this.addChild(boom);
//分数层
var mark = new MarkLayer();
this.addChild(mark);
this._btn();
this._wenben()
不能有其他东西覆盖掉一些东西 所以层级很重要 还有就是检测碰撞的频率需要把握 如果频率快那么就会导致资源浪费很多
每个对象分了三个层去描述,一个类用来生成一个对象,一个层用来调用这个对象并且给它赋予属性动作初始位置等,然后最后一个把所有的层在显示在舞台上并且调好层级。
栗子:
var Enemyshot = cc.Sprite.extend({
ctor : function() {
this._super(“res/dizi.png”);
this._init();
},
_init : function(){
//设定敌方飞机的位移
var move = cc.moveBy(4,cc.p(0, -cc.winSize.height-20))
//清除超过屏幕的敌方子弹
this.runAction(cc.sequence(move, cc.callFunc(this.removeBullet, this)));
//定时器抛出事件产生敌人子弹与我方飞机的碰撞事件
this.schedule(this._difan, 0.04, cc.REPEAT_FOREVER);
},
_difan:function(){
cc.eventManager.dispatchCustomEvent(GAME_DATA.USER_DIRENZI, this)
},
removeBullet:function (target) {
target.removeFromParent(true)
}
});
var EnenyshotLayer = cc.Layer.extend({
zidan:null,
ctor:function () {
this._super();
this._init();
},
_init: function() {
this.zidan=cc.eventManager.addCustomListener(GAME_DATA.USER_DIZIDAN, this.location.bind(this))
},
location:function(event){
var date =event.getUserData();
var bullet = new Enemyshot();
this.addChild(bullet);
bullet.setPosition(date.x,date.y-20)
},
onExit:function(){
cc.eventManager.removeListener(this.zidan);
}
});
分类管理使用自定义事件来完成这个项目,优缺点很明显。