เริ่มต้นเขียนเกมด้วย Love2D

เริ่มต้นเขียนเกมด้วย Love2D Cover Image

ก่อนอื่นต้องบอกก่อนว่า หัวข้อบทความอาจจะดูเว่อ เกินจริงไปบ้าง แต่วันนี้ผมจะมาสอนโปรแกรมเมอร์ทั้งหลาย ให้รู้จักกับ “ความรัก” กันครับ หรือถ้าชื่อภาษาอังกฤษของมันเลย คือ LÖVE ครับ ใช่แล้วความ LÖVE ครับ อ่านไม่ผิดหรอกครับ แต่ว่ามันไม่ใช่ความรักสำหรับ หนุ่ม-สาว (หนุ่ม-หมุ่ม, สาว-สาว ด้วย) นะครับ แต่มันคือความรักที่มีต่อการเขียนโปรแกรมนั่นเอง ฮ่าๆ พูดเพ้อเจ้อไปนั่น จริงๆ แล้ว LÖVE นั้นไม่ใช่อะไรครับ มันเป็น Game Framework เท่านั้นเอง :)

พอดีว่าวันนี้ว่างๆ ผมก็เลยนั่งหา Game Framework ใหม่ๆ ก็เลยไปสะดุดเจอเข้ากับตัวนี้ ชื่อมันดูน่ารักดี ชื่อว่า LÖVE ครับ ดูแล้วน่าสนใจ ก็เลยลองนั่งศึกษาซักพัก แล้วก็เลยทำเป็นบทความ รีวิวพร้อม Tutorial มาให้อ่านกันครับ เผื่อมีคนสนใจเหมือนกัน ก็อ่านแล้วลองเล่นดูได้

LÖVE คืออะไร?

LÖVE หรือเรียกอีกชื่อว่า Love2D นั้นเป็น Game Framework ตัวหนึ่ง ที่ฟรีเป็น Open Source ภาษาหลักที่ใช้คือภาษา Lua ครับ (บางคนอาจจะไม่เคยได้ยิน หรือรู้จักมาก่อนเลย) เหมาะสำหรับการสร้างเกมแนว 2D หลังจากได้ลองหัดเขียนเล่นๆดู รู้สึกมันน่าสนใจดี จริงๆ ภาษา Lua ผมไม่เคยเขียนหรืออัดมาก่อนเลย แต่ก็เคยได้ยินมาบ้างจาก Corona SDK ก็เลยลองหัดดูพบว่า น่าสนใจทั้ง Corona SDK และ LÖVE เลย แต่เลือก LÖVE ก่อน เพราะดู Learning Curve มันน่าจะน้อยกว่า :D

Love2D (ผมขอพิมพ์แบบนี้ละกัน เพราะพิมพ์ LÖVE ยาก ^^) นั้นตัวมันเป็น Cross-Platform Game Framework ทำให้สามารถรันได้ทั้งบน Windows, Mac และ Linux ปัจจุบันมีถึงเวอร์ชั่น 0.9.1 และยังไม่รองรับบน Browser หรือมือถือ (อยู่ในช่วงการ develop การทดลองอยู่ครับ)

พูดแต่น้ำมามากละ มาเข้าเนื้อซะที มาเริ่มเขียนเกมด้วย Love2D กันเลยดีกว่า

Step 1 : Download and Install Program

เริ่มแรก ก็ไปดาวน์โหลด Love2D ที่เว็บไซต์ได้เลย จากนั้นก็เลือกระบบปฎิบัติการที่ใช้ ผมใช้ Ubuntu ฉะนั้นผมเลยโหลดแบบ Ubuntu 64 Bit ทั้ง 3 ตัวเลยคือ liblove, love, love-dbg จากนั้นก็ ดับเบิลคลิ๊ก .deb ไฟล์ แล้วติดตั้งผ่าน Ubuntu Software Center เลย

หากใช้ Windows ก็เลือกตัวติดตั้งแบบ exe แล้วก็ติดตั้ง เลยครับ ตรงนี้ไม่บอกวิธีติดตั้งนะครับ น่าจะติดตั้งไม่ยาก ทำตาม Wizard ได้เลย

Love Windows

รูปผมเอามาจากหนังสือ LÖVE2d for Lua Game Programming

หลักจากทุกท่าน ติดตั้งเสร็จแล้ว ก็มาลงมือกันเลยครับ!

Step 2: สร้างเกมส์แรกด้วย LÖVE

