前面我们简单的了解下Bevy
的结构等
那么今天我们就来使用Bevy
实现一个小游戏
这里基于文章:Bevy Minesweeper: Introduction - DEV Community (注:由于引擎太年轻,所以处于高速迭代的过程中,有些东西被废弃了,需要自行选择版本)。
另外之所以选择扫雷,是因为我自己以前写过扫雷小游戏,感兴趣的可以看下。
1714080902120/mine-sweeper: designed with Vue (github.com)
不过当时是还在学vue
的时候写的,里面有很多乱七八糟的用法,我看了都想打自己一顿。。
这个小游戏准备分四个部分
inspector gui
)、日志记录等bevy
的状态系统(state system
)和资源实现一个通用插件webAssembly
我们先来创建开发环境
这里为啥要分俩crate
呢?之前我们入门bevy
文章里提到的:bevy
中很多东西都是基于plugin
来实现的,甚至是我们的game
也是plugin
。所以这里我们将主要内容放到这个board_plugin
中是符合规范的。
然后我们来分别给这俩crate
添加依赖
首先是mine_sweeper
的Cargo.toml
这里没有参照官方的文档里给的版本,因为太年轻了,有些东西迭代很快,有些api
都废弃了。
然后是board_plugin
的Cargo.toml
serde - crates.io: Rust Package Registry 用于序列化Rust
中的数据结构。
random - crates.io: Rust Package Registry 这个就不多说了,我们之前用过。
colored - crates.io: Rust Package Registry 类似nodejs
中的color
模块,给打印到终端的数据上色。
bevy-inspector-egui - crates.io: Rust Package Registry 用来侦测bevy
引擎,有些类似vscode
打断点调试时左下角的调用栈。
然后还有一点,我们这里用的workspace
,所以一定要在最外层的Cargo.toml
加上resolver = "2"
,不然找不到路径。
然后这里就配置完了。
然后我们来给mine_sweeper
的main.rs
加点东西
#[cfg(feature = "debug")]
表示这行代码仅用于debug
场景。WindowDescriptor
[2]这个和文档中给的代码使用方式不一样,不能直接用了,得以plugin
的方式注册到app
中。看用法就知道是用来配置窗口信息的,用法见【注释2】需要在WindowPlugin
注册之前配置
Camera2dBundle
[5]:创建一个2d
的camera
。文档压根没有解释。。。Commands
:一个主要的ECS
工具,所有对于世界编辑器(world editing
)system
都可以通过它去创建/删除实体、将组件加到某个实体、移除资源等。spawn
[6]方法是创建一个entity
,也就是一个实体,这个Camera2dBundle::default()
就是一个bundle
。我们可以通过entity.insert
添加component
等。一些之前文章了解过的这里就不解释了。
这里做的事情主要是在初始化环境
bevy
监听模板(debug
时有效)2d
的正交视图camera
(2D orthographic camera
)。这里其实一直有一个疑问我没有提出,就是参数的选择性,我们可以自由添加和选择函数的参数,这和我们之前学的函数参数是必须确定的是不一样的。
对这里我个人的猜测是这个add_system
等方法中带有宏操作。(但从代码的角度来看貌似并没有)
如果有知道的大佬可以评论区说一下,不胜感激!
不过有些参数是只有ECS
才能用的
Commands
[7]**:**一个指令队列可以有效地改变world
。Resources
由Res
[8]或者ResMut
[9]包裹(比如assets
、window
等插入到resource
里的)。Component Queries
: 也就是Query
[10]Event items
:EventWriter
[11]和EventReader
[12]ok
,我们来跑一下
正常,如果你的不正常,请确认包版本是否有问题,尽量多逛下官方github
,看看有没有类似issue
,由于rust
和基于rust
的bevy
以及一些列相关的包都比较年轻,所以迭代可能会出现breaking updates
以及一些包之间兼容性问题。
今天我们主要是初始化环境,没有具体逻辑。
编辑于 2023-02-08 15:01・IP 属地广东