1. 程式人生 > >[JavaScript] CocosCreator 中國象棋 —— 棋子移動

[JavaScript] CocosCreator 中國象棋 —— 棋子移動

之前想用cocos2dx開發這個遊戲來著,真是太Naive了。我掌握的C++生得髮指,這裡啥都看不懂那裡一片紅波浪,好不容易倒退了一百步解決了一執行又是迷之錯誤,再加上之前那個i3 2G的辣雞電腦李時珍的皮,打開個vs十分鐘,進去就是未響應呵呵噠。dagala,我投入CocosCreator+js的懷抱了,一天完成了之前所有的工作(微笑)。

真心推薦Cocoscreator,但缺點是網上資料不是很多,所以呢在這記錄一下在編寫指令碼時的滯礙,希望能拋磚引玉添磚加瓦。

官方手冊:http://docs.cocos.com/creator/manual/zh/getting-started/index.html

    onLoad: function () {
        
        this.node.on(cc.Node.EventType.TOUCH_MOVE, function (event) {
            var delta = event.touch.getDelta();
            this.x += delta.x;
            this.y += delta.y;
        }, this.node);

        this.node.on(cc.Node.EventType.TOUCH_END, function () {
            
        }, this.node);
        
    },

這樣棋子就可以拖動了。

但是有一個問題,棋類的移動要卡到某一個點上,而不是沒有拘束的亂放,這個怎麼處理呢,可能是我不靈光,我感覺這個是值得討論的,但單獨提出這個問題解決方案的資料很少。我看到五子棋有用prefab的,老實說我沒看懂,也不敢肯定用在種類比較多的象棋上是否合適,所以說一說我研究的方法吧。

我想可以用演算法算位置的。思路是先記下起始位置_x,_y;再考慮:怎麼拖動當然是玩家的自由了,所以不能以此判定象棋的著陸點,故在TOUCH_END裡也就是滑鼠或觸控離開螢幕時算出象棋應落位置;得到離開螢幕前也就是拖動的最後一刻象棋的位置即this.x,this.y;這兩者相減再除以每個格子的長和寬求出走了多少格子,再用check_x,check_y進行校正,校正方法是四捨五入得到在x軸和y軸分別走了多少整數格;再利用check_x,check_y,_x,_y得到應當著陸的位置;同時配合棋子的走法,主要利用check_x,check_y判定它是否能到達,不者則回到原位。

這裡面牽扯到大量變數的使用,所以注意好變數的作用域很關鍵,而且js變數的宣告只有var型別,容易想當然,建議一個變數存一個數,關鍵處用console.log(),隨時監測。附紅方兵的指令碼的onLoad。

    onLoad: function () {

        var change_x,change_y;
        var _x,_y;
        var self=this;
        
        this.node.on(cc.Node.EventType.TOUCH_MOVE, function (event) {
            this.opacity = 160;
            if(flag==0){
                flag=1;
                _x=this.x;
                _y=this.y;
            }
            var delta = event.touch.getDelta();
            this.x += delta.x;
            this.y += delta.y;
            change_x=this.x-_x;
            change_y=this.y-_y;
            // console.log(change_x);
            // console.log(change_y);
        }, this.node);

        this.node.on(cc.Node.EventType.TOUCH_END, function () {
            var dis_x=60;
            var dis_y=56.667;
            this.opacity = 255;
            var check_x=Math.round(change_x/dis_x);
            var check_y=Math.round(change_y/dis_y);

            //出框檢查
            if(self.loc_i+check_y>9||self.loc_i+check_y<0||self.loc_j+check_x>8||self.loc_j+check_x<0){
                this.x=_x;
                this.y=_y;
                check_x=0;
                check_y=0;
            }
            //走法
            else{
                if(check_y==1&&check_x==0){
                    this.x=_x+check_x*dis_x;
                    this.y=_y+check_y*dis_y;
                }
                else if((check_x==1||check_x==-1)&&check_y==0&&self.crossriver==true){
                    this.x=_x+check_x*dis_x;
                    this.y=_y+check_y*dis_y;
                }
                else{
                    this.x=_x;
                    this.y=_y;
                    check_x=0;
                    check_y=0;
                }
                self.loc_i+=check_y;
                self.loc_j+=check_x;
            }
            
            flag=0;//flag類外宣告,用來判定,儲存
            var chessPos = this.getPosition();
            //console.log(chessPos.x);
            
            if(self.loc_i>4) self.crossriver=true;//過河屬性
            // console.log(self.loc_i);
        }, this.node);
        
    },

下次說一說吃子吧~