0

I have a node bundle like this:

 commands.spawn((
        NodeBundle {
            style: Style {
                position_type: PositionType::Absolute,
                height: Val::Px(100.0),
                width: Val::Px(100.0),
                ..Default::default()
            },
            transform: Transform::from_translation(Vec3::ZERO),
            visibility: Visibility::Visible,
            background_color: BackgroundColor(Color::BLACK),
            ..Default::default()
        },
        Node {
            x: 0,
            y: 0,
            kind: NodeKind::Player,
        },
    ));

and I want to move this node:

fn move_node(
    mut node: Query<(&mut Transform, &mut Node)>,
    keyboard_input: Res<ButtonInput<KeyCode>>,
) {
    let (mut transform, mut node) = node.single_mut();
    if keyboard_input.pressed(KeyCode::KeyD) {
        transform.translation.x += 100.0;
    } else if keyboard_input.pressed(KeyCode::KeyS) {
        transform.translation.y += 100.0;
    } else if keyboard_input.pressed(KeyCode::KeyA) {
        transform.translation.x -= 100.0;
    } else if keyboard_input.pressed(KeyCode::KeyW) {
        transform.translation.y -= 100.0;
    }
}

but I find that I just can not move it ? I am new to bevy, could anyone help me, thanks a lot !! move node

1 Answer 1

2

I believe the layout for UI nodes are continually re-calculated. The Transform is kept in-sync after the fact so it effectively read-only. Your changes are just being overridden when the UI is rendered.

So if you want to move it, you should do so by modifying the Style - probably with the left and top fields though it uses CSS-based layouts that can be much more complicated.

style: Style {
    position_type: PositionType::Absolute,
    left: Val::Px(100.0),
    top: Val::Px(100.0),
    height: Val::Px(100.0),
    width: Val::Px(100.0),
    ..Default::default()
}
fn move_node(
    mut node: Query<(&mut Style, &mut Node)>,
    keyboard_input: Res<ButtonInput<KeyCode>>,
) {
    let (mut style, mut node) = node.single_mut();
    if keyboard_input.pressed(KeyCode::KeyD) {
        if let Val::Px(left) = &mut style.left {
            *left += 10.0;
        }
    } else if keyboard_input.pressed(KeyCode::KeyS) {
        if let Val::Px(top) = &mut style.top {
            *top += 10.0;
        }
    } else if keyboard_input.pressed(KeyCode::KeyA) {
        if let Val::Px(left) = &mut style.left {
            *left -= 10.0;
        }
    } else if keyboard_input.pressed(KeyCode::KeyW) {
        if let Val::Px(top) = &mut style.top {
            *top -= 10.0;
        }
    }
}

Note: I see this is for you own Node with NodeKind::Player; its probably a bad idea to use UI components for the core of your game. There are plenty of examples for doing 2d games.

1
  • It works ! thanks so much, i am a newer to game dev, so i think the ui node firstly, I would try other components nextly
    – Edgar
    Commented Jul 9 at 11:53

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.