ต้องบอกก่อนว่า Pygame คือหนึ่งใน python library ที่ผมใช้มาตลอดหลายปีในการลองสร้างโปรเจกต์เกมต่างๆ มากมาย แต่ด้วยข้อจำกัดต่างๆ และไม่มี user interface ดีๆ เหมือนพวก Unity หรือ Unreal Engine เลยต้องหยุดใช้ไปและหันไปเรียนรู้ Game Engine แทน
แต่ถึงอย่างนั้น! หากคุณกำลังเขียนโปรแกรมด้วยภาษา Python เป็นทุนเดิมอยู่แล้ว และอยากหันมาลองสร้างเกมดูสักครั้ง ผมขอแนะนำ Pygame จากใจจริง ด้วยสาเหตุง่ายๆ อย่าง
- มันเข้าใจง่ายมากกกๆๆๆๆ
- โครงสร้างของโค้ดนั้นไม่ซับซ้อนมาก
- เรียนรู้ง่ายและเร็ว
- สามารถสร้างเกมได้ตั้งแต่เกมง่ายๆ ไปจนถึงเกมยากๆ ที่มีระบบซับซ้อน
จากภาพข้างบน คุณสามารถเห็นโค้ดของ pygame แบบคร่าวๆ ซึ่งผมจะอธิบายสั้นๆ นะ
เริ่มต้นคือการ "import pygame" หรือก็คือการดึง library ของ pygame มา (หากยังไม่ได้ติดตั้ง สามารถใช้คำสั่ง "pip install pygame" ได้เลย)
จากนั้นเราก็ initialize ด้วยฟังชั่น "pygame.init()"
ต่อมาเราจะเก็บค่า screen, ค่า clock สำหรับปรับ fps และ running เพื่อนำไปใช้กับ loop ของเกม ตัวแปร screen เก็บค่า "pygame.display.set_mode((1280, 720))" เป็นการเซ็ตหน้า window ให้เป็นขนาดกว้าง 1280 pixels และยาว 720 pixels
ตัวแปร clock เก็บค่า "pygame.time.Clock()" ซึ่ง Clock จะทำหน้าที่ด้านเวลาที่เกมดำเนินต่อไป เราสามารถดูหรือกำหนดค่า FPS ได้ที่เจ้าตัวนี่เลย
ต่อมาจะเป็น Loop หลักของเกม ถ้าไม่มีเกมก็จะไม่เริ่มต้น ใน while เราใส่ running ไว้เพื่อกรณีที่เราต้องการหยุดเกม เราก็ปรับค่า running เป็น False ได้เลย
ใน Loop นี้จะมีคำสั่งที่เรียงกันไปเพื่อทำหน้าที่ของมันในทุกๆ ครั้งที่ loop ทำงาน โดยตัวแรกก็คือ การเช็ค event Event ในเกมจะเป็นเหตุการณ์สำคัญต่างๆ ที่ถูกเก็บไว้ใน "pygame.event" เราสามารถต่อด้วย ".get()" เพื่อรับเหตุการณ์ต่างๆ ที่เกิดใน Loop ปัจจุบัน
ยกตัวอย่างเช่น เราต้องการรับค่าปุ่มที่ผู้เล่นกด หรือจะเช็คว่าผู้เล่นได้กดปุ่มอะไรไหม เราก็สามารถเช็คได้ใน event เลยนั่นเอง
แต่สำคัญๆ ที่เราจะต้องเช็ค event ตลอดก็คือการรอรับการกดปุ่ม "QUIT" หรือปุ่มออกเพื่อปิดเกมนั่นเอง เพราะถ้าไม่มีเราก็ใช้ปุ่มปิดไม่ได้ กดไปก็ไม่มีอะไรเกิดขึ้น (ยกเว้นว่าจะไป End task ใน Task Manager อ่านะ)
จากในภาพเราก็จะเห็นได้ว่าเริ่ม loop ก็มี "for event in pygame.event.get():" เพื่อรับ event จาก pygame.event แล้วนำมาใส่ใน event (และที่ต้อง for loop ก็เพราะว่าใน 1 loop ก็จะมีหลาย event นั่นเอง)
ต่อจากนั้นก็คือ "if event.type == pygame.QUIT:" นี่แหละก็คือการเช็คว่าผู้เล่นได้กดปิดเกมรึเปล่า โดย pygame.QUIT ก็คือตัวแปรหนึ่งที่เก็บค่าของปุ่มปิดนั้นเอง (เดี่ยวจะงงว่าปุ่มปิดที่ว่าคืออะไร สามารถดูภาพด้านล่างได้เลย)
และเพื่อ event ที่ผู้เล่นกดปุ่มปิดเกิดขึ้น ก็จะทำให้ ค่า "running = False" และปิดเกมไปในที่สุด
ต่อมาเป็น "screen.fill("purple")" สำหรับตัวแปร screen ก็คือตัวแปรที่เราตั้งเอาไว้ อันนี้ให้คิดว่า screen ก็คือหน้า window ตัวหนึ่งไปเลยก็ได้ ส่วน fill ก็คือใส่สีให้มัน ในที่นี่ก็คือสีม่วงนั่นเอง (และการใส่ fill ที่ screen มันก็คือการตั้งสี background นั่นแหละ)
เกือบจบล่ะ หลังจากนั้นจะเป็น "pygame.display.flip()" เอาง่ายๆ คือถ้าไม่ใส่ หน้า screen ก็จะไม่มีการเปลี่ยนแปลงใดๆ ให้เห็นเลย (เป็นเหมือนกับการ Update screen ใหม่)
สุดท้ายคือ "clock.tick(60)" เป็นการ set ว่าเกมใน 1 วินาที จะมี 60 loop ที่เกิดขึ้นั่นเอง (ก็คือ fps นั่นแหละ) ปิดท้ายด้วย "pygame.quit()" คือการหยุดการทำงานของ pygame เป็นการปิดจบได้อย่างสวยงาม
นอกจากนี้ เราสามารถอ่านวิธีการใช้งานเพิ่มเติมได้ผ่าน document ที่เว็บของ pygame เอง โดยคุณสามารถอ่าน document ต่าง ของ pygame ได้ที่ https://www.pygame.org/docs/ ในนี้จะอธิบายทั้งหมด และแยกหมวดหมู่อย่างชัดเจนมากๆ ทำให้การศึกษานั้นเป็นไปได้ง่ายเลยทีเดียว
เอาหล่ะ เนื้อหาตอนนี้ก็ยาวเกินมามากพอล่ะ ขอพอแค่นี้ก่อน แต่อาจจะมีบทความหรือบล็อกเกี่ยวกับการใช้ pygame มาอีก ยังไงก็รอติดตามกันได้นะ