Godot Engine

เขียนเกม 2D ด้วย Godot Engine การควบคุมตัวละคร Full Movement

บทเรียนการควบคุม 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 ตัวนั่นเอง

ระบบจะถามหาเป็นสิ่งแรก ในภาพตั้งชื่อ KinematicBody2D ตัวละครเป็น RigidBody2D Player (ตั้งชื่อผิด ขี้เกียจแก้)

เพิ่ม StaticBody2D ลงไปใน World เพื่อสร้าง Platform ของพื้นที่ตัวละครจะเหยียบ และเดินไปมา ใส่ Sprite คือพื้นหญ้า และเพิ่ม CollisionShape2D เลือก Retangle ที่ Inspectorให้กับมัน

เพิ่ม StaticBody2D
เลือก Shape ที่เหมาะสมใน Inspector
เลือก CollisionShape2D เป็น Rectangle สี่เหลี่ยม

หากทดลองเล่นๆกลับไปเลือก CollisionShape2D ของ Player เป็น Capsule ดู

ผลลัพธ์ตอน run เกมจะเป็นแบบนี้ (กด F5) ทดสอบ (ดู gif ข้างล่าง) ตัวละครจะกลิ้งไปมาตาม Shape ของ Collision

ดังนั้นลองเลือก Retangle Shape ให้กับตัวละคร

สร้าง Animted ชุดของ walk และ jump ขึ้นมาใหม่ เสียเพื่อที่เราจะใช้ควบคุม

สร้าง AnimatedSprite ของ “walk”
สร้าง AnimatedSprite ของ “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

Asst. Prof. Banyapon Poolsawas

อาจารย์ประจำสาขาวิชาการออกแบบเชิงโต้ตอบ และการพัฒนาเกม วิทยาลัยครีเอทีฟดีไซน์ & เอ็นเตอร์เทนเมนต์เทคโนโลยี มหาวิทยาลัยธุรกิจบัณฑิตย์ ผู้ก่อตั้ง บริษัท Daydev Co., Ltd, (เดย์เดฟ จำกัด)

Related Articles

Back to top button

Adblock Detected

เราตรวจพบว่าคุณใช้ Adblock บนบราวเซอร์ของคุณ,กรุณาปิดระบบ Adblock ก่อนเข้าอ่าน Content ของเรานะครับ, ถือว่าช่วยเหลือกัน