มาทดลองสร้างเกม เกมแรกกันเลยครับ ตรงส่วนนี้ยังไม่ต้องสนใจ Syntax ภาษา Lua นะครับ หากใครมีพื้นฐานการเขียนโปรแกรมมาบ้าง ก็คงจะดูไม่ยากเท่าไหร่ สำหรับใครที่อยากรู้รายละเอียด Lua มากขึ้น ก็อ่าน Tutorial ได้ที่นี่เลยครับ LuaTut กับ Learn Lua in 15 Minutes

แถมเพิ่มครับ Learn X in Y Minutes อันนี้เป็นเว็บที่ผมเอาไว้อ่าน เวลาเรียนรู้ภาษาใหม่ๆ ครับ คือพยายามเรียนรู้ Syntax โครงสร้างของมันก่อน แล้วค่อยไปอ่าน Docs และมาประยุกต์ใช้ทีหลัง :D

กลับมาเข้าเรื่อง Love2D ต่อครับ ก่อนเขียน ทุกคนควรจะมี Text Editor กันก่อนครับ Notepad ก็ใช้ได้ แต่ที่นิยมกันตอนนี้ก็น่าจะเป็น Sublime Text 2, 3 ครับ

ทำการสร้างไฟล์ขึ้นมา 1 ไฟล์ ตั้งชื่อมันว่า main.lua นามสกุลไฟล์ ลงท้ายด้วย .lua นะครับ พิมพ์โค๊ดด้านล่างนี้ลงไปครับ

function love.draw()
    love.graphics.print("Hello World", 400, 300)
end

จากนั้นเซฟไฟล์ แล้วสร้างโฟลเดอร์ขึ้นมา 1 โฟลเดอร์ สมมติชื่อ FirstLove จากนั้นนำไฟล์ main.lua เซฟไว้ในโฟลเดอร์นี้ครับ

Step 3: ทดสอบ Run Program

ก่อนจะไปเริ่มเขียนในส่วนอื่นๆ มาลองทดสอบว่าทุกท่านสามารถที่จะเปิดโปรแกรมที่เขียนได้หรือไม่ สำหรับวิธีการเปิดเกมส์ด้วย Love นั้นมี 2 วิธีครับคือ - เปิดจากโฟลเดอร์ที่ข้างในมีไฟล์ main.lua อยู่ - เปิดจากไฟล์นามสกุล .love โดยข้างในมีไฟล์ main.lua อยู่

สำหรับ Windows

ให้ ก็อปปี้โฟลเดอร์ FirstLove ที่ข้างในเซฟไฟล์ main.lua ไปไว้ที่เดียวกับที่ติดตั้ง Love ครับ แล้วก็สั่งรันด้วย cmd

C:\Program Files\LOVE\love.exe" "C:\games\FirstLove"

หรือจะใช้วิธี เลือก main.lua จากนั้นคลิ๊กขวา เลือก Compressed Zip Folder ให้เป็นไฟล์ zip จากนั้นก็เปลี่ยนนามสกุลไฟล์เป็น .love จากนั้น ก็ดับเบิลคลิ๊กไฟล์ .love ได้เลย

บน Windows ผมไม่ได้ลองจริงๆนะครับ อ่านจากบทความ แล้วก็เลยทำวิธีมาเผื่อด้วย

สำหรับ Ubuntu

ผมใช้คำสั่งนี้ผ่าน Terminal

love /home/path/to/FirstLove

หากใครรันโปรแกรมถูกก็จะได้ดังรูปนี้ครับ

Hello Love

หากใครเปิดไม่ได้ แสดงว่า .zip ไฟล์ผิด หรือเปิดไม่ถูก แนะนำลองอ่านและทำดูใหม่ หรือดูได้จากต้นฉบับที่นี่ครับ Getting Started

Step 4: Love Function

มารู้จัก Main Function ของ Love ที่จะใช้ในการสร้างเกมส์กันก่อนดีกว่าครับ โดยหลักๆมีด้วยกัน 3 ฟังค์ชั่นคือ

love.load()
love.update(dt)
love.draw()

love.load()

ฟังค์ชั่นนี้ จะถูกเรียก เมือสั่งเริ่มโปรแกรม จะใช้สำหรับโหลดพวกไฟล์ Assets ต่างๆของเกม เช่น images, sound ต่างๆครับ หรือว่าไว้ประกาศตัวแปรต่างๆ ก็จะประกาศที่ฟังค์ชันนี้

love.update(dt)

