บทเรียนการควบคุม KinematicBody2D ให้สามารถควบคุมตัวละครแบบ Full Movement Character พร้อม Node ของ Static Platform สำหรับสร้างเกม 2D บน Godot Engine
โปรดศึกษาบทเรียนก่อนหน้า:
บทเรียนนี้จะเป็นการต่อยอดบทเรียนที่ได้ศึกษามาก่อนหน้าให้เกิดความสมบูรณ์ขึ้น นั่นคือการประยุกต์ตัวงานเกมของเราให้เป็น Platform 2D Game เปิด Project ขึ้นมา สร้าง Node2D ตั้งชื่อใหม่ว่า World
หลังจากนั้นให้ Add Child Node ลงไปเลือก KinematicBody2D สร้างตัวละครเช่นเดิม พร้อมเลือก Sprite ตั้งค่า AnimatedSprite ท่าทางเริ่มต้นคือ “Idle”
ทำการเพิ่ม Collision2D เข้าไปเป็น Child Node ของ KinematicBody2D
ตัว CollisionShape2D นี้จำต้อง ใส่รูปทรงของวัตถุครอบ Sprite มันก็คือส่วนของการตรวจจับการชนหรือสัมผัสระหว่างวัตถุในเกม (Node) จำนวน 2 ตัวนั่นเอง
เพิ่ม StaticBody2D ลงไปใน World เพื่อสร้าง Platform ของพื้นที่ตัวละครจะเหยียบ และเดินไปมา ใส่ Sprite คือพื้นหญ้า และเพิ่ม CollisionShape2D เลือก Retangle ที่ Inspectorให้กับมัน
หากทดลองเล่นๆกลับไปเลือก CollisionShape2D ของ Player เป็น Capsule ดู
ผลลัพธ์ตอน run เกมจะเป็นแบบนี้ (กด F5) ทดสอบ (ดู gif ข้างล่าง) ตัวละครจะกลิ้งไปมาตาม Shape ของ Collision
ดังนั้นลองเลือก Retangle Shape ให้กับตัวละคร
สร้าง Animted ชุดของ walk และ jump ขึ้นมาใหม่ เสียเพื่อที่เราจะใช้ควบคุม
คำสั่งนั้นก็คือการแก้ไข player.gd จากบทความก่อนๆ โดยเพิ่มบางส่วนเข้าไปคือ:
const JUMP_FORCE = 20.0
เพิ่มแรงกระโดด เป็น Constant ชื่อว่า JUMP_FORCE เป็น 20.0 เพราะต้องเป็น float
ใส่ค่าแรงดึงดูดของโลกเข้าไปใน func _process(delta) เพื่อให้ตัวละครตกลงไปตามแรงดึงดูดโลกที่ 10 (แกน Y)
move( Vector2(0,10))
เพิ่ม Input ของ ui_up หรือกด ขึ้นเพื่อกระโดด เข้าไปใน player.gd ส่วนท้ายก่อนปิด pass
#JUMP if Input.is_action_pressed("ui_up"): get_node("AnimatedSprite").play("jump") move(Vector2(0, -JUMP_FORCE))
โดยระหว่างกระโดดให้เล่น AnimatedSprite ว่า “jump” ตามที่เราตั้งชื่อ
ดังนั้น Code ทั้งหมดจะเป็นดังนี้:
extends KinematicBody2D var input_direction = 0 var direction = 0 var speed = 0 var velocity = 1 const MAX_SPEED = 600 const ACCELERATION = 1000 const DECELERATION = 2000 const JUMP_FORCE = 20.0 func _ready(): set_process(true) pass func _process(delta): move( Vector2(0,10)) if input_direction: direction = input_direction if Input.is_action_pressed("ui_left"): input_direction = -1 get_node( "AnimatedSprite" ).set_flip_h( true ) get_node("AnimatedSprite").play("walk") elif Input.is_action_pressed("ui_right"): input_direction = 1 get_node( "AnimatedSprite" ).set_flip_h( false ) get_node("AnimatedSprite").play("walk") else: input_direction = 0 get_node("AnimatedSprite").play("Idle") # MOVEMENT if input_direction == - direction: speed /= 3 if input_direction: speed += ACCELERATION * delta else: speed -= DECELERATION * delta speed = clamp(speed, 0, MAX_SPEED) velocity = speed * delta * direction move(Vector2(velocity, 0)) #JUMP if Input.is_action_pressed("ui_up"): get_node("AnimatedSprite").play("jump") move(Vector2(0, -JUMP_FORCE)) pass
ทดสอบกันหน่อยดีกว่า เริ่มจาก เดินไปมา แล้วดูว่า แรงดึงดูดใช้ได้ไหม
หลังจากนั้นลองทดสอบ การกระโดดให้กด ลูกศรขึ้นดู
จะเห็นว่าเกมของเราสมบูรณ์แล้วในส่วนของ Full Movement Character ลองทดสอบทำตามดูกันนะ
[บทต่อไป] : เขียนเกม 2D ด้วย Godot Engine จัดการ Camera2D และยิง Bullet
One Comment