Home > HTML5 > สร้างเกมส์ด้วย HTML5 ง่ายๆ (part3-1)

สร้างเกมส์ด้วย HTML5 ง่ายๆ (part3-1)

สร้าง Enemy Platform

มาถึง Part ที่ 3 กันแล้วนะครับ หลังจากที่เราได้เรียนรู้การใช้งาน Construct2 ใน Part 1 และสร้าง Player Platform ใน Part 2 กันไปแล้ว ในส่วนของ Part3 เราจะมาสร้าง Enemy Platform กันนะครับ ใน Part นี้ผมเชื่อว่าหลายคนจะเริ่มมึนนิดหน่อย เพราะอาจจะต้องมีความเข้าใจด้าน Logic ของ Programming นิดหน่อย แต่อย่าพึ่งกลัวครับ ยังไม่มีเขียนโค้ดคร้าบบ ^^

Enemy Concept

สรุปสั้นๆ ง่ายๆ ผมจะสร้าง Monster 2 ตัว เล็ก1 ใหญ่1 ไม่งอก 1 เย่ย ไม่เกี่ยว……. ต้องจัดการตื้บ Monster เล็ก ใหญ่ ให้หมด แล้วถึงจะสามารถ ไปรับ MacBook Air เป็นของรางวัลได้ คุณถึงจะเป็นผู้ชนะครับ ทั้งหมดเอาคอนเซ็ปต์แค่นี้ สั้นๆง่ายๆ แต่คุณสามารถต่อยอดเองได้ครับ ^^ มาดูวิธีการกัน

Enemy Object ที่เพิ่มเข้ามาใหม่

Little Monster : เดินตรงๆไปชนไม่ได้นะ พลังจะลด -1 ต้องกระโดดตื้บ 1 ที มันถึงจะตาย เหมือนเกมส์มาริโอ้ครับ ภาพนี้ผมโหลดมาจากเน็ตครับ คุณสามารถ Search คำว่า Sprite sheet แล้วก็เลือกดูตามใจชอบ เอาแบบที่มันเว้นช่องห่างกันแบบนี้จะได้ง่ายต่อการ Import Sprite Strip ครับ

Big Monster : ส่วนเจ้าตัวใหญ่จะพ่นไฟ ออกมา สร้างอุปสรรคในการกระโดด ถ้าคุณโดนไฟครอก พลังจะลด -1 ถ้าจะฆ่า ต้องโดดตื้บที่หัวมัน 3 ที ถึงจะตาย

Fire : ไฟโลกันต์ของเจ้า Big Monster อย่าเผลอไปโดนเข้าล่ะ ไม่งั้นพลังชีวิตจะถูก -1

MacBook & iPhone4s : เติม Gimmick ซะหน่อย ถ้ากระโดด โดน MacBook คะแนนเพิ่ม 100 ถ้ากระโดด โดน iPhone4s คะแนนเพิ่ม 50 คะแนน ^^

อ้อ ผมกำหนด Value(ว้าวยู่) พลังชีวิต(Health) ของ Player เอาไว้สามารถโดน Enemy Object ได้แค่ 3 ครั้งนะครับ ถ้าหากโดนไฟครอก หรือโดน Monster จะลบพลังชีวิตทีละ 1 จนเหลือ 0 ก็จะขึ้นข้อความว่า You Lose!!! แล้วก็เริ่มเกมส์ใหม่ โดยตั้งเวลาก่อนเริ่มเกมส์ 4 วินาที นับจาก Player ตายนะครับ และถ้า เก็บ Items ได้ครบทั้งหมด 4 Items ก็เป็นอันจบเกมส์ จะมีข้อความว่า You Win!!! แสดงผล

เอาละทีนี้มาดูตัวอย่างว่า เวลาเล่นเกมส์จริงๆหน้าตาจะเป็นอย่างไรกันก่อน เพื่อจะได้เห็นภาพรวมของเกมส์ครับ
View Game Demo

สำหรับ Tutorial Part3 จะไม่เน้นสาธิตวิธีการ Import ภาพ การ Strip การจัดวางภาพ เพราะได้เขียนไว้แล้วในตอนก่อนๆนะครับ ดังนั้น สิ่งที่จะเน้นใน Part3 จะเป็นเรื่องของการกำหนดเงื่อนไขให้กับ Object ต่างๆมากกว่า ดังนั้น หากงง เรื่องที่กล่าวมาข้างต้นลองกลับไปดูที่ Part1, Part2 ก่อนนะครับ ^^

