贪吃蛇大做战!蛇移动的思考与实现! 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源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索