ฟังค์ชันนี้เปรียบเสมือน Game Loop ของเกมส์ครับ dt นั้นคือ Delta Time ฟังค์ชันนี้จะถูกเรียก จนกว่าจะรัน Loop จนกว่าจะปิดเกมครับ ฟังค์ชันนี้จึงเหมาะสำหรับเอาไว้สำหรับอัพเดท พวก Logic ต่างๆ ของเกมครับ เช่น เอาไว้คอยรับ Handler Input ต่างๆ ของผู้เล่น หรือว่าเอาไว้ update ตำแหน่งต่างๆ ของ Player

love.draw()

ฟังค์ชันนี้ชื่อก็บอกอยู่แล้วครับ คือเอาไว้ draw graphic ต่างๆ

สำหรับเจ้า Love API ก็มี Module ให้ใช้มากมายครับ สามารถศึกษาเพิ่มเติมได้ทีนี่ Love2D Module

Step 5: Load Assets

เมื่อรู้ฟังค์ชันและ Module ต่างๆของ LOVE แล้ว ต่อไปก็มาทำการ implements กันเลยครับ โดยจะให้ตัวเกมนั้นโหลดไฟล์ภาพครับ สำหรับไฟล์ภาพ ผมใช้ภาพนี้

Me :D

และทำการตั้งชื่อว่า chai.png เซฟไว้ที่เดียวกับ main.lua ในโฟลเดอร์ FirstLove ส่วนโค๊ดก็ตามนี้

function love.load()
    chai = love.graphics.newImage("chai.png")
    x = 50
    y = 50
end

function love.draw()
    love.graphics.setFont(love.graphics.newFont(20))
    love.graphics.print("Hello World\nWelcome to Love2D Tutorial", 300, 200)
    love.graphics.setBackgroundColor(255, 65, 100)

    love.graphics.draw(chai, x, y)
end

ด้านบน ที่ฟังค์ชั่น love.load() คือทำการโหลดไฟล์ chai.png โดยใช้ฟังค์ชัน love.graphics.newImage() เก็บไว้ที่ตัวแปร chai จากนั้นก็ทำการประกาศตัวแปร x, y เอาไว้สำหรับอ้างอิงตำแหน่ง x,y เพื่อไว้ draw Image ในขณะที่ load.draw() ก็ทำการเรียก love.graphics.draw(chai, x, y) สำหรับวาดรูปที๋โหลดจากตัวแปร chai ที่ตำแหน่ง x = 50, y = 50

ผลลัพธ์ก็จะได้แบบนี้

Load Assets

Step 6: Handler Input

ต่อมา เมื่อเราโหลด Assets ได้แล้ว ต่อไปก็ต้องทำการรับ Input จาก Keyboard นั่นเอง Module ที่ใช้ detect Keyboard ก็คือ love.keyboard.isDown( key ) ผมต้องการให้เมื่อกด spacebar ก็จะให้รูปมันขยับตำแหน่งขึ้น ก็จะทำแบบนี้

function love.update(dt)
    if love.keyboard.isDown(" ") then
        y = y - (500 * dt)
    end
end

สำหรับ Key ของ Spacebar จะใช้ " " ตาราง Key สามารถดูเพิ่มเติมได้ที่นี่ Key Constant

เมื่อทดลองรันโปรแกรมใหม่ และกด spacebar รูปก็จะขยับขึ้นไปครับ

ต่อมาผมจะทำให้ตัวเกมคล้ายๆกับ Flappy Bird คือตัว Player จะตกลงสู่พื้นเรื่อยๆ ต้องกด Spacebar เพื่อให้ Player ขยับขึ้น ผมก็ทำแบบนี้

function love.update(dt)
    y = y + (200 * dt)

    if love.keyboard.isDown(" ") then
        y = y - (500 * dt)
    end
end

ต่อมาก็กันไว้ไม่ให้ตัว Player หลุดนอกกรอบ ถ้าหลุดกรอบ ขวามือ ก็ให้เริ่มใหม่ ถ้าตกลงล่างสุดของจอแล้ว ก็สุดแค่นั้นไปไหนต่อไม่ได้ ก็เพิ่มเงื่อนไขเข้าไป สุดท้ายฟังค์ชัน love.update(dt) ก็จะเป็นแบบนี้

function love.update(dt)
    if love.keyboard.isDown(" ") then
        y = y - (speed * dt)
    end
    y = y + (200 * dt)
    x = x + (200 * dt)

    if (x > love.graphics.getWidth()) then
        x = 0
    end

    if (y > love.graphics.getHeight() - 64) then
        y = love.graphics.getHeight() - 64
    end
end