Step 1 : เริ่มกันเลย!!!

จากภาพด้านล่าง เป็นการจัดวาง Object Image และ Text บน Layout ซึ่งเราเตรียมไว้ตั้งแต่ Part2 ทีนี้มาดูขั้นตอนการจัดวางว่ากันครับ

ผมจะอธิบายไปตามตัวเลข ในฉากนะครับ

Object 1-3 : เป็นการนำ Text เข้ามาในฉาก วิธีการให้ Double Click ที่พื้นที่นอก Layout ฉาก จะขึ้น Dialogue แล้วเลือก Text ครับ

กด Insert เข้ามาแล้วคลิกที่ Layout 1 ครั้ง จะขึ้นเป็น Text Scale ตามภาพ เราสามารถปรับ Scale ได้ครับ

ต่อมาให้ทำการเปลี่ยนชื่อ เพื่อเวลาเรียกใช้งานจะได้ไม่งงครับ โดยสร้างตัวแปร Text ผมตั้งชื่อตัวแปรมี txt…. นำหน้าให้รู้ว่าเป็นตัวแปรของ text ครับ ตัวแปรนี้จะนำไปใช้ในขั้นตอนการสร้างเงื่อนไขให้เกมส์ครับ แต่ก็แล้วแต่ครับจะตั้งเป็นอะไรก็ได้ อย่าให้เรา กับ คนที่มาช่วยทำ Game ต่อ งง เป็นใช้ได้ 555+

พลังชีวิต(Health)
Object type properties : txtHealth
Properties : Health

จำนวน Items (CountKill)
Object type properties : txtCountKill
Properties : CountKill

คะแนน (Score)
Object type properties : txtScore
Properties : Score


ผมมี Text อีก 2 ข้อความครับ แต่วางไว้นอก Panel เพราะว่ายังไม่อยากเอามาวางให้รกพื้นที่ คือคำว่า You Win!!! เอาไว้แสดงผลตอนผู้เล่นชนะ และ You Lose!!! แสดงตอนที่ผู้เล่นแพ้

ผมมีตัวอย่างการกำหนดค่าครับ แต่เฉพาะ You Lose!!! นะ (ส่วน คำว่า You Win!!! วิธีการทำเหมือนกันครับ)

Object type properties : youLose – ตั้งชื่อ Properties ครับ เอาไว้ใช้อ้างอิง ในขั้นตอนการกำหนดค่าต่างๆใน Event

Properties Text
: You Lose!!!- ใส่คำว่า You Lose!!! เวลาผู้เล่น แพ้ ก็ขึ้นข้อความนี้

Properties Initial Visibility : Invisible- กำหนดให้ไม่แสดงผล จริงๆผมวางอยู่นอก Game Layout มันก็ไม่เห็นอยู่แล้ว แต่ทำตัวอย่างให้ดูครับ ว่า…ถ้าจะแสดง(Visibility) หรือ ไม่แสดงอะไร (Invisibility) เขากำหนดตรงไหนกันนะ ^^

อ้าวเฮ้ย !!

แล้วถ้ามันอยู่นอก Game Layout แล้วมันจะไปแสดงใน Game ได้ยังไง ไม่ต้องห่วงครับ เราสามารถกำหนดจุด Position ให้มันไปโผล่แสดงผลในเกมส์ได้ครับ (อยู่ใน Step2 ข้างล่างนี้ครับ จายเย็น ^^)

Object 4 : Player มีการปรับนิดนึง คือลาก Object ให้อยู่สูงกว่าพื้น Solid เพราะตอนเริ่มต้น มันจะหล่นลงมาที่พื้น Solid ให้เอง ตามน้ำหนักแรงดึงดูด(Gravity) และให้กำหนด Instance variables ขึ้นมา คือ health:3 เพื่อฝังค่าพลังชีวิตลงไปใน Player

Object 5-6 : สำหรับ ภาพ iPhone, MacBook ผมทำเป็น .PNG พื้นหลัง Transparent แล้วก็ Import Sprite ตามปกติ

