推一下球
目前我们的球在游戏开始运行后受重力而自由落体,这实在是太慢了,玩家可以轻松的接住球。本章我们给球一个初速度来增加一点游戏难度。
Ball组件
首先写一个Ball组件吧:
#[derive(Component, Edit, Default)]
struct Ball {
start_velocity: Vec2,
#[edit(limit = "Limit::ReadOnly")]
started: bool,
}
我们将给球的初速度存在start_velocity成员变量中,以便在编辑器中随时更改,其类型是Vec2,因为速度是一个矢量,这个矢量同时定义了速度的方向和大小。我们还有一个bool类型的started成员变量,用来记录我们是否已经给了球初速度,防止我们多次对球设置初速度。started变量可不需要在编辑器里面修改,因此我们可以给它加上edit属性,其中设置limit为Limit::ReadOnly,从而使得这个变量在编辑器中是只读的。
Ball组件写好了后记得在SteelApp中注册一下:
#[no_mangle]
pub fn create() -> Box<dyn App> {
SteelApp::new()
...
.register_component::<Ball>()
...
}
再次点击顶部菜单的“Project -> Compile”按钮编译一下,就可以在编辑器中为Ball实体添加Ball组件了,并设置start_velocity的值,例如(8, 16)。
推球系统push_ball_system
接下来写一个给球初速度的系统push_ball_system:
fn push_ball_system(
mut ball: ViewMut<Ball>,
rb2d: View<RigidBody2D>,
mut physics2d_manager: UniqueViewMut<Physics2DManager>,
) {
for (ball, rb2d) in (&mut ball, &rb2d).iter() {
if !ball.started {
if let Some(rb2d) = physics2d_manager.rigid_body_set.get_mut(rb2d.handle()) {
rb2d.set_linvel(ball.start_velocity.into(), true);
ball.started = true;
}
}
}
}
我们通过查找同时有Ball组件和RigidBody2D组件的实体来找到我们的球,如果started为false,说明我们还未对其设置初速度,则设置一个初速度,并将started设为true保证下次不再设置速度了。
push_ball_system也在Schedule::Update中运行即可:
#[no_mangle]
pub fn create() -> Box<dyn App> {
SteelApp::new()
...
.add_system(Schedule::Update, push_ball_system)
...
}
编译并运行游戏,应该可以看到球在游戏开始的时候飞了出去。