代码案例实现,飞机移动,发射子弹,自动产生敌机,敌机发射子弹等,脚本简单,代码可执行
,代码注释明显
FlyBgMoveScript脚本源码设计:
cc.Class({
extends: cc.Component,
properties: {
speed: { type: cc.Integer, default: 1 },
bg1: { type: cc.Node, default: null },
bg2: { type: cc.Node, default: null },
pre_enemy: { type: cc.Prefab, default: null },//预制体敌机
pre_enemyBullet: { type: cc.Prefab, default: null },//预制体敌机子弹
bz: { type: cc.AudioClip, default: null },//爆炸音效
},
onLoad () {
window.enemy = this;//设置全局变量
//敌机对象池
this.enemyPool = new cc.NodePool();
//敌机子弹对象池
this.enemyBulletPool = new cc.NodePool();
var manager = cc.director.getCollisionManager(); // 获取碰撞检测类
manager.enabled = true //开启碰撞检测
manager.enabledDebugDraw = false //显示碰撞检测区域
this.createTimes = 0;
},
start () {
},
update (dt) {
let self = this;
this.createTimes++;
if (this.createTimes == 60) {
this.createTimes = 0;
}
if (this.createTimes == 0) {
this.createEnemy();
}
self.bg1.y = self.bg1.y - self.speed;
self.bg2.y = self.bg2.y - self.speed;
if (self.bg1.y <= -384) {
self.bg1.y = 1152;
}
if (self.bg2.y <= -384) {
self.bg2.y = 1152;
}
},
createEnemy () {
var enemy = null;
let self = this;
if (this.enemyPool.size() > 0) { // 通过 size 接口判断对象池中是否有空闲的对象
//console.log(‘对象池取预制体’);
enemy = this.enemyPool.get();
} else {
enemy = cc.instantiate(this.pre_enemy);
}
enemy.position = new cc.Vec2(this.EnemyBirthPosition(), 768);
cc.director.getScene().addChild(enemy);
},
onEnemyKilled: function (enemy) {
// bullet 应该是一个 cc.Node
let self = this;
cc.audioEngine.play(self.bz, false, 1);
self.enemyPool.put(enemy);
//加载爆炸预制体
cc.resources.load(“prefab/bom”, function (err, prefab) {
if (!prefab) {
console.log(‘爆炸预制体为空’);
} else {
console.log(‘爆炸预制体加载’);
var bom = cc.instantiate(prefab);
bom.position = new cc.Vec2(enemy.position.x, enemy.position.y);
cc.director.getScene().addChild(bom);
var animat = bom.getComponent(cc.Animation);
animat.play(‘bom’);
var anim1 = animat.getAnimationState(‘bom’);
if (anim1) {
anim1.on(‘finished’, (event) => {
bom.destroy()
}, this);
}
}
});
},
onEnemyKilled2: function (enemy) {
// bullet 应该是一个 cc.Node
let self = this;
cc.audioEngine.play(self.bz, false, 1);
self.enemyPool.put(enemy);
},
//初始化敌人飞机位置
EnemyBirthPosition () {
var chars = [67, 134, 201, 268, 335, 402];
var res = 67;
var id = Math.ceil(Math.random() * 5);
res = chars[id];
return res;
},
createBulletEnemy (enemyNode) {
var enemyBullet = null;
let self = this;
if (this.enemyBulletPool.size() > 0) { // 通过 size 接口判断对象池中是否有空闲的对象
//console.log('对象池取预制体');
enemyBullet = this.enemyBulletPool.get();
} else {
enemyBullet = cc.instantiate(this.pre_enemyBullet);
}
enemyBullet.position = new cc.Vec2(enemyNode.x, enemyNode.y);
cc.director.getScene().addChild(enemyBullet);
},
onBulletKilled: function (bullet) {
// bullet 应该是一个 cc.Node
this.enemyBulletPool.put(bullet); // 和初始化时的方法一样,将节点放进对象池,这个方法会同时调用节点的 removeFromParent
}
});
FlyMoveScript玩家脚本设计如下:
cc.Class({
extends: cc.Component,
properties: {
speed: { type: cc.Integer, default: 1 },
bg1: { type: cc.Node, default: null },
bg2: { type: cc.Node, default: null },
pre_enemy: { type: cc.Prefab, default: null },//预制体敌机
pre_enemyBullet: { type: cc.Prefab, default: null },//预制体敌机子弹
bz: { type: cc.AudioClip, default: null },//爆炸音效
},
onLoad () {
window.enemy = this;//设置全局变量
//敌机对象池
this.enemyPool = new cc.NodePool();
//敌机子弹对象池
this.enemyBulletPool = new cc.NodePool();
var manager = cc.director.getCollisionManager(); // 获取碰撞检测类
manager.enabled = true //开启碰撞检测
manager.enabledDebugDraw = false //显示碰撞检测区域
this.createTimes = 0;
},
start () {
},
update (dt) {
let self = this;
this.createTimes++;
if (this.createTimes == 60) {
this.createTimes = 0;
}
if (this.createTimes == 0) {
this.createEnemy();
}
self.bg1.y = self.bg1.y - self.speed;
self.bg2.y = self.bg2.y - self.speed;
if (self.bg1.y <= -384) {
self.bg1.y = 1152;
}
if (self.bg2.y <= -384) {
self.bg2.y = 1152;
}
},
createEnemy () {
var enemy = null;
let self = this;
if (this.enemyPool.size() > 0) { // 通过 size 接口判断对象池中是否有空闲的对象
//console.log(‘对象池取预制体’);
enemy = this.enemyPool.get();
} else {
enemy = cc.instantiate(this.pre_enemy);
}
enemy.position = new cc.Vec2(this.EnemyBirthPosition(), 768);
cc.director.getScene().addChild(enemy);
},
onEnemyKilled: function (enemy) {
// bullet 应该是一个 cc.Node
let self = this;
cc.audioEngine.play(self.bz, false, 1);
self.enemyPool.put(enemy);
//加载爆炸预制体
cc.resources.load(“prefab/bom”, function (err, prefab) {
if (!prefab) {
console.log(‘爆炸预制体为空’);
} else {
console.log(‘爆炸预制体加载’);
var bom = cc.instantiate(prefab);
bom.position = new cc.Vec2(enemy.position.x, enemy.position.y);
cc.director.getScene().addChild(bom);
var animat = bom.getComponent(cc.Animation);
animat.play(‘bom’);
var anim1 = animat.getAnimationState(‘bom’);
if (anim1) {
anim1.on(‘finished’, (event) => {
bom.destroy()
}, this);
}
}
});
},
onEnemyKilled2: function (enemy) {
// bullet 应该是一个 cc.Node
let self = this;
cc.audioEngine.play(self.bz, false, 1);
self.enemyPool.put(enemy);
},
//初始化敌人飞机位置
EnemyBirthPosition () {
var chars = [67, 134, 201, 268, 335, 402];
var res = 67;
var id = Math.ceil(Math.random() * 5);
res = chars[id];
return res;
},
createBulletEnemy (enemyNode) {
var enemyBullet = null;
let self = this;
if (this.enemyBulletPool.size() > 0) { // 通过 size 接口判断对象池中是否有空闲的对象
//console.log('对象池取预制体');
enemyBullet = this.enemyBulletPool.get();
} else {
enemyBullet = cc.instantiate(this.pre_enemyBullet);
}
enemyBullet.position = new cc.Vec2(enemyNode.x, enemyNode.y);
cc.director.getScene().addChild(enemyBullet);
},
onBulletKilled: function (bullet) {
// bullet 应该是一个 cc.Node
this.enemyBulletPool.put(bullet); // 和初始化时的方法一样,将节点放进对象池,这个方法会同时调用节点的 removeFromParent
}
});