Object 7 : ผมตั้งชื่อว่า Little Monster เจ้าตัวเล็กนี้ไม่มีพิษสงอะไรมาก แต่เดินไปชนตัวไม่ได้ พลังชีวิต Player -1 ทันที ต้องกระโดดตื้บ (มาริโอ้ คอนเซ็ปต์) ถึงจะผ่านไปได้ ใน Object type properties ผมตั้งชื่อให้เป็น littleMonster

Object 8 : ไฟร้อนๆ พ่นจากปากเจ้า Big Monster ถ้า Player โดนเข้าไปละก็พลังชีวิต(Health)จะถูก -1 ทันที Object type properties ผมตั้งชื่อให้เป็น Fire

Object 9 : ผมตั้งชื่อว่า Big Monster เจ้าตัวใหญ่ นี่พิษสงร้ายกาจ พ่นไฟออกมาตลอดทุกๆ 2 วินาที แถม Random Angle ที่ 180 – 200 อีกด้วย(ยังไม่ต้อง งง ครับ เดี๋ยวอธิบายข้างล่าง ว่าทำไมถึงตั้งองศาแบบนี้ครับ จายย เย็นๆ) ส่วน Object type properties ผมตั้งชื่อให้เป็น bigMonster

** ผมใส่ bigMonsterHealth เอาไว้ เพื่อเช็คจำนวนพลังชีวิตที่เหลือของเจ้า Big Monster ดังนั้น Text นี้จะมี หรือไม่มีก็ได้นะครับ แต่ถ้ามี ก็ทำเหมือนกับ Text (Object 1-3) ครับ ผมข้ามเลยนะครับ

Step 2 : กำหนด Event ให้กับ Object

ผมจะพยายามอย่างเต็มที่ เพื่ออธิบายให้ งง น้อยที่สุด ครับ ถ้าหากสงสัยตรงไหนโพสต์ถามได้ใน Comment หรือที่หน้า Fanpage ก็ได้ครับ ^_^ เอาละ อย่าพึ่งรีบ งง เรามาทำความเข้าใจโครงสร้างกันก่อน ใน Event Tab นั้นจะเป็นจุดที่เรากำหนดเงื่อนไข ส่วนต่างๆ ของเกมส์ ไม่ว่าจะเป็นการควบคุม Mouse, Keyboard, Touch(สำหรับมือถือ) รวมถึง Object ที่เป็นส่วนประกอบต่างๆในเกมส์ ทั้ง Player และ Enemy ล้วนแล้วต้องกำหนดใน Event Tab นี้ทั้งหมดครับ

ผมแบ่งออกเป็นส่วนๆ ตามนี้

A : Global Variable

จะเป็นจุดที่กำหนด Global Variable หมายความว่า เราจะประกาศค่าให้กับตัวแปรเป็นแบบ Global ซึ่งตัวแปรเหล่านี้ผมเปรียบเทียบเหมือนกับ ดาวเทียมไทยคมครับ ตัวแปรพวกนี้ทำหน้าที่เหมือนดาวเทียม ตรงที่ว่า มันจะอยู่ในที่สูงๆ และสามารถส่งสัญญาณภาพ จากประเทศนึง ไปอีกประเทศนึงได้ โดยส่งขึ้นไปที่ดาวเทียมก่อน แล้วดาวเทียมจะส่งไปอีกประเทศให้เอง

เพราะถ้าคุณจะส่งสัญญาณจากพื้นโลก จากประเทศหนึ่ง ไปประเทศอีกทวีปหนึ่งคนละฟากโลก มันไม่มีทางส่งไปได้แน่นอนเพราะมันไกลเกินกำลังส่ง ดังนั้น จึงต้องมี Global Variable เป็นตัวช่วยส่งค่าให้กับทุก Event หรือ Action ที่ต้องการเรียกใช้ได้ทุกๆ Function กันเลยทีเดียว

ตรงนี้เป็นความรู้พื้นฐานด้านการเขียนโปรแกรม ซึ่งอาจจะต้องทำความเข้าใจก่อน แต่ไม่ยากครับ เราแค่รู้ แล้วกำหนดค่าตามนั้น ไม่ได้ไปเขียนโปรแกรมจริงๆซะหน่อย ว่าป่ะ ^^ อย่าไปเครียด….

วิธีการสร้างนะครับ

1. คลิกขวา ตรงพื้นที่สีเทาๆ เลือกที่ Add global variable

2. กำหนดค่าต่างๆ ตามภาพ ผมยกตัวอย่าง การกำหนดค่า varCountKill =0 ส่วนตัวแปรตัวอื่นๆก็ใช้วิธีเดียวกันครับ