โดยผมทำการเช็ค love.graphics.getWidth() กับ love.graphics.getHeight() เพื่อเช็คความกว้าง ความยาว ของหน้าจอเกม ส่วนค่า speed และค่า gravity ผมทำการประกาศไว้ที่ฟังค์ชัน love.load() ครับ สุดท้ายไฟล์ main.lua จะเป็นแบบนี้

function love.load()
    chai = love.graphics.newImage("chai.png")
    x = 50
    y = 50

    speed = 500
    gravity = 200
end

function love.draw()
    love.graphics.setBackgroundColor(255, 65, 100)
    love.graphics.draw(chai, x, y)
end


function love.update(dt)
    if love.keyboard.isDown(" ") then
        y = y - (speed * dt)
    end
    y = y + (gravity * dt)
    x = x + (gravity * dt)

    if (x > love.graphics.getWidth()) then
        x = 0
    end

    if (y > love.graphics.getHeight() - 64) then
        y = love.graphics.getHeight() - 64
    end

    if (y < 0) then
        y = 0
    end
end

ทดสอบรันโปรแกรมดูครับ แล้วคอยกด spacebar เพื่อไม่ให้ตัว Player มันตกครับ :D

Step 7: Love Config

สุดท้าย มารู้จักกับการ config ตัวเกมครับ โดยจะทำการเปลี่ยน Title ของตัวเมนูเกมส์ เปลี่ยนขนาดของหน้าจอกันครับ เริ่มแรกให้สร้างไฟล์ชื่อ conf.lua และเซฟไว้ในโฟลเดอร์ FirstLove ครับ โค๊ดก็เป็นแบบนี้

function love.conf(t)
    t.window.title = "FirstLove by Devahoy"        
    t.window.width = 800              
    t.window.height = 600              
    t.window.resizable = false         
end

จากไฟล์ conf.lua เป็นการเซต Title, ความกว้างความยาว และไม่ให้ทำการปรับ Resize ของหน้าจอได้ครับ หลังจากมีไฟล์ conf.lua แล้ว ก็ลองเปิดเกมดูใหม่ สังเกต ชื่อ และขนาด เป็นตามที่เราตั้งค่าไว้เลย

Love Config

แหล่งเรียนรู้เพิ่มเติม

ต้องบอกก่อนว่า ผมก็เพิ่งเริ่มศึกษาเช่นกันครับ วันนี้ตอนบ่ายๆ เอง เวลาศึกษาก็แค่ครึ่งวัน ก็ยังไม่ได้เป็น Guru หรือว่ารู้อะไรมาก แต่ว่าก็พอมีแหล่งที่ศึกษาต่อ หรือแหล่งที่กำลังนั่งเรียนรู้อยู่มาให้เผื่อครับ - Love2D Wiki อันนี้เป็นหน้า Wiki หลักของ Love2D มีรายละเอียดและตัวอย่างเยอะครับ - How to Learn LÖVE (Love2D) อันนี้เป็นการแนะนำการเรียน Love2D ของเว็บ Tutsplus ครับ - Love2D Tutorial @Youtube อันนี้เป็น PlayList ใน Youtube ครับ ส่วนตัวยังไม่ได้ลองดู แต่คิดว่าน่าจะมีประโยชน์ - LÖVE for Lua Game Programming หนังสือหลักที่ผมอ่านคือเล่มนี้ครับ

สรุป

สรุป สิ่งที่ผมทำเป็น Tutorial + Review แบบนี้ ผมใช้เวลาอ่านหน้าเว็บ Wiki กับหนังสือ แล้วก็ลองทำตาม ประยุกต์บ้าง ก็ประมาณ 2-3 ชม. ก็ได้เป็นแบบนี้แล้ว คิดว่าหากใครได้ไปศึกษาต่อเพิ่มเติม น่าจะสามารถทำเกมสนุกๆออกมาเล่นได้ไม่ยากครับ อย่าลืมนะครับว่า การเรียนรู้ที่ดีที่สุด คือการได้ลองทำ และสนุกไปกับมันครับ สำหรับใครที่สนใจทำเกมส์อยู่แล้ว ก็ลองเล่น ลองหัดทำกันดูได้ครับ แล้วใครทำแล้ว ก็นำเกมส์มาโชว์กันได้นะครับ :D

Cover Image Credit: https://twitter.com/Triplenox

Chai Chai Phonbopit : Web Developer @Nimbl3 • ผู้ชายธรรมดาๆ ที่ชื่นชอบ Node.js, JavaScript และ Open Source มีงานอดิเรกเป็น Acoustic Guitar และ Football

บทความล่าสุด