Cocos2d-js 3.0开发的简单飞机游戏

这个社区已经有这代码,可惜不是3.0的,放在3.0的还是出现了不少问题

弄了几天总算出了3.0版本的

图片似乎无法上传

开发环境很工具

Cocos2d-JS-v3.0-API,框架
cocos-code-ide-win32-1.0.0-final,绿色版开发工具
python-2.7.8.msi

我就放代码上来吧

var HelloWorldLayer = cc.Layer.extend({
plane:null,
_bullets:],
_targets:],

ctor:function () {
this._super();
// 获得游戏屏幕尺寸
var size = cc.winSize;
//获取屏幕可视区域起始坐标
var origin = cc.director.getVisibleOrigin();

//添加背景
this.sprite = new cc.Sprite(res.s_bg01);
// 将飞机设置在屏幕底部,居中的位置
// 图片的锚点在矩形的中心点,设置的就是这个点的位置
this.sprite.attr({
x: size.width / 2,
y: size.height / 2,
anchorX: 0.5,
anchorY: 0.5
});
this.addChild(this.sprite, 0);

// 创建一个飞机,游戏中大部分物体都能使用cc.Sprite表示
// 飞机的图案按照cc.rect(x,y,width,height)从图片中截取
// 以(x,y)为左上角,width为宽,height为高的矩形
this.plane = new cc.Sprite(res.s_Plane,cc.rect(7,198,92,97));
// 将飞机设置在屏幕底部,居中的位置
// 图片的锚点在矩形的中心点,设置的就是这个点的位置
this.plane.attr({
x: origin.x + size.width/2,
y: origin.y + this.plane.getContentSize().height/2,
anchorX: 0.5,
anchorY: 0.5
});
this.addChild(this.plane,1);

//创建触摸事件
var listener1 = cc.EventListener.create({
event: cc.EventListener.TOUCH_ONE_BY_ONE,
swallowTouches: true,
onTouchBegan: function (touch, event) {
var target = event.getCurrentTarget();

var locationInNode = target.convertToNodeSpace(touch.getLocation());
var s = target.getContentSize();
var rect = cc.rect(0, 0, s.width, s.height);

if (cc.rectContainsPoint(rect, locationInNode)) {
cc.log("sprite began… x = " + locationInNode.x + ", y = " + locationInNode.y);

return true;
}
return false;
},
onTouchMoved: function (touch, event) {
var target = event.getCurrentTarget();
var delta = touch.getDelta();
target.x += delta.x;
target.y += delta.y;
},
onTouchEnded: function (touch, event) {
var target = event.getCurrentTarget();
cc.log("sprite onTouchesEnded… ");
target.setOpacity(255);
}
});

//绑定触摸事件
cc.eventManager.addListener(listener1, this.plane);

this.schedule(this.addBullet, 0.3); // 每0.3秒更新一次addBullet方法

// 添加增加敌机的定时器
this.schedule(this.addTarget,0.4);

// 添加碰撞检测,不加第二个参数,默认为每帧执行一次
this.schedule(this.updateGame);

return true;

},

//添加敌机
addTarget:function(){

var target = new cc.Sprite(res.s_Plane,cc.rect(119,238,92,58));
target.setTag(1);

var winSize = cc.winSize;

// 设置敌机随机出现的X轴的值
var minX = target.getContentSize().width/2;
var maxX = winSize.width - target.getContentSize().width/2;
var rangeX = maxX - minX;
var actualX = Math.random() * rangeX + minX;
// 在一定范围内随机敌机的速度
var minDuration = 2.5;
var maxDuration = 4;
var rangeDuration = maxDuration - minDuration;
var actualDuration = Math.random() * rangeDuration + minDuration;

target.setPosition(cc.p(actualX, winSize.height + target.getContentSize().height/2));

var actionMove = cc.MoveTo.create(actualDuration ,cc.p(actualX, 0 - target.getContentSize().height));
var actionMoveDone = cc.CallFunc.create(this.spriteMoveFinished,this);

target.runAction(cc.Sequence.create(actionMove,actionMoveDone));

this.addChild(target,1);
this._targets.push(target);
},