อธิบายการกำหนดค่าต่างๆดังนี้

varCountKill = 0 : กำหนดเพื่อเป็นค่าเริ่มต้นตัวแปรสำหรับเช็คจำนวน Items ที่เก็บได้ทั้งหมด ซึ่งจะมี Little Monster, iPhone, MacBook, BigMonster

varCreateFire = 0 : กำหนดเพื่อเป็นเงื่อนไขเช็คว่า BigMonster ถูกทำลายหรือยัง เพราะถ้า BigMonster ถูกทำลาย เราจะทำลาย Fire, txtBigMonsterHealth, Bar2(Solid ที่วางอยู่บนหัวของ BigMonster เพื่อเช็คการชนจากด้านบน ก็คือกระโดดมาตื้บ เหมือนกับ Little Monster แต่เรามีเงื่อนไขพิเศษคือให้กระตื้บ BigMonster 3 ครั้ง ถึงจะตาย ดังนั้นนึงใช้วิธีการเดียวกับ Little Monster ไม่ได้ครับ)
เฮ้ย!!! แล้ว Bar2 มาจากไหน?

ผมสร้างภาพสี่เหลี่ยมผืนผ้าเล็กๆ จากโฟโต้ช๊อป แล้ว Import sprite เข้ามา ตามปกติครับ แต่ผม Set Opacity =0 เพื่อจะได้ไม่ต้องมองเห็นครับ
varBigMonsterHealth = 3 : กำหนดเพื่อเก็บค่าพลังของ Big Monster

varScore = 0 : กำหนดเพื่อกำหนดค่าเริ่มต้นของคะแนน

B : กำหนด Event ให้กับตัวแปร

ทำความเข้าใจนิดนึง ถ้าในเชิงตรรกกะการเขียนโปรแกรม จะมี IF…….Then………ELSE……. ใน Construct2 ก็มี แต่จะอยู่ในรูปแบบของ Event………Action…………. คือ ถ้าเหตุการณ์ Event นี้เกิดขึ้น แล้วให้แสดงผล Action ตามนี้

B1 : กำหนดการแสดงผลให้กับ Text

Add Event

ทำไมถึงใช้ System : EveryTick เพราะเราต้องการเช็คข้อมูลใหม่ที่มีการอัพเดท Action ตลอดเวลา จะว่าไปก็เหมือนการ Refresh ของพวกโปรแกรม Chat สมัยก่อน เวลาใครพิมพ์ไรใหม่เข้าไป ต้องรอมัน Refresh แป๊บนึง จึงจะแสดงข้อความได้ เหตุผลเดียวกัน ข้อมูลใน Text พวก จำนวนพลังชีวิต / จำนวนคะแนน / จำนวน Items พอตัว Player มันไปทำงานตามคำสั่ง ก็จะมีการอัพเดททันที ตรงนี้แหละ คือ เหตุผลที่ทำไมถึงใช้ System : EveryTick นะครับ

Add Action

ต่อมาในส่วนของการ แสดงข้อมูลส่วนของ Action เราสามารถสร้างได้มากกว่า 1 Action ต่อ 1 Event

ดังนั้นเมื่อคลิกที่ Add action > txt……. อะไรก็แล้วแต่ เราต้องไปกำหนดค่าที่ Set text ครับ

กำหนดค่าลงไป

จากตัวอย่างภาพด้านล่าง “Health : “ ใน Double Quote จะมีคำว่า Health : ใน Double Quote นี้จะแสดงผลใน Game นะครับ (อย่าสับสนนะครับ ใน Text Object 1-3 เรามองเห็นใน Layout Tab เท่านั้น ส่วนการกำหนด Parameter ในช่อง Set text นี้ทำเพื่อแสดงผลใน Game )

ส่วน &Player.health เป็นการกำหนดให้แสดงพลังชีวิตของ Player สังเกตุ จะมี .health ตามหลัง เราอ้างอิงค่ามาจาก Instance variables (ลองเลื่อนไปดู ตรงที่เรากำหนดไว้ใน Instance variables ของ Player ครับ Object4 )

ตัวแปร varScore เป็น Global variable ไม่ได้อ้างอิงกับ Object ที่มีตัวตนอย่าง Player จึงกำหนดค่าได้เลย เช่น “Score : “&varScore เป็นต้น

