我增加了球员和地面之间的碰撞,我想在我和on_ground的比赛中增加一个跳跃技工。但是,每当我尝试添加状态时,它就会完全停止迭代。
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;
}
}
}
}因为某种原因,这个部分不能运行
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;
}
}不过,如果我只这样做的话,它就会奏效:
for mut player in player.iter_mut() {
if collide(
player.translation,
player_size,
ground.translation,
ground_size,
)
.is_some()
{
player.translation.y += GRAVITY;
}
}发布于 2022-08-31 15:00:16
如果只有一个播放器,则可以在查询中使用get_single_mut()而不是iter_mut()。
它返回一个结果,因此您可以轻松地检查您的函数中是否找到了player实体。如果不给自己发送一些很好的调试消息:)
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向其添加新的组件。
https://stackoverflow.com/questions/73552096
复制相似问题