坏蛋Dan
知乎@坏蛋Dan
发布时间:2024.1.4

前言

昨天我们成功将我们的瓦片图渲染到窗口里

坏蛋Dan:rust基础学习--基于Bevy实现扫雷小游戏day3

今天我们继续实现这个小游戏


上色

我们距离扫雷demo还剩下一部分:交互。

不过今天我们先不做这一块,我们来完善下之前做的东西。

现在我们的瓦片长得太难看了,并且后面还会被变成炸弹,也要支持插旗,所以我们还需要一些静态资源。

资源下载地址:assets · master · Qonfucius / Minesweeper Tutorial · GitLab

这些资源得放到mine_sweeper里,和src同级,这个是相对路径的默认规则。

加完静态资源之后,我们回到board_plugin/src/lib.rs中,找到create_board方法,我们新增一个参数asset_server

assets翻译过来是断言,但是前端中这个文件夹里的东西一般我自己叫做静态资源,所以我这里就沿用了,静态资源(assets)和资源(resources)是俩不同的东西,虽然assets也是Resources的一种。

接着我们创建三个component,用来表示炸弹、炸弹邻居以及空瓦片。

回到board_plugin/src/component文件夹里,创建bomb.rs、bomb_neighbor.rsuncover.rs三个文件

然后在component/mod.rs中将它们导出

这一块内容相当的繁琐,尤其是用于侦测的,你可以自己搞个宏简化写法(我自己试了一天多,跪了,后面有必要把macro那篇文档的学习提前了)。

最后我们在main.rs中引入并注册到app里,这样才能被侦测到

不过想了下,其实我们并不需要放在main.rs中,因为这块类型注册实际上也算是业务逻辑相关的,所以应该放到board_plugin/src/lib.rs中的build方法中,这样就不会污染main.rs了。

这样就舒服很多了。

接着我们来尝试把这些assets渲染到窗口上。

现在我们窗口上的瓦片都是灰色的,我们来给它们上色。

之前我们也有上色的逻辑,但是那是输出在终端的。

回到lib.rs中,新增一个method

这个方法很简单,就是给炸弹邻居们上色

  • Text2dBundle:看名字就知道了,一堆和Text相关的component组合体。

我们把上色的字放在这个瓦片的中间。

这里有一点需要注意,那就是Transformz轴这里给了1.,这样文案才不会被覆盖。

然后我们回到create_board的方法中,在之前给瓦片上色的地方。

为了让代码结构更清晰,先不接入上色代码,我们先来把这块逻辑迁移到另一个方法中。

注意,不是BoardPluginmethod,是关联函数,或者你直接拿出来当做function也不是不行,不过后面有些写法需要调整。

抽出来之后我们再回到create_board方法中替换原来的代码

资源加载一般放到方法的顶部,确保资源的正常加载。

ok,现在我们可以来接入上色逻辑了。

回到我们的spawn_tiles方法中。

之前我们是无差别上色,现在我们可以match匹配分别上色。

如果是炸弹就给它上张图,而炸弹邻居则是不同颜色的数字。

注意,这里的炸弹图和文字都是实体,层级在瓦片下。

那么这里就上色完毕了,我们来运行下cargo run

你也可以--features debug看下component检测是否正常。


代码

这里只放lib.rs的,其它没多大改变。


总结

莫得。

参考

  1. ^Bevy Minesweeper: Tiles and Components https://dev.to/qongzi/bevy-minesweeper-part-4-2co9

编辑于 2023-02-12 12:40・IP 属地广东