===== Player movement =====
I denne tutorial vil du lære at:
* Flytte Player (eller andre objekter) rundt på en 2D scene.
* Animation
* Keyboard Input
==== Ressourcer ====
Nedenstående spritesheet indeholder Player animation idle, walk, attack (venstre/højre, op og ned), samt death of player.
* {{ :images:player.png?linkonly |}} (højre-klik og download)
Vælg: \\
Project -> Project settings -> General -> Rendering -> Textures\\
Sæt her 'Default texture filter' til 'nearest'.
----
* Opret først en 2D scene, som **Root node**. (omdøb denne evt. til 'world')
I en 2D top-down verden ønsker vi et Object der kan detektere kollisioner, men ikke er påvirket af fysiske kræfter som tyngde (eller andre krafter). Til dette formål bruger vi et
* Tilføj (CTRL-A) et '**CharacterBody2D**' objekt. Dette bliver vores Player (omdøb objektet til Player).
* For at give Player objektet en grafisk repræsentation tilføj nu en 'AnimatedSprite' til Player.
* For at kunne detektere om Player interagerer med 'noget' tilføjer vi en CollisionShape2D.
{{ :images:animation_add.png?nolink&400 |}}
----
==== Keyboard Events ====
For at kunne flytte Player, vil vi opfange nogle Keyboard events (A,S,D,W), og flytte position på Player ud fra disse.
using Godot;
using System;
public partial class movement : CharacterBody2D
{
public const float Speed = 20.0f;
public const float JumpVelocity = -400.0f;
// Get the gravity from the project settings to be synced with RigidBody nodes.
public float gravity = ProjectSettings.GetSetting("physics/2d/default_gravity").AsSingle();
public override void _PhysicsProcess(double delta)
{
Vector2 velocity = Velocity;
// Add the gravity.
// Handle Jump.
if (Input.IsActionJustPressed("ui_accept") && IsOnFloor())
velocity.Y = JumpVelocity;
// Get the input direction and handle the movement/deceleration.
// As good practice, you should replace UI actions with custom gameplay actions.
Vector2 direction = Input.GetVector("ui_left", "ui_right", "ui_up", "ui_down");
if (direction != Vector2.Zero)
{
velocity.X = direction.X * Speed;
}
else
{
velocity.X = Mathf.MoveToward(Velocity.X, 0, Speed);
}
Velocity = velocity;
//MoveAndSlide();
MoveAndCollide(Velocity);
}
}
----
using Godot;
using System;
public partial class PlayerMovement : CharacterBody2D
{
public const float speed = 60.0f;
public string current_dir = "none";
private Vector2 temp;
AnimatedSprite2D anim;
public override void _Ready()
{
GD.Print("Printing from Player");
anim = GetNode("AnimatedSprite2D");
anim.Play("idle_front");
}
public override void _PhysicsProcess(double delta)
{
PlayerMovement2(delta);
}
public void PlayerMovement2(double delta)
{
if ( Input.IsKeyPressed(Key.D)){
current_dir = "right";
PlayAnimation(1);
temp = new Vector2(speed,0);
Velocity = temp;
}
else if( Input.IsKeyPressed(Key.A)){
current_dir = "left";
PlayAnimation(1);
temp = new Vector2(-speed,0);
Velocity = temp;
}
else if( Input.IsKeyPressed(Key.W)) {
current_dir = "up";
PlayAnimation(1);
temp = new Vector2(0, -speed);
Velocity = temp;
}
else if( Input.IsKeyPressed(Key.S)) {
current_dir = "down";
PlayAnimation(1);
temp = new Vector2(0, speed);
Velocity = temp;
}
else if( Input.IsKeyPressed(Key.V)) {
//DialogManager dm = GetNode("/root/DialogManager");
//DialogManager.LoadDialogue("wizard.json");
//dm.ShowDialogue();
}
else if( Input.IsKeyPressed(Key.B)) {
//DialogManager dm = GetNode("/root/DialogManager");
//dm.HideDialogue();
}
else {
PlayAnimation(0);
Velocity = new Vector2(0,0);
}
MoveAndSlide();
}
void PlayAnimation(int movement){
string dir = current_dir;
if ( dir == "right" ) {
anim.FlipH = false;
if (movement == 1) {
anim.Play("walk_right");
}
else if ( movement == 0 ){
anim.Play("idle_right");
}
}
else if ( dir == "left") {
anim.FlipH = true;
if (movement == 1)
anim.Play("walk_right");
else if (movement == 0)
anim.Play("idle_right");
}
else if (dir == "up"){
if ( movement == 1)
anim.Play("walk_up");
else if (movement == 0)
anim.Play("idle_up");
}
else if (dir == "down"){
if (movement == 1)
anim.Play("walk_down");
else if (movement == 0)
anim.Play("idle_front");
}
}
}
==== Animation ====
==== Shift to Run =====
Tilknytning af en movement modifier ved at holde Shift tasten nede, feks ved RUN vs WALK.
(WIP)
----