微信小游戏MagnetGame开发(六)主角逻辑

版权声明:本博客属个人原创,转载请注明。 https://blog.csdn.net/qq_33198758/article/details/82191951

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两个状态切换。
这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_33198758/article/details/82191951