Bevy、贪吃蛇,与一些记录

发表于: 2/6/2023

Bevy

Rust

本文基于 Creating a Snake Clone in Rust, with Bevy

仓库地址 a_snake

:::default 代码现已更新到 0.10

Window 现已成为 Entity,不在存在曾经的问题 :::

与源文中的一些区别

除了使用更高版本的Bevy以外1,主要改动在于没有使用Resource保存SnakeSegmentsLastTailPosition,而是保存在了SnakeHead中。 个人认为这两个数据不是很适合作为Resource,蛇身的实体ID与之前的尾部位置都是与蛇关联着的数据, 如果有多条蛇存在的话 故存储到蛇头的组件中。

对于源文的“作业”

  1. 蛇的180°转向 思路有二,其一是使用Events,snake_movement_input中不再直接修改head.direction而改为发送事件,发送前清空未处理的事件,在snake_movement中接收事件修改direction;其二也雷同,不使用Events,另外存储next_direction即可。
  2. 食物可以生成在蛇身上 遍历所有SnakeSegment(其实也应该包含Food)的位置,重复则重新生成随机位置(或者直接return)。 不过食物最好应当在上一个被吃掉后再生成,屏幕填满不知道是否会卡住呢? 其实更好的方法似乎有两个,碰撞检测,不过在当前版本的Bevy中尚不支持Physics;或是存储网格矩阵,检测grid[i][j]中是否有物体,如果不用引擎实现游戏的话,该方法是很自然的选择。

尚存在的一些小问题

关闭窗口时会由于使用了Res<Windows>->get_primary().unwrap()unwrap先抛出导致整个窗口卡住。(偶尔可以正常退出)

Footnotes

  1. WindowDescripter不再直接可用于Resource