发表于: 2/6/2023
本文基于 Creating a Snake Clone in Rust, with Bevy
仓库地址 a_snake
:::default 代码现已更新到 0.10
Window 现已成为 Entity,不在存在曾经的问题 :::
与源文中的一些区别
除了使用更高版本的Bevy以外1,主要改动在于没有使用Resource保存SnakeSegments
、LastTailPosition
,而是保存在了SnakeHead
中。
个人认为这两个数据不是很适合作为Resource,蛇身的实体ID与之前的尾部位置都是与蛇关联着的数据, 如果有多条蛇存在的话 故存储到蛇头的组件中。
对于源文的“作业”
- 蛇的180°转向
思路有二,其一是使用Events,
snake_movement_input
中不再直接修改head.direction
而改为发送事件,发送前清空未处理的事件,在snake_movement
中接收事件修改direction
;其二也雷同,不使用Events,另外存储next_direction
即可。 - 食物可以生成在蛇身上
遍历所有
SnakeSegment
(其实也应该包含Food
)的位置,重复则重新生成随机位置(或者直接return)。 不过食物最好应当在上一个被吃掉后再生成,屏幕填满不知道是否会卡住呢? 其实更好的方法似乎有两个,碰撞检测,不过在当前版本的Bevy中尚不支持Physics;或是存储网格矩阵,检测grid[i][j]
中是否有物体,如果不用引擎实现游戏的话,该方法是很自然的选择。
尚存在的一些小问题
关闭窗口时会由于使用了Res<Windows>
->get_primary().unwrap()
unwrap先抛出导致整个窗口卡住。(偶尔可以正常退出)
Footnotes
-
WindowDescripter不再直接可用于Resource ↩