libGDX เขียนเกม part 2: Kotlin ปะทะ Java Launchers
จำต้องเขียนตอนนี้เนื่องจากว่าทั้งสองภาษาได้มาบรรจบกัน มือใหม่มาเห็นจะได้ไม่งงจนพาลท้อแท้สิ้นหวังไปเสียก่อน (ทำไมผมขำ) เราจะพูดกันถึงพื้นฐานและทำความเข้าใจภาษาทั้งสองนี้เพื่อนำไปสู่หนทางเขียนเกมของเราต่อไป
ความเดิม part ที่แล้ว
Kotlin vs Java Compiling
ใน part แรกผมพูดไปบ้างแล้ว ว่าทั้ง kotlin และ Java ต่างต้องการ JVM ลองมาดูภาพนี้กันครับ
จากภาพสิ่งที่เราต้องการก็คือ Application ซึ่งจะได้มาจากการทำงานของ JVM แต่ก่อนจะได้ Application มือใหม่พึงทราบว่า
- Kotlin มีนามสกุลคือ .kt
- ขณะที่ Java มีนามสกุลคือ .java
- Kotlin ต้องใช้ Kotlin Compiler
- ขณะที่ Java ต้องใช้ Java Compiler
- ทั้ง Kotlin Compiler และ Java Compiler ต่างก็ให้ผลลัพธ์เป็น .class
- .class นี้สามารถทำงานกับ JRE ได้เลย โดยที่ JRE ก็จะไปเรียก JVM ต่อไป
- .class นี้สามารถห่อ (pack) ให้เป็น .jar และ .jar นี้สามารถห่อ (pack) เป็น .war ได้
- .jar ที่เกิดจากการห่อ .class ซึ่งเป็นผลจาก Kotlin Compiler จำต้องใส่ Kotlin Runtime เข้าไปด้วย มิเช่นนั้นจะแกะ .class มา execute ไม่สำเร็จ
อ้างอิง
กลับไปดูโครงสร้างโปรเจกต์ของเรากันครับ
Project Structure
เอาหลักๆก่อน
- .gradle เกิดขึ้นจากผลการทำงานของโปรแกรม Gradle ไม่ต้องสนใจ
- .idea เกิดขึ้นจากผลการทำงานของโปรแกรม IntelliJ IDEA ไม่ต้องสนใจ
- core เราจะเขียนโปรแกรม (เกม) กันตรงนี้
- desktop จำตอนแรกได้ไหมที่ให้เลือก Sub Projects คืออยากให้ export เกมของเราไปยัง platform ใดบ้าง เราเลือกแค่ desktop จึงปรากฏเท่านี้
- gradle คือไฟล์ต่างๆของโปรแกรม Gradle เป็น Build Tool ที่ดูแลโปรเจกต์ของเรา
- External Libraries คือไลบรารีที่เขียนอยู่ในไฟล์ build.gradle และถูกดาวน์โหลดมาจากอินเตอร์เน็ต (หากตรวจสอบแล้วว่าไม่มีอยู่ในเครื่องแต่แรก)
ทีนี้ไปดูโค้ดหลักๆที่สำคัญกันต่อ
Launchers & core
ครั้งแรกที่เรารันโปรแกรมขึ้นมาคือเปิดไฟล์ DesktopLauncher จากนั้นมองหาเมธอด main* แล้วกดปุ่มสามเหลี่ยมสีเขียว
รอคอยการ execute แล้วได้สิ่งนี้
ผมกำลังจะบอกว่า โค้ดทั้งหมดในไฟล์นี้คือภาษา Java
public class DesktopLauncher {
public static void main (String[] arg) {
LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();
new LwjglApplication(new Main(), config);
}
}
หากว่าใครเคยเรียนภาษา C มาก่อน ก็จะเข้าใจว่าโปรแกรมจะทำงานได้จำต้องมีฟังก์ชันชื่อ main ซึ่งเป็นฟังก์ชันแรกที่ตัว compiler จะมองหาเพื่อ execute โค้ด
ภาษา Java หรือ Kotlin ไม่ต่างกัน มันทั้งคู่ต้องการฟังก์ชัน main นี้เพื่อให้ compiler มา compile โค้ด
ภาษา Java จะเรียกฟังก์ชันว่าเมธอด (method) มือใหม่ขอให้เข้าใจว่าเป็นอันเดียวกันไปก่อนจะได้ไม่สับสนมาก และจะต้องเขียนเข้ารูปแบบนี้เท่านั้นตัว compiler จึงจะเข้าใจว่าเป็น main
public static void main (String[] arg) { }
สำหรับ Kotlin ก็คือ
fun main(args: Array<String>) { }
มาทดลองเขียนเมธอด main แบบ Kotlin แทนที่ Java ได้ดังนี้
คลิกขวาที่ package ชื่อ com.pros.desktop เลือก New > Kotlin File/Class
ตั้งชื่อคลาสนี้ว่า DesktopMain และเลือกประเภทเป็น File
จะได้ไฟล์ที่เขียนเพียง package ไว้ให้
package com.pros.desktop
เพิ่มเมธอด main ลงไป
package com.pros.desktop
fun main(args: Array<String>) {
}
จากนั้นประกาศตัวแปรชื่อ config ให้มีชนิดเป็น LwjglApplicationConfiguration เวลาพิมพ์ให้สังเกตว่า IntelliJ IDEA พยายามช่วยแนะนำชื่อคลาสให้เสมอ เลือกชื่อคลาสที่ต้องการได้เลยด้วยการใช้ลูกศรแล้วกด enter (มันจะ auto import ให้)
package com.pros.desktop
import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration
fun main(args: Array<String>) {
val config = LwjglApplicationConfiguration()
}
เราต้องการคลาส LwjglApplication เพื่อเรียกคลาส Main ซึ่งอยู่ใน folder ชื่อ core มาทำงาน
LwjglApplication ต้องการ auguments 2 ตัว ได้แก่คลาส Main และตัวแปร config ก็เป็นอันเรียบร้อย
package com.pros.desktop
import com.badlogic.gdx.backends.lwjgl.LwjglApplication
import com.badlogic.gdx.backends.lwjgl.LwjglApplicationConfiguration
import com.pros.Main
fun main(args: Array<String>) {
val config = LwjglApplicationConfiguration()
LwjglApplication(Main(), config)
}
เอาล่ะ มองไปมุมบนขวา ตรงที่มีรูปค้อนสีเขียวและเขียนว่า DesktopLauncher เราจะเปลี่ยนเป็นไฟล์ใหม่ที่เราเพิ่งสร้างขึ้น
กดตรงปุ่มลูกศรขี้ลงสีเทา เลือก Edit Configurations…
ที่ช่อง Main class เปลี่ยนเป็น DesktopMainKt กดปุ่ม Apply และ OK
รันโปรแกรมได้
ผลลัพธ์เดียวกัน
part นี้ไว้เท่านี้ก่อน เพื่อให้มือใหม่ได้ศึกษาและทำความเข้าใจโค้ด ความแตกต่างระหว่างโปรแกรมภาษา Java และ Kotlin เพราะโปรเจกต์เกมเรานี้สามารถเขียนทั้งสองภาษาผสมกันได้ อย่างไรก็ตามเราจะพยายามศึกษาและเขียนมันด้วย Kotlin นะครับ
ตั้งใจ หนทางของการเป็นเกมโปรแกรมเมอร์ไม่ได้ยากเย็นเกินไป!