//添加子弹
addBullet:function(){
//获取屏幕尺寸
var size = cc.winSize;
//获取屏幕可视区域起始坐标
var origin = cc.director.getVisibleOrigin();

//获得飞机位置
var myplane = this.plane.getPosition();
//cc.log(myplane.x.toString());//测试控制台输出结果

//子弹穿越屏幕要花费的秒数
var bulletDuration = 1;

//添加子弹
var bullet = new cc.Sprite(res.s_Plane,cc.rect(47,187,13,6));
// 根据飞机的位置,初始化子弹的位置
// 图片的锚点在矩形的中心点,设置的就是这个点的位置
bullet.attr({
x: myplane.x,
y: myplane.y+this.plane.getContentSize().height / 2,
anchorX: 0.5,
anchorY: 0.5
});

// 一个移动的动作
// 第一个参数为移动到目标所需要花费的秒数,为了保持速度不变,需要按移动的距离与屏幕高度按比例计算出花费的秒数
var actionMove = cc.MoveTo.create(bulletDuration * ((size.height - myplane.y - bullet.getContentSize().height / 2) / size.height),
cc.p(myplane.x,origin.y + size.height + bullet._getHeight()/2));
// 设置一个回调函数,移动完毕后回调spriteMoveFinished()方法。
var actionMoveDone = cc.CallFunc.create(this.spriteMoveFinished,this);
// 让子弹执行动作
bullet.runAction(cc.Sequence.create(actionMove,actionMoveDone));
// 为子弹设置标签,以后可以根据这个标签判断是否这个元素为子弹
bullet.setTag(6);

//添加子弹到数组,以便删除函数调用删除
this._bullets.push(bullet);

//添加子弹到这个层上
this.addChild(bullet,0);
},

//更新游戏
updateGame:function(){
var targets2Delete = ];

var i ;
// 获得我飞机的碰撞矩形
var myPlane = this.plane.getBoundingBox();
//遍历屏幕上的每个敌机
for( i in this._targets ){
//console.log(“targetIterator”);
var target = this._targets i ];
// 获得敌机的碰撞矩形
var targetRect = target.getBoundingBox();
if(cc.rectIntersectsRect(myPlane, targetRect)){
console.log(“GameOver”);
var gameOverScene = GameOverLayer.create();// 创建结束场景
cc.Director.getInstance().replaceScene(new cc.TransitionProgressRadialCCW(1.2,gameOverScene)); // 场景转换代码
}

var bullets2Delete = ];
// 对于每个敌机,遍历每个屏幕上的子弹,判断是否碰撞
for(i in this._bullets){
var bullet = this._bullets i ];
var bulletRect = bullet.getBoundingBox();
// 判断两个矩形是否碰撞
if(cc.rectIntersectsRect(bulletRect,targetRect)){
// 碰撞则将子弹加入待删除列表
bullets2Delete.push(bullet);
}
}
// 如果待删除的子弹数组的内容大于零,说明敌机碰到了子弹,将敌机加入待删除数组
if(bullets2Delete.length > 0){
targets2Delete.push(target);
}

//删除发生碰撞的每个子弹
for(i in bullets2Delete){
var bullet = bullets2Delete i ];
var index = this._bullets.indexOf(bullet);
if (index > -1) {
this._bullets.splice(index, 1);
}
this.removeChild(bullet);
}

bullets2Delete = null;
}
//删除发生碰撞的每个敌机
for( i in targets2Delete){
var target = targets2Delete i ];

var index = this._targets.indexOf(target);
if (index > -1) {
this._targets.splice(index, 1);
}

this.removeChild(target);
}

targets2Delete = null;

},

//移除出边界元素(子弹和敌机)
spriteMoveFinished:function(sprite){
// 将元素移除出Layer
this.removeChild(sprite, true);
if(sprite.getTag()==1){
// 把目标从数组中移除
var index = this._targets.indexOf(sprite);
if (index > -1) {
this._targets.splice(index, 1);
}
} else if(sprite.getTag()==6){
// 把子弹从数组中移除
var index = this._bullets.indexOf(sprite);
if (index > -1) {
this._bullets.splice(index, 1);
}
}
}
});

//定义结束场景
var GameOverLayer = cc.LayerColor.extend({
init:function(){
this._super();
//设置背景颜色
this.setColor(cc.color(126, 126, 126, 126));
var winSize = cc.winSize;
var _label = cc.LabelTTF.create(“GameOver”,“Arial”, 60);
_label.setPosition(cc.p(winSize.width / 2,winSize.height / 2));
this.addChild(_label);
return true;
}
});

//实现结束场景的创建方法
GameOverLayer.create = function(){
var gameOverLayer = new GameOverLayer;
if(gameOverLayer && gameOverLayer.init()){
return gameOverLayer;
}
return null;
}

var HelloWorldScene = cc.Scene.extend({
onEnter:function () {
this._super();

    var layer = new HelloWorldLayer();
    this.addChild(layer);
}

});

楼主可不可以提供源码呀