[TH] Godot: C# Script Ep.1

          เกมเอนจิน 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