[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);
},
下次說一說吃子吧~