ผมพยายามจะเปรียบเทียบด้วยภาษาง่ายๆ สำหรับคนไม่มีพื้นฐานการเขียนโปรแกรม แต่ไม่รู้จะเปรียบได้ชัดแค่ไหน อาจจะ มึนนิดๆ แต่พยายามลองผิด ลองถูกครับ เดี๋ยวจะเข้าใจเองครับ :-) เอาละทีนี้กำหนดให้กับทุกๆตัวแปร Text กันเลย ครับ ใครมึนๆ ก็พยายามเทียบกับภาพตัวอย่างดูนะครับ

B2 : กำหนดเงื่อนไขเมื่อผู้เล่นชนะ

Add Event

System : varCountKill = 4

ผมจะสร้างเงื่อนไขขึ้นมา ถ้าหาก Player สามารถ เก็บได้ทั้ง 4 Items ก็ให้แสดงข้อความประกาศว่า You Win!!! จำได้ไหมครับว่า เรามี Text อยู่นอก Layout ก็คือ You Lose!!! / You Win!!! นี่คือการ กำหนดให้ Text มาแสดงผลที่ Game ครับ

Add Action

[T]youWin : Set Visible เป็นการกำหนดให้แสดงครับ ถ้าเราต้องการปิดไว้ก็เลือกเป็น Invisible ครับ

[T]youWin : Set position to (162,161) ตัวเลขในวงเล็บคือ (x,y) จุดที่เราต้องการแสดงข้อความ Text ส่วนตัวเลขผมก็ลองลากไปวางตำแหน่งที่ผมต้องการใน Layout แล้วจดเอาไว้ว่าจะเอาตำแหน่ง X, Y นี้ แล้วค่อยเลื่อนเอา Text ทั้ง You Win!!! และ You Lose!!! ออกไปไว้นอก Layout เพื่อไม่ให้เกะกะสายตาครับ

System : Wait 4 seconds เป็นการกำหนดว่าให้เกมส์รอ 4 วินาที เพื่อให้ผู้เล่นทันเห็น Text แสดงคำว่า You Win!! ก่อน

System : Go to Layout1 เป็นการบอกให้โปรแกรมเริ่มฉากใหม่

System : Reset global variables to default เป็นการเคลียร์ค่าเก่าที่เล่นได้ให้เป็นค่าเริ่มต้นใหม่ เพราะเวลาเริ่มเกมส์อีกครั้ง ค่าเก่า จะได้ไม่เอามาคำนวนครับ

B3 : กำหนดเงื่อนไขพลังชีวิต Player


Add Event

System : health <= 0 ตั้งเงื่อนไขกรณีพลังชีวิตหมด เหลือ 0 จริงๆจะใช้แค่ = ก็พอ เพราะการคำนวนไม่ติดลบอะไรครับ

Add Action

Player : Destroy แปลตรงๆตัวเลยว่าทำลายทิ้งเมื่อคุณพลังชีวิตเหลือ 0

[T]youLose: Set Visible กำหนดให้มีการแสดงผล คำว่า You Lose!!!

[T]youLose: Set position to (162,161) ตัวเลขในวงเล็บคือ (x,y) จุดที่เราต้องการแสดงข้อความ Text ส่วนตัวเลขผมก็ลองลากไปวางตำแหน่งที่ผมต้องการใน Layout แล้วจดบันทึกเอาไว้ในกระดาษว่าจะเอาตำแหน่ง X, Y นี้ แล้วค่อยเลื่อนเอา Text ทั้ง You Win!!! และ You Lose!!! ออกไปไว้นอก Layout เพื่อไม่ให้เกะกะสายตาครับ เป็นวิธีง่ายๆครับ เพราะใน Construct2 ยังไม่มี Alignment Feature มาให้ใช้กัน

แต่ถ้าอยากลองผมแนะนำได้ครับ ที่แกน X : WindowWidth / 4 แทนตัวเลข 162 และที่แกน Y : WindowHeight / 4 แทนตัวเลข 161 ก็จะได้ตำแหน่งกลางๆหน้าเกมส์แล้วครับ เหตุที่ หารด้วย 4 ไม่ได้หาร 2 เพราะว่า WindowWidth เป็นความกว้างของฉากทั้งหมดครับ ก็ต้องคำนวนหารเอาตามส่วนทีละครึ่ง ^^ พอๆ ลึกไปกว่านี้ อาจจะงง จนหมดกำลังใจ ข้ามๆ Paragraph นี้ไปก็ได้ครับ

