2D Game DevelopmentGodot Engine

เขียนเกม 2D ด้วย Godot Engine

Game Engine ที่น่าสนใจในพื้นฐานของความง่ายและเหมาะกับนักพัฒนาเกมเริ่มต้นอีกตัวในช่วงนี้คือ Godot Engine เหมาะกับนักพัฒนาเกมมือใหม่

เรามาเริ่มต้นพัฒนาเกมด้วย Game Engine ตัวใหม่อย่าง Godot Engine (อ่านว่า โก-ดด) กันหน่อยดีกว่า ว่ามันมีอะไรบ้าง เริ่มต้นคือ เข้าไปที่เว็บไซต์ https://godotengine.org/features

จะเห็นว่ามันสามารถพัฒนาเกม 2D ได้อย่างง่าย และควบรวมไปถึง 3D ด้วย (ส่วนตัวลองใช้งานเปรียบเทียบส่วนของ 3D ยังไม่ค่อย Smooth เท่าไร แต่ 2D โอเคเลย)

สิ่งที่ชอบที่สุดของเจ้า Godot Engine ส่วนตัวของผมเลยคือ การทำ Animation จาก Sprite Sheet เหมือน Dragon Bone หรือ Sprite Editor ดีๆตัวนึง อีกส่วนคือเรื่องของการใช้ภาษาโปรแกรมที่เป็น syntax แบบ ที่ใกล้เคียง Python

มาลองกันหน่อยดีกว่าให้ดาวน์โหลด และติดตั้งเจ้า Godot Engine ลงเครื่องของเราก่อน เมื่อพร้อมแล้วเราจะเห็นหน้าเริ่มต้นโปรแกรมดังนี้:

รูปแบบการออกแบบ Hierarchy เป็นหลัก Node Structure โดยมี Parent และ Child (ใกล้เคียง Hierarchy ของ Unity2D) คือ Node แม่จะเป็น Node ควบคุม Instance ลูก และก็สามารถแยกย่อยแก้ไขตามระดับได้อย่างอิสระ

ในตัวอย่างนี้ผมจะใช้ กราฟิก 2 ชิ้นคือกราฟิก ดังนี้:

ไฟล์ Player.png

เปิดโปรแกรมเลือก Folder ของ Project

เราจะเจอหน้าจอการทำงานดังนี้:

หน้าจอจะมีความคล้ายคลึงกับ Editor ของ Game Engine ตัวอื่นๆ ทางด้านซ้ายส่วนที่เป็น FileSystem คือ ไฟล์ Assets ทั้งหมดที่ถูกจัดเก็บไว้ใน Folder เดียวกัน Game ที่เราจะสร้าง แบ่งด้วยตำแหน่งด้านล่างคือ Preview Windows ฝั่งขวามือ คือ Scene จะมีความคล้ายกับ Hierarchy ของ Editor แต่เราจะทำงานแบบ Node เป็นหลักตามที่อธิบายไว้ข้างบน ด้านล่างคือ Inspector ตัวปรับแต่งค่าคุณสมบัติต่างๆ ของ Node ที่ถูกวางไว้ใน Scene เช่น ตั้งค่าความเร็ว แก้ไข Parameter อื่นๆ

เบื้องต้นให้เราไปที่ Scene

คลิกขวา หรือเพิ่มที่เครื่องหมาย + จะเปิด Dialog สำหรับสร้าง Node ซึ่งรายละเอียดรูปแบบของ Node ที่ต้องการสร้าง จะแสดงรายการมากมาย

ตัวแรกให้เราคลิกเลือกที่ Node แล้วกด Create เสีย พร้อมเปลี่ยนชื่อเป็น World เพื่อตั้งค่า Setup Scene เกม

เลือก Node กด Create
Double Click เปลี่ยนชื่อเป็น World

คลิกขวาที่ World (Node ที่เพิ่งสร้าง) เลือก + Add Child node หลังจากนั้นให้เราค้นหาคำว่า KinematicBody2D

ทำการ Add Child Node
หา KinematicBody2D อยู่ใน Node2D ส่วนของ collisionObject2D->PhysicBody2D

ทำการเปลี่ยนชื่อ KinematicBody2D เป็น Player (ระวังเรื่อง Case Sensitive) ทำการ + Add Child Node เพิ่มใน Player อีกที เลือก Sprite

เลือก Node2D และ Sprite
เลือก Node2D และ Sprite
เราจะได้ Scene node ดังนี้

ไปที่ Tool Bar เลือก Import -> Texture เพื่อนำภาพกราฟิกของเราใส่เข้าไปใน FileSystems ของ GoDot Engine สำหรับสร้าง Player ของเกม

เลือก Path ของไฟล์กราฟิกของเราไปใช้ได้เลย ทำการ Import เป็น 2D เก็บลงใน folder ชื่อ Assets

หลังจากนั้นลากไฟล์ Player.png ใน Assets ไปวางใน Texture ส่วนของ Inspector ตัว Sprite ได้เลยตามภาพตัวอย่าง

เราจะเห็นว่าตอนนี้ เกมของเรามี Player ไปปรากฏบน Editor แล้ว

ขั้นตอนต่อไปคือการเพิ่ม Script โปรแกรมลงไปใน Player เพื่อทำการควบคุมเบื้องต้น ภาษาโปรแกรมของ godot Engine จะมี C++ และ GDScript ซึ่งมี Syntax คล้าย Python และ Lua (เขียนง่าย ไม่ต้องกลัว), ส่วนใครที่ถนัดความมันของ C++ ให้ลองปรับ Editor ตาม Documents ของ Godot ตามนี้ครับ: http://docs.godotengine.org/en/stable/development/cpp/custom_modules_in_cpp.html

