เกมเอนจิน Godot มี 2 ระบบ คือ ระบบที่ใช้งาน GDScript ที่มีหลักภาษาคล้ายกับภาษาไพธอนเป็นภาษาสำหรับควบคุมการทำงาน กับระบบที่ใช้ภาษา C# ในการทำงาน โดยขั้นตอนพื้นฐานในการใช้งานจะเป็นดังนี้
1. สร้างโครงงานใหม่ด้วยการคลิกเลือก New Project
2. กำหนดที่เก้บโครงงาน และตั้งชื่อโครงงาน หลังจากนั้นคลิกที่ Create Folder แล้วคลิกที่ปุ่ม Create&Edit เพื่อเข้าสู่โหมดการแก้ไขโครงงาน
3. เลือกการสร้าง Scene เป็น Node2D และบันทึกไฟล์ฉาก (Scene) เอาไว้
4. ใน Tab ชื่อ Inspector ให้เลือกสร้างสคริปต์ด้วยการคลิกที่ Script และเลือก New Script
5. เลือกภาษาเป็น C# และคลิก Create เพื่อสร้างไฟล์ที่มีนามสกุลเป็น .cs
6. โครงสร้างของไฟล์เป็นดังโปรแกรม 1-10 จะพบรายการทรัพยากรดังในภาพที่ 1-4 อันประกอบไปด้วยภาพไอคอนของโปรแกรม ไฟล์ฉากที่สร้างขึ้น (ในภาพตั้งชื่อเป็น MainScene.tscn) และไฟล์ภาษา C# (ชื่อ MainScene.cs)
โปรแกรม 1-10 ต้นแบบสคริปต์ C# ของ Godot
using Godot;
using System;
public class MainScene : Node2D
{
// Declare member variables here. Examples:
// private int a = 2;
// private string b = "text";
// Called when the node enters the scene tree for the first time.
public override void _Ready()
{
}
// // Called every frame. 'delta' is the elapsed time since the previous frame.
// public override void _Process(float delta)
// {
//
// }
}
จากโปรแกรม 1-10 จะพบว่า โครงสร้างที่ได้จาก Godot นั้นคล้ายกับโครงงานจาก Microsoft Visual Studio แต่มีส่วนที่เสริมเข้ามาเพิ่มเติม ได้แก่
1. มีการเรียกคลักคลาส Godot
2. คลาสหลักที่สร้างได้รับการสืบทอดมาจากคลาส Node2D อันเป็นชื่อคลาสของฉากแบบ 2 มิต ซึ่งหมายความว่า กรณีที่เขียนโค้ดสำหรับวัตถุอื่น ๆ ส่วนของคลาสที่สืบทอดนั้นจะเปลี่ยนไปตามประเภทของวัตถุ
3. ในคลาสประกอบด้วยเมธอดหรือฟังก์ชันหลัก 2 ตัว คือ
3.1 _Ready() เป็นฟังก์ชันที่ถูกเรียกให้ทำงานเมื่อวัตถุถูกเรียกมาใช้งานและพร้อมเริ่มต้นทำงาน
3.2 _Process() เป็นส่วนที่จะถูกเรียกให้ทำงานในทุกช่วงเวลา delta ซึ่งมีค่าเป็นระยะเวลาระหว่างเฟรม ซึ่งเป็นสิ่งที่จะต้องเขียนเพื่อให้ทำงานก่อนมีการวาดวัตถุบนจอภาพ โดยในตอนนี้่ถูกปิดไว้ด้วยเครื่องหมาย // ซึ่งเป็นการบอกให้ตัวแปลภาษาเข้าใจว่า ข้อความในบรรทัดนั้นที่อยู่หลังเครื่องหมายนี้ไม่ต้องนำไปแปลความหมาย
การสั่งให้มีการแสดงผลในส่วนของหน้าจอ Console ของโปรแกรม Godot จะใช้คำสั่งดังรูปแบบต่อไปนี้
GD.Print( ข้อมูล )
ด้วยเหตุนี้ เมื่อเพิ่มบรรทัดคำสั่งดังต่อไปนี้ในฟังก์ชัน _Ready() ของโปรแกรม 1-10
จะแสดงข้อความ “Hello, สวัสดี!” ในหน้าจอ Console ดังตัวอย่างในภาพที่ 1-5
GD.Print( “Hello, สวัสดี!” );
คราวนี้ลองเขียนภาษา C# ใน Godot เพื่อหาจำนวนเฉพาะ (Prime Number) อันเป็นจำนวนเต็มบวกที่มีค่ามากกว่า 1 และมีเฉพาะตัวเลข 1 และตัวเองที่หารตัวเลขนั้นได้ลงตัว เช่น 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 53, 59, 61, 67, 71, 73, … เป็นต้น โดยจำนวนเฉพาะนี้เป็นตัวเลขที่ตรงกันข้ามกับจำนวนประกอบ (Composite Number)
ประโยชน์ของจำนวนเฉพาะ คือ นำไปใช้เป็นคีย์ (Key) ของการเข้ารหัส หรือนำไปใช้ในการแยกตัวประกอบ และคูณร่วมน้อย (ครน.)
การเขียนโปรแกรมเพื่อหาจำนวนเฉพาะ
การหาจำนวนเฉพาะในช่วง 1-100ตามวิธีตะแกรงของเอราทอสเทนีส (Sieve of Ertosthenes) มีขั้นตอนดังนี้
1. ตัด 1 ทิ้งเนื่องจากไม่ใช่จำนวนเฉพาะ
2. เลือก 2, 3, 5 และ 7 เป็นจำนวนเฉพาะ
3. ตัวเลขอื่น ๆ ที่หารด้วย 2, 3, 5 และ 7 ไม่ลงตัวคือจำนวนเฉพาะ
จาก 3 ขั้นตอนเมื่อนำมาเขียนโปรแกรมจะได้ดังโปรแกรม 1-11 จะได้คำตอบเป็นตัวเลข 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89 และ 97 เป็นจำนวนเฉพาะ
โปรแกรม 1-11 การหาจำนวนเฉพาะตามวิธีตะแกรงของเราทอสเทนีส
public override void _Ready()
{
uint i;
for (i=2; i<=100; i++) {
if ((i == 2)||(i==3)||(i==5)||(i==7)) {
GD.Print(i);
} else {
if ((i%2!=0)&&(i%3!=0)&&(i%5!=0)&&(i%7!=0)) {
GD.Print(i);
}
}
}
}
สมการ Exponential
สมการ exponential เป็นสมการยกกำลัง เขียนในรูป num1num2 และสามารถเขียนโปรแรกมในภาษา C# ด้วยการเรียกคำสั่ง Pow() ดังตัวอย่างต่อไปนี้
float result;
float num1; // base
float num2; // exponent
result = Math.Pow( num1, num2 );
กราฟของ 2x โดยกำหนดให้ x = [0,8) เป็นดังนี้
ตัวอย่างโปรแกรมเมื่อนำไปใช้กับ Godot
using Godot;
using System;
public class Icon : Sprite
{
int num1, num2, direction;
public override void _Ready() {
num1 = 2;
num2 = 0;
direction = 0;
}
public override void _Process(float delta)
{
float result = (float)Math.Pow(num1, num2);
Position = new Vector2(num2*30, 100+(float)(result/5000000));
if (direction == 0) {
num2 += 1;
if (num2 > 30) {
direction = 1;
}
} else {
num2 -= 1;
if (num2 == 0) {
direction = 0;
}
}
}
}
ตัวอย่างการวิ่งจากซ้ายไปขวา
//วิ่งจากทางซ้ายล่างขึ้นขวาบน
using Godot;
using System;
public class Icon : Sprite
{
int num1, num2, direction;
public override void _Ready() {
num1 = 2;
num2 = 0;
direction = 0;
}
public override void _Process(float delta)
{
float result = (float)Math.Pow(num1, num2);
Position = new Vector2(num2*30, 500-(float)(result/5000000));
if (direction == 0) {
num2 += 1;
if (num2 > 30) {
direction = 1;
}
} else {
num2 -= 1;
if (num2 == 0) {
direction = 0;
}
}
}
}
สมการ logarithm
ภาษา C# รองรับ logarithm ฐาน n, ฐาน 2 และฐาน 10 ด้วยคำสั่ง Log(), Log2() และ Log10() ดังรูปแบบของคำสั่งต่อไปนี้
y = Math.Log( x, n );
y = Math.Log2( x );
y = Math.Log10( x );
ลักษณะของกราฟ Logarithm ฐาน 2 เมื่อ x เป็น [0, 256) เป็นดังนี้
ตัวอย่างเมื่อนำไปใช้กับการเคลื่อนที่
using Godot;
using System;
public class Player6 : Sprite
{
int x;
public override void _Ready()
{
x = 0;
}
public override void _Process(float delta)
{
float y = (float)Math.Log(x)*80;
x += 1;
Position = new Vector2(x*10, 500-y);
if (x > 90) {
x = 0;
}
}
}
โค้ดของโปรแกรมหลักเป็นดังนี้
using Godot;
using System;
public class Lift : StaticBody2D
{
float y;
int direction;
public override void _Ready()
{
direction = 0;
y = 200;
}
public override void _PhysicsProcess(float delta)
{
Position = new Vector2(Position.x, y);
if (direction == 0) {
y+=2;
if (y > 400) {
direction = 1;
}
} else {
y -= 2;
if (y < 200) {
direction = 0;
}
}
}
}
สรุป
จากบทความนี้จะพบว่า C# ใน Godot ใช้ .NET Core SDK ทำให้มีความสามารถและความเร็วในการทำงานเหมือน C# ทั่วไป และทำให้ผู้มีความถนัดในภาษานี้อยู่แล้วสามารถใช้ Godot เป็นเครื่องมือพัฒนาต่อยอดได้ สุดท้ายนี้ ขอให้สนุกกับการเขียนโปรแกรมครับ
(C) 2020-2023, โดย อ.ดนัย เจษฎาฐิติกุล/อ.จารุต บุศราทิจ
ปรับปรุงเมื่อ 2023-07-18