貪吃蛇大做戰!蛇移動的思考與實現! Cocos Creator!

搖桿與蛇移動的結合!文章底部附完整代碼!前端

效果預覽node

搖桿控制器的實現就很少說了,能夠參考KUOKUO寫的 搖桿控制器!Cocos Creator ! 我稍微修改了下,改爲typescript版本了。git

先分析需求,蛇移動有什麼特色?github

蛇身每次移動的軌跡,都是蛇頭移動的軌跡。typescript

以咱們小時候在諾基亞玩的貪吃蛇爲例,能夠看到,移動後,每一個蛇身的位置恰好是該蛇身前面一節的位置編程

因此只要移動到前一個蛇身的位置就能夠了?數組

惋惜並非。微信

那麼爲何會以爲好像是移動一個位置呢?app

由於諾基亞上的貪吃蛇每次移動恰好是一個格子(一節蛇身的長度)。flex

看起來,蛇身的位置和每次移動的距離有關!

因此,能夠用一個數組記錄全部身體要通過的位置點。

假設,蛇的初始狀態是豎直的。

能夠根據蛇的總長度,每次移動的距離,求出全部的移動位置點。

// 蛇總長度const snake_length = SNAKE_CELL_SIZE * this._node_snake_body.length;// 每次移動的距離const snake_move_delta = SNAKE_SPEED * CELL_TIME;// 總共點數const snake_pos_count = Math.ceil(snake_length / snake_move_delta) + 1;this._snake_pos = [];// 初始化位置信息,按照蛇頭的位置往下排for (let index = 0; index < snake_pos_count; index++) { this._snake_pos.push(cc.v2(this.node_snake_head.x, this.node_snake_head.y - index * snake_move_delta));}

如何肯定某個蛇身的位置?根據索引和移動距離以及身體的大小關係能夠求出。

// 每次移動的距離const snake_move_delta = SNAKE_SPEED * CELL_TIME;this._node_snake_body.forEach((s, i) => { // 計算當前身體在位置中的索引 const pos_index = Math.floor((i + 1) * SNAKE_CELL_SIZE / snake_move_delta); const pos = this._snake_pos[pos_index]; s.x = pos.x; s.y = pos.y;})

每次移動後,把移動節點的位置信息放在位置點信息數組的最前端,再從新計算蛇身位置就能夠了。

this.node_snake_head.x += this._snake_vector.x * SNAKE_SPEED * dt;this.node_snake_head.y += this._snake_vector.y * SNAKE_SPEED * dt;this._snake_pos.unshift(cc.v2(this.node_snake_head.x, this.node_snake_head.y));this.updateSnakeBodyPos();this._snake_pos.pop();

以上爲白玉無冰使用 Cocos Creator v2.2.2 開發"搖桿與蛇移動"的技術分享。有什麼想法歡迎留言交流(QQ交流羣 859642112 )!若是這篇對你有點幫助,歡迎分享給身邊的朋友。



雷達圖的一種實現!

分形的奧祕!分形着色器!

笑容逐漸消失?shader 編程入門實戰 !

多邊形裁剪!gizmo 插件入門 !

使用卷積實現各類濾鏡效果!

飄揚的旗幟!shader 編程實戰!

不停歇的球!技術分享!源碼相送!

2019往期精選!附送 github 地址!

原創不易!轉載請保留文末二維碼和完整代碼獲取方式

完整項目  https://github.com/baiyuwubing/cocos-creator-examples/tree/master/snake

點擊閱讀原文查看完整項目

我就知道你「在看」▼


本文分享自微信公衆號 - 白玉無冰(lamyoung-com)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索