首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >每当我试图在常春藤0.8.1中添加状态时,iter_mut()就不会运行

每当我试图在常春藤0.8.1中添加状态时,iter_mut()就不会运行
EN

Stack Overflow用户
提问于 2022-08-31 07:09:58
回答 1查看 54关注 0票数 2

我增加了球员和地面之间的碰撞,我想在我和on_ground的比赛中增加一个跳跃技工。但是,每当我尝试添加状态时,它就会完全停止迭代。

代码语言:javascript
复制
fn collision_detection(
    ground: Query<&Transform, (With<Ground>, Without<Player>)>,
    mut player: Query<(&mut Transform, &mut PlayerStatus), With<Player>>,
) {
    let player_size = Vec2::new(PLAYER_SIZE_X, PLAYER_SIZE_Y);
    let ground_size = Vec2::new(GROUND_SIZE_X, GROUND_SIZE_Y);

    for ground in ground.iter() {
        for (mut player, mut status) in player.iter_mut() {
            if collide(
                player.translation,
                player_size,
                ground.translation,
                ground_size,
            )
            .is_some()
            {
                status.on_ground = true;
                println!("ON GROUND")
            } else {
                status.on_ground = false;
            }
            if status.on_ground {
                player.translation.y += GRAVITY;
            }
        }
    }
}

因为某种原因,这个部分不能运行

代码语言:javascript
复制
for (mut player, mut status) in player.iter_mut() {
            if collide(
                player.translation,
                player_size,
                ground.translation,
                ground_size,
            )
            .is_some()
            {
                status.on_ground = true;
                println!("ON GROUND")
            } else {
                status.on_ground = false;
            }
            if status.on_ground {
                player.translation.y += GRAVITY;
            }
        }

不过,如果我只这样做的话,它就会奏效:

代码语言:javascript
复制
for mut player in player.iter_mut() {
    if collide(
        player.translation,
        player_size,
        ground.translation,
        ground_size,
    )
    .is_some()
    {
        player.translation.y += GRAVITY;
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-31 15:00:16

如果只有一个播放器,则可以在查询中使用get_single_mut()而不是iter_mut()

它返回一个结果,因此您可以轻松地检查您的函数中是否找到了player实体。如果不给自己发送一些很好的调试消息:)

代码语言:javascript
复制
if let Ok((mut player, mut status)) = player.get_single_mut() {
    // do your collision check
} else {
    // player not found in the query
}

https://docs.rs/bevy/latest/bevy/prelude/struct.Query.html#method.get_single_mut

编辑:查看上面的评论:如果您有一个已经生成的实体,您可以使用.insert_bundle.insert向其添加新的组件。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73552096

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档