Steel教程 - 推一下球

推一下球

目前我们的球在游戏开始运行后受重力而自由落体,这实在是太慢了,玩家可以轻松的接住球。本章我们给球一个初速度来增加一点游戏难度。

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)
        ...
}

编译并运行游戏,应该可以看到球在游戏开始的时候飞了出去。

下一章:游戏失败

上一章:玩家控制

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SSSxCCC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值