Browse Source

Merge pull request #1362 from skyace65/KinematicBody

Add C# code to KinematicBody
Chris Bradfield 7 years ago
parent
commit
f225c3ab62
1 changed files with 169 additions and 5 deletions
  1. 169 5
      tutorials/physics/using_kinematic_body_2d.rst

+ 169 - 5
tutorials/physics/using_kinematic_body_2d.rst

@@ -116,7 +116,14 @@ the same collision response:
 
  .. code-tab:: csharp
 
-    Coming soon
+    // using MoveAndCollide
+    var collision = MoveAndCollide(velocity * delta);
+    if (collision != null)
+    {
+        velocity = velocity.Slide(collision.Normal);
+    }
+    // using MoveAndSlide
+    velocity = MoveAndSlide(velocity);
 
 Anything you do with ``move_and_slide()`` can also be done with ``move_and_collide()``,
 it just might take a little more code. However, as we'll see in the examples below,
@@ -170,7 +177,42 @@ Attach a script to the KinematicBody2D and add the following code:
 
  .. code-tab:: csharp
 
-    Coming soon
+    using Godot;
+    using System;
+
+    public class KBExample : KinematicBody2D
+    { 
+        public int Speed = 250;
+        private Vector2 _velocity = new Vector2();
+
+        public void getInput()
+        {
+            // Detect up/down/left/right keystate and only move when pressed
+            _velocity = new Vector2();
+            if (Input.IsActionPressed("ui_right"))
+            {
+                _velocity.x += 1;
+            }
+            if (Input.IsActionPressed("ui_left"))
+            {
+                _velocity.x -= 1;
+            }
+            if (Input.IsActionPressed("ui_down"))
+            {
+                _velocity.y += 1;
+            }
+            if (Input.IsActionPressed("ui_up"))
+            {
+                _velocity.y -= 1;
+            }
+        }
+
+        public override void _PhysicsProcess(float delta)
+        {
+            getInput();
+            MoveAndCollide(velocity * delta);
+        }
+    }
 
 
 Run this scene and you'll see that ``move_and_collide()`` works as expected, moving
@@ -242,7 +284,53 @@ uses the mouse pointer. Here is the code for the Player, using ``move_and_slide(
 
  .. code-tab:: csharp
 
-    Coming soon
+    using Godot;
+    using System;
+
+    public class KBExample : KinematicBody2D
+    { 
+        private PackedScene _bullet = (PackedScene)GD.Load("res://Bullet.tscn");
+        public int Speed = 200;
+        private Vector2 _velocity = new Vector2();
+
+        public void getInput()
+        {
+            // add these actions in Project Settings -> Input Map
+            _velocity = new Vector2();
+            if (Input.IsActionPressed("backward"))
+            {
+                _velocity = new Vector2(-speed/3, 0).Rotated(Rotation);
+            }
+            if (Input.IsActionPressed("forward"))
+            {
+                _velocity = new Vector2(speed, 0).Rotated(Rotation);
+            }
+            if (Input.IsActionPressed("mouse_click"))
+            {
+                Shoot();
+            }
+        }
+
+        public void Shoot()
+        {
+            // "Muzzle" is a Position2D placed at the barrel of the gun
+            var b = (Bullet)_bullet.Instance();
+            b.Start(((Node2D)GetNode("Muzzle")).GlobalPosition, Rotation);
+            GetParent().AddChild(b);
+        }
+
+        public override void _PhysicsProcess(float delta)
+        {
+            getInput();
+            var dir = GetGlobalMousePosition() - GlobalPosition;
+            // Don't move if too close to the mouse pointer
+            if (dir.Length() > 5)
+            {
+                Rotation = dir.Angle();
+                _velocity = MoveAndSlide(_velocity);
+            }
+        }
+    }
 
 
 And the code for the Bullet:
@@ -272,7 +360,39 @@ And the code for the Bullet:
 
  .. code-tab:: csharp
 
-    Coming soon
+    using Godot;
+    using System;
+
+    public class Bullet : KinematicBody2D
+    { 
+        public int Speed = 750;
+        private Vector2 _velocity = new Vector2();
+
+        public void Start(Vector2 pos, float dir)
+        {
+            Rotation = dir;
+            Position = pos;
+            _velocity = new Vector2(speed, 0).Rotated(Rotation);
+        }
+
+        public override void _PhysicsProcess(float delta)
+        {
+            var collsion = MoveAndCollide(_velocity * delta);
+            if (collsion != null)
+            {
+                _velocity = _velocity.Bounce(collsion.Normal);
+                if (collsion.Collider.HasMethod("Hit"))
+                {
+                    collsion.Collider.Hit();
+                }
+            }
+        }
+
+        public void OnVisibilityNotifier2DScreenExited()
+        {
+            QueueFree();
+        }
+    }
 
 
 The action happens in ``_physics_process()``. After using ``move_and_collide()`` if a
@@ -337,7 +457,51 @@ Here's the code for the player body:
 
  .. code-tab:: csharp
 
-    Coming soon
+    using Godot;
+    using System;
+
+    public class KBExample : KinematicBody2D
+    { 
+        [Export] public int RunSpeed = 100;
+        [Export] public int JumpSpeed = -400;
+        [Export] public int Gravity = 1200;
+
+        Vector2 velocity = new Vector2();
+        bool jumping = false;
+
+        public void getInput()
+        {
+            velocity.x = 0;
+            bool right = Input.IsActionPressed("ui_right");
+            bool left = Input.IsActionPressed("ui_left");
+            bool jump = Input.IsActionPressed("ui_select");
+
+            if (jump && IsOnFloor())
+            {
+                jumping = true;
+                velocity.y = JumpSpeed;
+            }
+            if (right)
+            {
+                velocity.x += RunSpeed;
+            }
+            if (left)
+            {
+                velocity.x -= RunSpeed;
+            }
+        }
+
+        public override void _PhysicsProcess(float delta)
+        {
+            getInput();
+            velocity.y += Gravity * delta;
+            if (jumping && IsOnFloor())
+            {
+                jumping = false;
+            }
+            velocity = MoveAndSlide(velocity, new Vector2(0, -1));
+        }
+    }
 
 .. image:: img/k2d_platform.gif