|
@@ -36,7 +36,8 @@ fact that the player can move diagonally by pressing two keys at the same time.
|
|
|
|
|
|
Add a script to the kinematic body and add the following code:
|
|
|
|
|
|
-::
|
|
|
+.. tabs::
|
|
|
+ .. code-tab:: gdscript GDScript
|
|
|
|
|
|
extends KinematicBody2D
|
|
|
|
|
@@ -60,6 +61,46 @@ Add a script to the kinematic body and add the following code:
|
|
|
get_input()
|
|
|
move_and_slide(velocity)
|
|
|
|
|
|
+ .. code-tab:: csharp
|
|
|
+
|
|
|
+ using Godot;
|
|
|
+ using System;
|
|
|
+
|
|
|
+ public class Movement : KinematicBody2D
|
|
|
+ {
|
|
|
+ [Export] public int Speed = 200;
|
|
|
+
|
|
|
+ Vector2 velocity = new Vector2();
|
|
|
+
|
|
|
+ public void GetInput()
|
|
|
+ {
|
|
|
+ velocity = new Vector2();
|
|
|
+ if (Input.IsActionPressed("right"))
|
|
|
+ {
|
|
|
+ velocity.x += 1;
|
|
|
+ }
|
|
|
+ if (Input.IsActionPressed("left"))
|
|
|
+ {
|
|
|
+ velocity.x -= 1;
|
|
|
+ }
|
|
|
+ if (Input.IsActionPressed("down"))
|
|
|
+ {
|
|
|
+ velocity.y += 1;
|
|
|
+ }
|
|
|
+ if (Input.IsActionPressed("up"))
|
|
|
+ {
|
|
|
+ velocity.y -= 1;
|
|
|
+ }
|
|
|
+ velocity = velocity.Normalized() * Speed;
|
|
|
+ }
|
|
|
+
|
|
|
+ public override void _PhysicsProcess(float delta)
|
|
|
+ {
|
|
|
+ GetInput();
|
|
|
+ MoveAndSlide(velocity);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
In the ``get_input()`` function we check for the four key events and sum them
|
|
|
up to get the velocity vector. This has the benefit of making two opposite keys
|
|
|
cancel each other out, but will also result in diagonal movement being faster
|
|
@@ -84,7 +125,8 @@ while up/down moves it forward or backward in whatever direction it's facing.
|
|
|
|
|
|
.. image:: img/movement_rotate1.gif
|
|
|
|
|
|
-::
|
|
|
+.. tabs::
|
|
|
+ .. code-tab:: gdscript GDScript
|
|
|
|
|
|
extends KinematicBody2D
|
|
|
|
|
@@ -111,6 +153,50 @@ while up/down moves it forward or backward in whatever direction it's facing.
|
|
|
rotation += rotation_dir * rotation_speed * delta
|
|
|
move_and_slide(velocity)
|
|
|
|
|
|
+ .. code-tab:: csharp
|
|
|
+
|
|
|
+ using Godot;
|
|
|
+ using System;
|
|
|
+
|
|
|
+ public class Movement : KinematicBody2D
|
|
|
+ {
|
|
|
+ [Export] public int Speed = 200;
|
|
|
+ [Export] public float RotationSpeed = 1.5f;
|
|
|
+
|
|
|
+ Vector2 velocity = new Vector2();
|
|
|
+ int rotationDir = 0;
|
|
|
+
|
|
|
+ public void GetInput()
|
|
|
+ {
|
|
|
+ rotationDir = 0;
|
|
|
+ velocity = new Vector2();
|
|
|
+ if (Input.IsActionPressed("right"))
|
|
|
+ {
|
|
|
+ rotationDir += 1;
|
|
|
+ }
|
|
|
+ if (Input.IsActionPressed("left"))
|
|
|
+ {
|
|
|
+ rotationDir -= 1;
|
|
|
+ }
|
|
|
+ if (Input.IsActionPressed("down"))
|
|
|
+ {
|
|
|
+ velocity = new Vector2(-Speed, 0).Rotated(Rotation);
|
|
|
+ }
|
|
|
+ if (Input.IsActionPressed("up"))
|
|
|
+ {
|
|
|
+ velocity = new Vector2(Speed, 0).Rotated(Rotation);
|
|
|
+ }
|
|
|
+ velocity = velocity.Normalized() * Speed;
|
|
|
+ }
|
|
|
+
|
|
|
+ public override void _PhysicsProcess(float delta)
|
|
|
+ {
|
|
|
+ GetInput();
|
|
|
+ Rotation += rotationDir * RotationSpeed * delta;
|
|
|
+ MoveAndSlide(velocity);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
Here we've added two new variables to track our rotation direction and speed.
|
|
|
Again, pressing both keys at once will cancel out and result in no rotation.
|
|
|
The rotation is applied directly to the body's ``rotation`` property.
|
|
@@ -129,7 +215,8 @@ is set by the mouse position instead of the keyboard. The character will always
|
|
|
|
|
|
.. image:: img/movement_rotate2.gif
|
|
|
|
|
|
-::
|
|
|
+.. tabs::
|
|
|
+ .. code-tab:: gdscript GDScript
|
|
|
|
|
|
extends KinematicBody2D
|
|
|
|
|
@@ -149,14 +236,52 @@ is set by the mouse position instead of the keyboard. The character will always
|
|
|
get_input()
|
|
|
move_and_slide(velocity)
|
|
|
|
|
|
+ .. code-tab:: csharp
|
|
|
+
|
|
|
+ using Godot;
|
|
|
+ using System;
|
|
|
+
|
|
|
+ public class Movement : KinematicBody2D
|
|
|
+ {
|
|
|
+ [Export] public int Speed = 200;
|
|
|
+
|
|
|
+ Vector2 velocity = new Vector2();
|
|
|
+
|
|
|
+ public void GetInput()
|
|
|
+ {
|
|
|
+ LookAt(GetGlobalMousePosition());
|
|
|
+ velocity = new Vector2();
|
|
|
+ if (Input.IsActionPressed("down"))
|
|
|
+ {
|
|
|
+ velocity = new Vector2(-Speed, 0).Rotated(Rotation);
|
|
|
+ }
|
|
|
+ if (Input.IsActionPressed("up"))
|
|
|
+ {
|
|
|
+ velocity = new Vector2(Speed, 0).Rotated(Rotation);
|
|
|
+ }
|
|
|
+ velocity = velocity.Normalized() * Speed;
|
|
|
+ }
|
|
|
+
|
|
|
+ public override void _PhysicsProcess(float delta)
|
|
|
+ {
|
|
|
+ GetInput();
|
|
|
+ MoveAndSlide(velocity);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
Here we're using the :ref:`Node2D <class_Node2D>` ``look_at()`` method to
|
|
|
point the player towards a given position. Without this function, you
|
|
|
could get the same effect by setting the angle like this:
|
|
|
|
|
|
-::
|
|
|
+.. tabs::
|
|
|
+ .. code-tab:: gdscript GDScript
|
|
|
|
|
|
rotation = get_global_mouse_position().angle_to_point(position)
|
|
|
|
|
|
+ .. code-tab:: csharp
|
|
|
+
|
|
|
+ var rotation = GetGlobalMousePosition().AngleToPoint(Position);
|
|
|
+
|
|
|
|
|
|
Click-and-Move
|
|
|
--------------
|
|
@@ -166,7 +291,8 @@ on the screen will cause the player to move to the target location.
|
|
|
|
|
|
.. image:: img/movement_click.gif
|
|
|
|
|
|
-::
|
|
|
+.. tabs::
|
|
|
+ .. code-tab:: gdscript GDScript
|
|
|
|
|
|
extends KinematicBody2D
|
|
|
|
|
@@ -185,6 +311,37 @@ on the screen will cause the player to move to the target location.
|
|
|
if (target - position).length() > 5:
|
|
|
move_and_slide(velocity)
|
|
|
|
|
|
+ .. code-tab:: csharp
|
|
|
+
|
|
|
+ using Godot;
|
|
|
+ using System;
|
|
|
+
|
|
|
+ public class Movement : KinematicBody2D
|
|
|
+ {
|
|
|
+ [Export] public int Speed = 200;
|
|
|
+
|
|
|
+ Vector2 target = new Vector2();
|
|
|
+ Vector2 velocity = new Vector2();
|
|
|
+
|
|
|
+ public override void _Input(InputEvent @event)
|
|
|
+ {
|
|
|
+ if (@event.IsActionPressed("click"))
|
|
|
+ {
|
|
|
+ target = GetGlobalMousePosition();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public override void _PhysicsProcess(float delta)
|
|
|
+ {
|
|
|
+ velocity = (target - Position).Normalized() * Speed;
|
|
|
+ // Rotation = velocity.Angle();
|
|
|
+ if ((target - Position).Length() > 5)
|
|
|
+ {
|
|
|
+ MoveAndSlide(velocity);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
Note the ``length()`` check we make prior to movement. Without this test,
|
|
|
the body would "jitter" upon reaching the target position, as it moves
|