System : Wait 4 seconds เป็นการกำหนดว่าให้เกมส์รอ 4 วินาที เพื่อให้ผู้เล่นทันเห็น Text แสดงคำว่า You Lose!! ก่อน

System : Reset global variables to default เป็นการเคลียร์ค่าเก่าที่เล่นได้ให้เป็นค่าเริ่มต้นใหม่ เพราะเวลาเริ่มเกมส์อีกครั้ง ค่าเก่า จะได้ไม่เอามาคำนวนครับ

C : Move Player Group

ตอนนี้จะเห็นว่า เอ๊ะ มันโผล่! มาจากไหน คำว่า “MovePlayer” มันคือการตั้ง Group ให้กลุ่มคำสั่งเดียวกันครับ ซึ่งผมได้เก็บคำสั่งของการควบคุม Player ทั้งหมดไว้ใน Group นี้ ข้อดีคือมันพับ(Collapse) และเปิด (Expand) ได้ เมื่อต้องการครับ

วิธีการสร้าง Group ง่ายมากๆๆๆๆๆๆๆ

คลิกขวาตรงพื้นที่ว่าง > Add group > ตั้งชื่อ MovePlayer แค่นี้เองง่ายๆ ตามภาพเลยครับ

เสร็จแล้ว ให้ลากคำสั่งทั้งหมด (ที่เราทำไว้ใน Part2 ตอน 3 และ Extend) เอาเข้าไปไว้ในนี้ ก็จะได้เป็นแบบภาพด้านล่างครับ

เอาละครับหน้าเริ่มยาว มาถึงตอนนี้ ผมว่าพัก Part3 ตอน 1 ไว้ก่อนดีกว่า เรามาครึ่งทางแล้วครับ เหลืออีกครึ่งก็จะได้เกมส์เล่นขำๆ แต่สร้างด้วย HTML5 กันแล้ว ใคร งง พยายามทบทวนจาก Part ก่อนๆดูนะครับ หากสงสัยโพสต์ถามได้เลย ยินดีตอบครับ ^^

Related Articles


About the author

นาย ณัฐพงศ์ พันธุศิลป์ (กอล์ฟ) Website Manager Unicorn Max Co.,Ltd.

Website : http://www.unicornmax.com

Facebook : http://www.facebook.com/unicornmax

Twiter :


  1. September 3rd, 2012 at 01:02 | #1

    กำลังมันส์เลยครับ อยากทำเกมส์แบบ ออนไลน์ เล่นแบบ MutiPlayer แบบ RealTime เห็นๆหลายๆคนพร้อมกันอะครับ ได้ยินเกี่ยวกับเทคโนโลยี WebSocket อะครับ นำมาประยุกค์ใช้กับเกมส์นี้ได้ไหม

    อีกคำถามครับ ในเอนจิ้นเห็นมี AJAX เกี่ยวกับการติดต่อ Server ไหมครับ

  2. September 3rd, 2012 at 11:11 | #2

    ได้ครับ รู้สึกจะใช้ socket-io plugin ลองดูคลิปนี้ครับ http://www.youtube.com/watch?v=vIdpc5N0pZw

  3. ครูบ้านนอก
    September 13th, 2012 at 16:16 | #3

    เพิ่งจะได้โปรแกรมมา ขอลองก่อนนะคะ คิดว่าเด็กๆคงชอบถ้าบูรณาการกับบทเรียน
    ขอบคุณมากคะ

  4. September 14th, 2012 at 10:48 | #4

    ผมเองถ้ามีเวลา จะลองทำเกมส์สอนเด็กประถม สักเกมส์ พอดีคุณแม่เป็นคุณครูสอนระดับประถมศึกษาเหมือนกันครับ ^^

  5. Dearika
    October 20th, 2012 at 20:31 | #5

    คือ รบกวนถามหน่อยค่า อยากทราบว่า โปรแกรมนี้ เอาไปทำเกมแนวตอบปัญหาได้ไหมคะ หรือว่ามีโปรแกรมอื่นที่ใช้งานสะดวกกว่า (คือหนูทำซีเนียร์โปรเจกต์เวป HTML5 แนว eLearning ค่ะ)

  1. No trackbacks yet.