ทำการคลิกขวาที่ Player แล้วเลือก “Attach Script”

ตั้งชื่อ Script ที่เพิ่มเข้าไปว่า player.gd ให้เรียบร้อย:

ทำการ Attach GD SCript

Godot Engine จะมีเรื่องเด็ดอยู่คือ Code Editor ที่อยู่ในตัวของมันเองเลย ซึ่งใครกำลังเริ่มต้นกด ปุ่ม Tutorial ได้อ่านคู่มือทำตามสบายๆ

มี Code Editor ภายในตัว

การสร้าง Function Initial() ของ Godot นั้นจำต้องมีการประกาศ เพราะ Process ต่างๆ ของตัว Godot นั้นจะถูกเรียก Callback เสมอ หากไม่ต้องการให้ตรวจสอบว่า callback ทำงานได้หรือไม่ เพื่อไม่ให้เสียเวลาจำต้องประกาศคำสั่งเพื่อเช็คว่า โปรแกรมทำงานอยู่ตลอดเวลาไหมโดยเขียนเพียงครั้งเดียวให้ประกาศ:

extends KinematicBody2D

func _ready():
	set_process(true)
	pass

ส่วนของการทำงานที่ใกล้เคียงกับ Update() ที่มีการนับ DeltaTime ของเกมแบบ time elapsed ทั้ง seconds หรือ floating point นับไปเรื่อยๆ นั้นให้ประกาศ function เพิ่มมาว่า เพื่อใช้กับ set_process()

func _process(delta):
	pass

ดังเกตดูจะเห็นว่า Class ของ Script มีการ Extend ตัว KinematicBody2D ให้ตามส่วนของ node ที่เรา Attach Script เข้าไป ขั้นตอนต่อไปคือการควบคุม การเคลื่อนที่ของตัวละคร:

ทำการประกาศ Globa Variable ใต้ Extend ของ player.gd ดังนี้

var input_direction = 0
var direction = 0
var speed = 0
var velocity = 0
const MAX_SPEED = 500
const ACCELERATION = 1000
const DECELERATION = 2000

กำหนด input_direction คือทิศที่จะไป direction คือค่าเคลื่อนที่ Sprite เป็น + ไปทางเป็น – ไปทาง, speed, valocity คือ ความเร็วของการเคลื่อนที่ โดยกำหนด Const คือ MAX_SPEED ให้ห้ามเกิน 500 มีอัตราเร่ง ACCELERATION และผ่อน ที่ 1000 และ 2000

สำหรับการควบคุมของ Godot Engine จะใช้การเรียกค่าของแป้นบังคับ

Input.is_action_pressed("ui_left")
Input.is_action_pressed("ui_right")

ประกาศคำสั่งต่อไปนี้ใน func _process(delta):

if input_direction:
        direction = input_direction
   
    if Input.is_action_pressed("ui_left"):
        input_direction = -1
    elif Input.is_action_pressed("ui_right"):
        input_direction = 1
    else:
        input_direction = 0

เป็นการรับค่าจากแป้นพิมพ์ ลงใน input_direction โดยค่าที่ได้เก็บลง direction เช่นกัน สร้างเงื่อนไขคือ Input.is_action_pressed(“ui_left”) ให้ค่า input_direction เป็น -1 คือเลื่อนไปทางซ้าย (0 คือตรงกลาง), และ ui-right ให้เป็น 1 นั่นคือไปทางขวา

การคำนวนอัตราเร่ง และ เพิ่มความเร็วคือการใช้เงื่อนไข:

# 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))

ใช้ ความเร่งเมื่อมีการกดแป้นค้าง * delta ของเวลาใน Process ให้คำนวณไปต่อเนื่องแล้วเพิ่ม speed จนเต็ม Limit เช่นกันถ้ามีการเปลี่ยนทิศทางให้ลดค่า speed ลงแล้วไปเพิ่มทีหลัง โดยใช้ direction เป็นตัวกำหนดทิศ

ดังนั้นคำสั่งของ player.gd จะเป็นดังนี้:

extends KinematicBody2D

var input_direction = 0
var direction = 0
var speed = 0
var velocity = 0
const MAX_SPEED = 600
const ACCELERATION = 1000
const DECELERATION = 2000

func _ready():
	set_process(true)
	pass

func _process(delta):
	if input_direction:
		direction = input_direction
	
	if Input.is_action_pressed("ui_left"):
		input_direction = -1
	elif Input.is_action_pressed("ui_right"):
		input_direction = 1
	else:
		input_direction = 0
	
	# 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))
	pass

ทดสอบเกมของเรากันหน่อย กด Run เกมเลย

กด F5 ก็ได้นะ

ลองกด A,D หรือ ซ้าย, ขวา ค้างแล้วปล่อย เราจะควบคุมการเคลื่อนที่ของตัวละครได้

เป็นบทความสำหรับนักพัฒนาเกมสาย Indies ที่ต้องการ Game Editor และ Engine ที่เป็น Open Sources ไว้ใช้งานสร้างสรรค์ ตัว Godot engine นี้ผมมองว่าในระดับของ 2D เป็นอะไรที่สร้าง Learning Curve ได้ไวพอตัว และเกมพวก Simulation จีบสาว นั้นคนที่ไม่เก่ง Code แต่เก่งวาดภพ สามารถนำไปใช้สร้างเกมได้สบายๆ

สำหรับศักยภาพของมัน ยังสามารถสร้างเกม 3D ได้ด้วยนะครับ

Asst. Prof. Banyapon Poolsawas

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

Related Articles

Back to top button

Adblock Detected

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