1. 主角行为分析
- 主角状态
主角要能根据触摸切换S和N两种状态。
- 主角位置
主角只在两个状态之间切换,并不需要运动,因此位置固定。
2. 主角脚本控制
第一步:
创建游戏场景gamescence,添加游戏背景图片,调整节点合适位置。
第二步:
创建两个NMagnetPlayer和SMagnetPlayer预制体,作为主角的两种动作状态。关于预制体创建请参考预制体创建与销毁。
第三步:
创建两个NMagnetPlayer和SMagnetPlayer脚本,分别绑定到NMagnetPlayer和SMagnetPlayer预制体预制体中。
第四步:
创建一个Game脚本,并将其添加到gamescence中的canvas组件中。
第五步:
往Game脚本中添加触摸控制逻辑函数,并在onLoad里初始化。设定一个bool型的Flag,N,当屏幕触摸时,改变N的值。
// 触摸控制:
setInputControl: function () {
var self = this;
//add keyboard input listener to jump, turnLeft and turnRight
cc.eventManager.addListener({
event: cc.EventListener.KEYBOARD,
// 键盘输入
onKeyPressed: function(keyCode, event) {
switch(keyCode) {
case cc.KEY.a:
if(self.N){
self.N=false;
}
else{
self.N=true;
}
break;
}
},
onKeyReleased: function(keyCode, event) {
switch(keyCode) {
case cc.KEY.a:
//释放动作
break;
}
}
}, self.node);
//触摸输入
cc.eventManager.addListener({
event: cc.EventListener.TOUCH_ONE_BY_ONE,
onTouchBegan: function(touch, event) {
var touchLoc = touch.getLocation();
if(self.N){
self.N=false;
}
else{
self.N=true;
}
return true;
},
onTouchEnded: function(touch, event) {
}
}, self.node);
},
第六步:
往Game脚本中添加SMagnetPlayerPrefab和 NMagnetPlayerPrefab预制体属性,并在Canvas中的Game脚本属性中分别给他们绑定预先制作的游戏预制体资源。绑定方法具体参见链接。
properties: {
SMagnetPlayerPrefab: {//S预制体
default: null,
type: cc.Prefab
},
NMagnetPlayerPrefab: {//M预制体
default: null,
type: cc.Prefab
},
},
第七步:
往Game脚本中的onLoad()函数中添加以下代码,创建两个NodePool。
this.NMagnetPlayerPool = new cc.NodePool('NMagnetPlayer');
this.SMagnetPlayerPool = new cc.NodePool('SMagnetPlayer');
第八步:
往Game脚本中添加spawnNMagnetPlayer()和 spawnSMagnetPlayer函数用来分别创建一个N状态的主角和S状态的主角,添加despawnNMagnetPlayer()和despawnSMagnetPlayer()用来销毁N状态主角和S状态主角。
注意:node.getComponent(‘NMagnetPlayer’).init(this)这段代码是在NMagnetPlayer脚本中初始化此脚本,为了在NMagnetPlayer脚本中调用用Game脚本中的变量和函数例如,要根据N的值改变主角的状态,可以在NMagnetPlayer脚本中调用Game脚本的N变量,然后在NMagnetPlayer脚本中产生或者销毁NMagnetPlayer预制体。
spawnNMagnetPlayer: function() {//N预制体产生
var scene = cc.director.getScene();
var node = null;
// 使用给定的模板在场景中生成一个新节点
if (this.NMagnetPlayerPool.size() > 0) {
node = this.NMagnetPlayerPool.get(this); //
} else {
node = cc.instantiate(this.NMagnetPlayerPrefab);
}
node.parent = scene;
node.setPosition(this.node.width/2,this.node.height/4);
node.getComponent('NMagnetPlayer').init(this);//在NMagnetPlayer脚本中初始化此脚本,为了在NMagnetPlayer脚本中调用用Game脚本中的变量和函数
},
despawnNMagnetPlayer (NMagnet) { //N预制体销毁
this.NMagnetPlayerPool.put(NMagnet);
},
spawnSMagnetPlayer: function() {//S预制体产生
var scene = cc.director.getScene();
var node = null;
// 使用给定的模板在场景中生成一个新节点
if (this.SMagnetPlayerPool.size() > 0) {
node = this.SMagnetPlayerPool.get(this); //
} else {
node = cc.instantiate(this.SMagnetPlayerPrefab);
}
node.parent = scene;
node.setPosition(this.node.width/2,this.node.height/4);
node.getComponent('SMagnetPlayer').init(this);//在SMagnetPlayer脚本中初始化此脚本,为了在NMagnetPlayer脚本中调用用Game脚本中的变量和函数
},
despawnSMagnetPlayer (NMagnet) { //S预制体销毁
this.SMagnetPlayerPool.put(NMagnet);
},
第九步:
编写NMagnetPlayer脚本。init()函数用来初始化Game脚本。在Game脚本的spawnNMagnetPlayer()函数中的node.getComponent(‘NMagnetPlayer’).init(this);代码会调用此方法。在update()函数中判断Game脚本中N的值,如果假,则调用Game中的函数销毁当前的NMagnetPlayer预制体,产生一个新的SMagnetPlayer预制体。显然SMagnetPlayer脚本中的逻辑要与其相反。
cc.Class({
extends: cc.Component,
game: {
default: null,
serializable: false
}
},
onLoad () {
this.enabled = false;
},
init: function (game) {//初始化Game脚本
this.game = game;
this.enabled = true;
},
reuse (game) {
this.init(game);
},
start () {
},
update (dt) {
//逻辑与SMagnetPlayer相反
if(this.game.N){//如果N为true
}
else{//如果N为false
this.game.despawnNMagnetPlayer(this.node);//销毁NNMagnetPlayer预制体
this.game.spawnSMagnetPlayer();//产生SMagnetPlayer预制体
}
},
});
第十步:
编写SMagnetPlayer脚本。init()函数用来初始化Game脚本。在Game脚本的spawnSMagnetPlayer()函数中的node.getComponent(‘SMagnetPlayer’).init(this)代码会调用此方法。在update()函数中判断Game脚本中N的值,如果真,则销毁当前的SMagnetPlayer预制体,产生一个新的NMagnetPlayer预制体。逻辑要与NMagnetPlayer脚本相反。
cc.Class({
extends: cc.Component,
properties: {
game: {
default: null,
serializable: false
}
},
onLoad () {
this.enabled = false;
},
//初始化Game脚本
init: function (game) {
this.game = game;
this.enabled = true;
},
reuse (game) {
this.init(game);
},
start () {
},
update (dt) {
//逻辑与NMagnetPlayer相反
if(this.game.N){
this.game.despawnSMagnetPlayer(this.node);//销毁SNMagnetPlayer预制体
this.game.spawnNMagnetPlayer();//产生NMagnetPlayer预制体
}
}
},
});
效果图
按下屏幕后,主角在N和S两个状态切换。