1. 程式人生 > >揹包系統的製作

揹包系統的製作

在一款RPG遊戲中購買裝備是必須實現的,建立揹包系統的時候需要注意的就是。建立揹包時必須區分揹包的ID和道具配置表的ID。設定揹包ID的作用就是區別當前點選的道具的唯一性。給所以揹包的屬性都存在一個數組中。

   GameAction.addItem(4,1);

    //-----------------------------------
    addItem:function(itemId,itemNum){
        var that = this
        var newItem = {
            id:(that._itemId++),
            type:itemId,
            num:itemNum,
        }
        GameData.bag.push(newItem)
    },

這裡是建立一個揹包的基本屬性。屬性包括揹包的ID值。還有道具的種類ID還有就是道具的數量。

 //開始遍歷揹包陣列呼叫載入預製件方法
    pub_beganloadProp:function(){
        var ob = GameData.bag
        for(var index in ob){
            this._beganloadpropPfb(ob[index]);
        }
    },

開始建立揹包。遍歷揹包中所有的屬性。

 //載入預製件方法
    _beganloadpropPfb:function(ob){
        var
that = this; this.oldweapon = ob.type; cc.loader.loadRes("prefab/prop", function (err, propprefab) { var newPropNode = cc.instantiate(propprefab); //that._addSpriteFrameToContainer(newPropNode.getChildByName('propSprite').getComponent(cc.Sprite), ob.pic); newPropNode.getComponent("itme"
).pub_setPfbInfo(ob); that.propLayer.getChildByName('laoutNode').addChild(newPropNode); }) },

載入預製件並且呼叫預製件腳本里面的方法。設定道具的基本資訊。

//設定預製件資訊
    pub_setPfbInfo:function(ob){
        this._data = ob;
        this.typeId = ob.type;
        this.node.getChildByName('numLabel').getComponent(cc.Label).string  = this._data.num;
        this._addSpriteFrameToContainer(this.node.getChildByName('propSprite').getComponent(cc.Sprite), GameData.prop[ob.type].pic);
        this.node.on(cc.Node.EventType.TOUCH_START,this._setSelectHand.bind(this));
        //------------------------------------接收自定義事件---------------------------------------------------------
        var that = this;
        var node = cc.find("UIScript")
        node.on(GameEvent.propAction,function(event){
            var data  = event.getUserData()[0];
            if(data != that._data.id && that.Select){                
                that._setSelectHand();
            }
        }) 
        //----------------------------------更新顯示--------------------------------------------------------------------
        node.on(GameEvent.useItemAction,function(event){
            var data  = event.getUserData();
            if(data==that._data.id){
                that._data.num--;
                that.node.getChildByName('numLabel').getComponent(cc.Label).string = that._data.num;
                if(that._data.num <= 0){
                    that._data.num = 0;
                    GameData.bag.splice(GameData.bag.indexOf(that._data.id),1);
                    //cc.log("xxxxxxxxx",that._data.id-1,GameData.bag)
                    that.node.removeFromParent(true);
                    node.getComponent("prop").removeInfo();
                }
            }
        })
    },
    //選擇狀態的方法
    _setSelectHand:function(){
        this.Select = !this.Select;
        this.node.getChildByName('cheoseSprite').active = this.Select
        if(this.Select){
            var proptypeId = new cc.Event.EventCustom(GameEvent.propAction, false) 
            proptypeId.setUserData([this._data.id,this.typeId,this._data.obId]);
            cc.log(this._data.id,"------------------------------------")
            cc.find('UIScript').dispatchEvent(proptypeId);
            cc.find('UIScript').getComponent("prop").setbuybtn(this._data);
        }
    },

在揹包系統中涉及到選中和非選中的兩個狀態。在這個揹包系統中在與預製件中設定了一個外部的選擇框預設是隱藏的狀態。在載入預製件的時候設定選中框的active屬性為false。封裝成一個選中方法。當點選之後會呼叫這個方法。方法裡面先是給選中的邏輯鎖取反。如果當前是false取反就是true。然後讓選中框的active的屬性等於邏輯所。這樣就實現了第一次點選選中。再點選取消選中的功能。當一個道具被選中之後就丟擲一個自定義事件。丟擲的是揹包的ID值。並且在同一個類中對這個事件進行處理。接到這個當前揹包ID值判斷時候和現在點選的揹包ID是否相同,如果不相同並且當前的為選中狀態。就再次呼叫選中的方法。就可以實現點選一個道具之後再選中另一個道具的時候。取消之前的選中到當前選中上。