小编EtT*_*ute的帖子

如何在不消耗它们的情况下读取 Bevy 事件?

我目前正在尝试使用事件在我的 Bevy 游戏中角色跳跃时发出信号。我希望处理玩家输入的系统发送一个JumpedEvent,然后其他系统可以接收它以执行适当的操作(设置正确的玩家动画、速度、声音等),但第一个读取事件的系统会消耗它。

Bevy 是否提供了一种在不消耗事件的情况下读取事件的方法?

这是我当前的代码:

// Sends a JumpedEvent when the jump key is pressed
fn player_jump_event_system(
    keyboard_input: Res<Input<KeyCode>>,
    mut jump_events: ResMut<Events<JumpedEvent>>,
    mut query: Query<(&Controlled, &mut Jumps)>,
) {
    for (controlled, mut jumps) in &mut query.iter() {
        if keyboard_input.just_pressed(controlled.jump)
            && jumps.jumps_remaining > 0
        {
            jumps.jumps_remaining -= 1;
            jump_events.send(JumpedEvent {
                jump_number: jumps.max_jumps - jumps.jumps_remaining,
            });
        }
    }
}

// This system consumes the JumpedEvent that was sent
fn control_player_jump_system(
    jump_events: ResMut<Events<JumpedEvent>>,
    mut jump_event_listener: ResMut<JumpedEventListener>,
    mut query: Query<(&Controlled, &mut …
Run Code Online (Sandbox Code Playgroud)

rust bevy

6
推荐指数
1
解决办法
685
查看次数

如何在 Bevy 中翻转 spritesheet

我试图根据玩家是在屏幕上向左还是向右移动来翻转精灵。我目前修改 SpriteSheetComponents 变换的方法如下,似乎根本没有改变精灵:

  fn player_direction_system(
      velocity: &Velocity,
      _: &FaceMovementDirection,
      mut transform: Mut<Transform>,
  ) {
      let flip = velocity.horizontal.signum();
      transform.value = transform.value * Mat4::from_scale(Vec3::unit_y() * flip);
  }
Run Code Online (Sandbox Code Playgroud)

我应该修改精灵的不同组件以翻转它吗?

rust bevy

4
推荐指数
1
解决办法
420
查看次数

在 Goroutine 中等待管道 io.Copy 时发生死锁

在下面的代码中,对的调用io.Copy永远不会返回;它只是无限期地阻塞,导致死锁。io.Pipe仅当使用 来连接read io.Reader时,才会出现此行为os.Stdout io.Writer。但是,我需要使用管道,因为在我的完整代码中,我使用io.MultiWriterwith io.Pipes 将一个函数连接io.Reader到多个需要io.Reader.

func main() {
    read := strings.NewReader("abcdefghij")
    pipeReader, pipeWriter := io.Pipe()

    var wg sync.WaitGroup
    wg.Add(1)
    go func() {
        println("Start copy")
        _, err := io.Copy(os.Stdout, pipeReader)
        if err != nil {
            println(err.Error())
        }
        println("End copy")
        wg.Done()
    }()

    _, err := io.Copy(pipeWriter, read)
    if err != nil {
        println(err.Error())
    }

    wg.Wait()
}

Run Code Online (Sandbox Code Playgroud)

输出:

Start copy
abcdefghij
fatal error: all goroutines are asleep …
Run Code Online (Sandbox Code Playgroud)

go goroutine

2
推荐指数
1
解决办法
325
查看次数

标签 统计

bevy ×2

rust ×2

go ×1

goroutine ×1