Godot Engine

เขียนเกมด้วย Gogot Engine การประกอบตัวละครในเกมด้วย AnimationPlayer

เทคนิคการออกแบบตัวละครในเกมโดยการ Slice Sprite เป็นส่วนต่างๆ แล้วนำมาประกอบสร้างใน Tree พร้อมจัดท่าทางด้วย AnimationPlayer ด้วย Godot Engine

บทเรียนที่ควรต้องศึกษาก่อนหน้า

บทเรียนนี้จะเป็นการสร้างตัวละครในเกม เพียงแค่เราไม่ต้องทำ Sprite Sheet ตัวละครแบบ Set แล้ว แต่เราจะใช้ Sprite ในอีกรูปแบบหนึ่งนั่นคือรูปแบบของ Slices ดังตัวอย่างนี้:

มันคือ Sprite -Sheet ที่ดาวน์โหลดมาจาก https://www.spriters-resource.com

เพียงแค่พอเราจะใช้งานเราต้อง Slice มันออกเป็นชิ้นๆ จากโปรแกรม Photo Editor นั่นเองครับ พอหั่นเสร็จแล้วเราต้อง Import เข้าใน Project ของเราแบบ 2D Texture ให้เรียบร้อย

ให้เราสร้าง Scene ใหม่ขึ้นมาครับ แล้วสร้าง KinematicBody2D ขึ้นมาก่อน หลังจากนั้น สร้าง Sprite ชื่อว่า Chracter สร้าง Childnode วาง Layer โดยการจัด Z-index ให้เรียบร้อยประกอบเป็นตัวละครให้ได้:

เมื่อพร้อม และพอใจกับผลงานของเราแล้วก็ได้เวลาในการ สร้าง AnimationPlayer เลือกหามาใส่เป็น Childnode ของ KinematicBody2D

ให้เราสร้าง Animation ใหม่ขึ้นมาชื่อว่า idle

เลือกส่วนของ Character ขยับไปทีละส่วน ขยับทีละส่วน ให้จำไว้ว่าส่วนไหนที่ได้ปรับแล้วให้เลือกทั้งหมดโดยกด Shift ก่อนแล้วกด Auto Keys ที่ปุ่มนี้

ปรับ Keyframe ไปยัง Keyframe ที่ต้องการแล้วขยับ แอนิเมชัน (ใช้เวลาฝึกเล็กน้อย) กด Loop ทุกครั้ง

สร้างแอนิเมชันท่า idle และ walk เพื่อนำไปใช้ Attach Script ชื่อว่า player.gd เข้าไปที่ KinematicBody2D

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

var anim_play
var anim = ""
var anim_new = ""

func _ready():
	set_process(true)
	anim_play = get_node("AnimationPlayer")
	pass

func _process(delta):
	move( Vector2(0,10))
	
	if input_direction:
		direction = input_direction
		
	if Input.is_action_pressed("ui_left"):
		input_direction = -1
		set_scale(Vector2(-1,1))
		print("walk")
		anim = "walk"
	elif Input.is_action_pressed("ui_right"):
		input_direction = 1
		set_scale(Vector2(1,1))
		print("walk")
		anim = "walk"
	else:
		input_direction = 0
		anim = "idle"
		print("idle")
	
	if anim != anim_new:
		anim_new = anim
		anim_play.play(anim)
	pass

	# 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"):
		move(Vector2(0, -JUMP_FORCE))
	pass

จะเห็นว่า เราจะมีการเรียกคำสั่ง Flip ซ้าย ขวา ที่แตกต่างกับ AnimatedSprite คือ KinematicBody2D จะ Flip ต้องเลือก

set_scale(Vector2(-1,1))

สำหรับ แอนิเมชันเช่นกัน เราจะต้องใช้การสร้างตัวแปร

var anim_play
var anim = ""
var anim_new = ""

โดย anim_play มาทำการ get_node(“AnimationPlayer”) ส่วน anim ไว้เก็บ State ของ Animation ว่าเป็น walk หรือ idle เพื่อนำมาวน loop ทำซ้ำผ่านเงื่อนไขการเช็ค anim_new ที่

if anim != anim_new:
		anim_new = anim
		anim_play.play(anim)

นอกนั้นก็คำสั่ง เดิน บังคับตัวละครปกติ

สร้าง Scene ใหม่ขึ้นมา ตกแต่งให้เรียบร้อย ลาก player.xml ไปวางตามโครงสร้างของตัวอย่าง:

ทำการทดสอบเกมของเรา โดยการเดินไปมาในฉาก จะเห็นว่าตัวละครของเรา ขยับได้ปกติแล้ว

Source code: https://github.com/banyapondpu/godot-animationplayer

Asst. Prof. Banyapon Poolsawas

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

Related Articles

Back to top button

Adblock Detected

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