ยินดีต้อนรับทุกท่านสู่ ไทยเกมสตูดิโอ นะค่ะ


เว็บสอนสร้างเกมส์ สอนเขียนเกมส์ 3D 2D GAMEDEVELOPMENT รับทำเกม สอนทำเกม 2D/3D C++ C# XNA SDL รับทำ FLash game สอนสร้างเกมส์2มิติ สอนสร้างเกมส์3มิติ สอนสร้างเกมส์2มิติโดย IG Maker และ BannedStory มันส์ๆ บริการสร้างเกมส์ สื่อการเรียนการสอน CAI animation การ์ตูนวันเกิด การ์ตูนรับปริญญา การ์ตูนแต่งงาน animation wedding
บทความการพัฒนาเกม
------------------------------------------------------------------------------------------------------
ความรู้เกี่ยวกับการสร้างเกมเบื้องต้นประเภทของเกมส์คอมพิวเตอร์
RTS = Real Time Strategy ก็คือเกมแนววางแผนการรบ (ควบคุมยูนิตหลายๆตัวมาสู้กัน/สร้างฐานสู้กัน) อย่างพวก RedAlert
TBS = Turn-Base Strategy เกมแนววางแผนแบบผลัดกันเล่นคนละตา (คนที่เคยเล่นเกมแน Ts Online จะนึกออก)
Simulation = จำลองอะไรสักอย่างเป็น เกมส์ประเภทนี้จะมีการบังคับที่ซับซ้อนมาก
โดยปกติแล้วคนทั่วๆมักจะเข้าถึงเกมส์แนวนี้ยาก แต่ถ้าคุณ เข้าถึง มันเมื่อไหร่แล้วละก็...
รับรองว่า คุณจะเล่นแบบโดยที่ไม่ลุกจากเก้าอี้ทีเดียวเพราะความคื่นเต้นจากเกมส์ชนิดนี้
แต่หากคุณเข้าใจ (Microsoft Flight Simulator)
Racing = เกมแนวที่ใช้ความเร็ว เช่น เกมรถแข่งต่างๆ อย่าง Need For Speed
Action = เกมต่อสู้อะไรต่างๆ เช่น Contra
FPS = First Person Shooting เดินหน้าฆ่าแหลก มุมมองบุคคลที่ 1(เห็นเหมือนเป็นคนจริงๆ คือจะไม่เห็นตัวเอง เห็นแค่ข้างหน้า) บางครั้งรวมไว้ใน Action เช่น Counter-Strike
TPS = Third Person Shooting เดินหน้าฆ่าแหลก มุมมองบุคคลที่ 3(เห็นตัวละครของเราด้วย) บางครั้งรวมไว้ใน Action เช่น GunZ
RPG = Role Playing Game ส่วนมากเก็บเกมแนวที่ต้องเก็บประสบการณ์ไปเรื่อยๆ ใช้เวลาในการเล่นค่อนข้างนาน เช่น Final Fantasy ที่รูกจักกันดี
Puzzle = เกมแนวใช้สมอง ทำให้หลายๆคนเบื่อเกมแนวนี้(คิดไม่ออก)
BoardGame = พวกเกมกระดานต่างๆ เกมพวกนี้มีหมวดหมู่ไม่แน่ชัด บางทีรวมอยู่ใน puzzle บางครั้งอยู่ใน TBS บางครั้งอยู่ใน
Sim(Yu-Gi-Oh! แบบดวลการ์ด หรือ Capsule Monster)
Adventure = เกมแนวผจญภัย(Knight's Quest)
Side Scrolling Game = เกมแนวเดินๆ กระโดดๆ เหยียบๆ บางครั้งถูกรวมไว้ใน Adventure(Mario)
Fighting = เกมแนวสู้กัน พวกลูกเตะชูริวเคน(Street Fighter)
บทความการพัฒนาเกม บนมือถือ
ภูมิหลังและความเป็นมา
ปัจจุบันการพัฒนาอุปกรณ์ขนาดเล็กเป็นที่สนใจมากขึ้น เพียงแต่อุปกรณ์ขนาดเล็กมีข้อจำกัดในด้านทรัพยากรของตัวอุปกรณ์ แต่อย่างไรก็ตามอุปกรณ์ขนาดเล็กก็ได้พัฒนาอย่างมาก และเพิ่มขีดความสามารถต่างๆ ไม่ว่าจะเป็น ส่วนติดต่อผู้ใช้ (Graphic User Interface) จำพวกกราฟิกมีความสวยงามน่าใช้ขึ้น เสียงที่มีเครื่องดนตรีต่างๆ (Polyphonic) และที่สำคัญคือสามารถให้นักพัฒนาหรือผู้ใช้ได้เขียนโปรแกรมเพื่อใช้งานบนอุปกรณ์
อุปกรณ์ขนาดเล็กมีข้อดีที่ว่าสามารถพกพาไปไหนมาไหนได้สะดวก ซึ่งอุปกรณ์ที่เลือกพัฒนาในที่นี้คือโทรศัพท์มือถือ โดยจะพัฒนาเกมที่ใช้เล่นบนโทรศัพท์ ทางผู้ผลิตได้ติดตั้งไลบรารี่ (Library) เฉพาะระบบของโทรศัพท์แต่ละรุ่นไว้ ภาษาที่ใช้ในการเขียนแอพพลิเคชั่นก็มีหลายภาษา ตั้งแต่ วิชัลเบสิก (Visual Basic), ซีพลัสพลัส (C++) จนไปถึงภาษาที่มีสคริปต์เฉพาะตัว แอพพลิเคชั่นที่เขียนขึ้นจึงเขียนเพื่อใช้กับอุปกรณ์หนึ่งซึ่งบางครั้งไม่สามารถนำไปใช้กับอุปกรณ์อื่นๆ ได้ ภาษาจาวา (Java) ถือเป็นอีกภาษาหนึ่งที่นิยมนำมาพัฒนาแอพพลิเคชั่นบนโทรศัพท์มือถือ ซึ่งบริษัทซันไมโครซิสเต็มส์ ออกแพลตฟอร์มที่นำไปใช้กับอุปกรณ์ขนาดเล็กคือ J2ME (Java 2 Micro Edition) ซึ่งได้รับการออกแบบโดยเน้นกลุ่มผู้ใช้อุปกรณ์อิเล็กทรอนิกส์
จะเห็นได้ว่าปัจจุบันมีเกมที่ถูกพัฒนาขึ้นโดยภาษาจาวาให้เห็นอยู่ทั่วไป ซึ่งการพัฒนาเกมขึ้นมาอีกจะเป็นทางเลือกให้ผู้บริโภคได้มีโอกาสเล่นเกมที่แตกต่างจากที่เคย และสามารถที่จะพัฒนาต่อไปให้มีคุณภาพยิ่งขึ้น
1.2 วัตถุประสงค์
1.2.1 เพื่อศึกษาและพัฒนาเกมสำหรับเล่นบนโทรศัพท์มือถือ โดยใช้ J2ME ซึ่งเป็นแพลตฟอร์มจาวา
1.2.2 เรียนรู้การเขียนแอพพลิเคชั่นให้ทำงานบนโทรศัพท์มือถือ
1.2.3 เพื่อศึกษาและฝึกทักษะการเขียนอัลกอริทึมในเชิงปัญญาประดิษฐ์ (AI)
1.2.4 เพื่อศึกษาการออกแบบกราฟิกแอนนิเมชั่น
1.3 ขอบเขตการศึกษา
พัฒนาเกม ที่สามารถเล่นบนโทรศัพท์มือถือ Nokia ระบบ Symbian S60โดยใช้ J2ME (Java 2 Micro Edition) ซึ่งเป็นแพลตฟอร์มจาวา ขอบเขตของเกมมีดังนี้
1.3.1 ฉาก จำนวน 7 ฉาก ต่อกัน เป็นการจำลองฉากภายในสถานศึกษาแห่งหนึ่ง โดย
- ทุกฉากจะมีมอนสเตอร์ระดับ Boss
- เมื่อฆ่า Boss จะเลื่อนฉากไปฉากถัดไป และเกมจะทำการ ฟื้นหลังชีวิตให้เต็ม
1.3.2 ตัวละคร ประกอบด้วย
- ผู้เล่น (ตัวหลัก)
- AI (คู่หูผู้เล่น)
- Monster (ศัตรู) สามารถแบ่งออกเป็น
- Monster ระดับต่ำ (Easy)
- Monster ระดับกลาง (Normal)
- Monster ระดับสูง (Hard)
- Monster ระดับหัวหน้า (Boss)
1.3.3 คุณลักษณะของตัวละคร
- ทุกตัวละคร สามารถเคลื่อนที่ได้ 4 ทิศทาง คือ เดินหน้า ถอยหลัง ขึ้นบน ลงล่าง และการโจมตีระยะประชิด (ด้านหน้าและด้านหลัง)
- ผู้เล่น
- พลังชีวิต : 15
- พลังโจมตี : 3
- สามารถเก็บไอเท็มที่ตกจากการฆ่ามอนสเตอร์มาใช้งานได้
- AI (คู่หูผู้เล่น)
- พลังชีวิต : ไม่จำกัด (อมตะ)
- พลังโจมตี : 1
- สามารถเดินหามอนสเตอร์ได้
- จะไม่โจมตีมอนสเตอร์ตัวเดียวกับผู้เล่น
- เมื่อเห็นพลังชีวิตของผู้เล่นลดต่ำ จะโยน ยาฟื้นพลังมาให้เก็บ
- Monster
- สามารถเดินหาผู้เล่นได้
- จะโจมตีผู้เล่น และ AI เมื่ออยู่ในระยะที่โจมตีได้
- เมื่อตายมีโอกาสสุ่มดรอปไอเท็มตามความเหมาะสม
- Monster ระดับต่ำ
- พลังชีวิต : 6
- พลังโจมตี : 1
- เดินเข้าหาผู้เล่นเพื่อโจมตี
- Monster ระดับกลาง
- พลังชีวิต : 15
- พลังโจมตี : 2
- เดินเข้าหาผู้เล่นเพื่อโจมตี
- เมื่อผู้เล่นฟัน มอนสเตอร์จะหยุด(เดิน) และเมื่อผู้เล่นหยุดฟันมอน สเตอร์จะเดินเข้ามาโจมตี
- Monster ระดับสูง
- พลังชีวิต : 24
- พลังโจมตี : 3
- เดินเข้าหาผู้เล่นเพื่อโจมตี
- เมื่อผู้เล่นฟัน มอนสเตอร์จะหยุด(เดิน) และเมื่อผู้เล่นหยุดฟันมอนสเตอร์จะเดินเข้ามาโจมตี
- เมื่อผู้เล่นโจมตีโดนมอนสเตอร์ มอนสเตอร์จะเดินหนี
- เมื่อมอนสเตอร์อยู่หลังผู้เล่น มอนสเตอร์จะเดินเข้ามาโจมตี
- Monster ระดับ Boss
- พลังชีวิต : 70
- พลังโจมตี : 5
- เดินเข้าหาผู้เล่นเพื่อโจมตี
- เมื่อผู้เล่นฟัน มอนสเตอร์จะหยุด(เดิน) และเมื่อผู้เล่นหยุดฟันมอนสเตอร์จะเดินเข้ามาโจมตี
1.3.4 ไอเท็ม (Item) คืออุปกรณ์ที่สามารถนำมาใช้งานได้ สามารถหาได้จาก การสุ่มหล่นจากการฆ่ามอนสเตอร์ภายในเกม ประกอบด้วย
- ยาฟื้นพลัง สามารถฟื้นพลังชีวิตได้ 5 พลังชีวิต
- สนับมือ เพิ่มพลังโจมตี +1
- มีด เพิ่มพลังโจมตี +2
1.3.5 ระบบเกม
- ในแต่ละฉาก จะกำหนดให้มีมอนสเตอร์ดังนี้ คือ 10 ,10 ,15 ,20 ,20 ,25 ,Boss และในแต่ละฉากจะมีระดับมอนสเตอร์ที่ต่างกัน เมื่อกำจัดมอนสเตอร์จนหมด จึงจะไปฉากถัดไปได้ โดยไม่สามารถย้อนกลับไป ฉากเดิม
- มีระบบโปรไฟล์ สำหรับเก็บชื่อผู้เล่น ,Score ,ตัวละคร และ การหยุดเกมส์โดยสามารถกลับมาเล่นต่อในโปรไฟล์เก่าของเราได้
- มีการจับเวลา เพื่อเก็บสถิติ High Score
- ผู้เล่นจะชนะก็ต่อเมื่อ ฆ่า Boss ที่ฉากสุดท้ายได้
- ผู้เล่นจะแพ้ก็ต่อเมื่อ พลังชีวิตหมด
1.4 ผลที่คาดว่าจะได้รับ
1.4.1 ได้ Software Games ที่สามารถเล่นบนโทรศัพท์มือถือระบบ Symbian S60 ได้จริง
1.4.2 ได้รับความรู้เกี่ยวกับการเขียนโปรแกรม ภาษา Java
1.4.3 ได้รับความรู้เกี่ยวกับอัลกอริทึมในเชิงปัญญาประดิษฐ์ (AI)
1.4.4 ได้ความสนุกสนานเพลิดเพลินจากระบบเกมและความสวยงามของเกม 1.6 อุปกรณ์และซอร์ฟแวร์ที่คาดว่าจะใช้
1.6.1อุปกรณ์ Software ที่ใช้ในการพัฒนาระบบ
- Microsoft Window XP
- NetBeans IDE 6.8
- Program Java 2 Micro Edition Wireless Toolkit
- Program Java 2 Platform Standard Edition , J2RE & j2SDK
- Adobe Photoshop CS3
- Emulator ของโทรศัพท์มือถือ Nokia ระบบ Symbian S60
- Microsoft Word 2003
- Microsoft Power point 2003
1.6.2 อุปกรณ์ Hardware ที่ใช้ในการพัฒนาระบบ
- เครื่อง Personal Computer
- โทรศัพท์มือถือ Nokia รุ่นN73
ทฤษฎีและเทคโนโลยีที่เกี่ยวข้อง
2.1 กล่าวนำ
ในปัจจุบันการเล่นเกมบนมือถือนั้นกำลังเป็นที่นิยม เพราะเทคโนโลยีของโทรศัพท์มือถือในยุคนี้ก้าวไกลมาก และเป็นสิ่งที่ทุกคนในสังคมต้องมีติดตัวตลอดเวลาเพื่อใช้ในการติดต่อสื่อสารกัน นอกจากนี้มือถือยังมีประโยชน์อีกมากมาย ทั้งในด้านการศึกษา ด้านการเก็บข้อมูลต่างๆ ลงในมือถือ และด้านการนันทนาการ เป็นต้น เกมบนโทรศัพท์มือถือจึงเป็นที่นิยมเพราะเล่นได้สะดวก ไม่จำเป็นต้องหาอุปกรณ์เสริม และการเล่นเกมบนโทรศัพท์มือถือเป็นการเล่นเพื่อคลายเครียดในยามว่างได้ดีทางหนึ่ง ดังนั้นการเล่นเกมบนโทรศัพท์มือถือจึงได้รับการยอมรับจากผู้ใช้มือถือว่าเป็นสิ่งที่สามารถสร้างความเพลิดเพลินได้ไม่น้อย เกมบนโทรศัพท์มือถือจึงได้รับความนิยมจากผู้ใช้โทรศัพท์มือถือเป็นอย่างมาก
ในยุคสมัยปัจจุบันนี้ มีการนำระบบ Artificial Intelligent ใส่ลงไปในซอฟต์แวร์เกมเกือบแทบทุกเกม ดังนั้นทางผู้จัดทำจึงอยากนำระบบ Artificial Intelligent เข้ามาใช้ในเกมบนมือถือเพื่อสร้างความพึงพอใจและความสนุกสนานให้กับผู้นิยมเล่นเกมบนโทรศัพท์มือถือได้ไม่มากก็น้อย
2.2 รูปแบบของเกมบนมือถือ
รูปแบบของเกมที่มีอยู่ในโทรศัพท์มือถือปัจจุบันที่พบมักจะเป็นเกมแนว Puzzle และแนว Action ส่วนแนว Action RPG เริ่มเพิ่มมากขึ้นซึ่งจะมีรูปแบบการเล่นที่ให้ผู้เล่นได้มีการฝึกคิดการแก้ปัญหาตามความยากง่ายของเกมนั้นๆ รูปแบบของการเล่นเกมนั้นย่อมมีข้อดีและข้อเสียคือ ตัวอย่างของรูปแบบการเล่นเกมที่เป็นแนว Puzzle เป็นการฝึกความคิดในการแก้ปัญหาหรือว่ารูปแบบของแนว Action ก็จะเป็นการผ่อนคลาย บางครั้งก็มีความรุนแรงแฝงมาส่วนแนว Action RPG จะเสมือนเป็นการรวมระหว่างสองแนวเกมนี้คือมีการแก้ปัญหาและการต่อสู้ไปด้วยกัน แนวเกม Action RPG เป็นลูกผสมระหว่างแนวเกม Action และ RPG ซึ่งผู้เล่นไม่ต้องเสียเวลาในการทำความเข้าใจเนื้อหาเกมมากเกินไปเหมือนแนว RPG โดยส่วนใหญ่แล้วแนวเกม RPG จะใช้ตัวเลือกในการต่อสู้ เช่น คำสั่งโจมตีหรือป้องกัน แต่ Action RPG จะตัดระบบตัวเลือกออกไป โดยให้ผู้เล่นบังคับตัวละครผ่านปุ่มกดเองเหมือนกับเกมแนว Action
2.3 ความเป็นมาของ J2ME
หลังจากที่บริษัทซัน ไมโครซิสเต็มส์ออกจาวา 2 สแตนดาร์ทอิดิชั่น (Java 2 Standard Edition : J2SE) และจาวา 2 เอ็นเทอร์ไพร์สอิดิชั่น (Java 2 Enterprise Edition : J2EE) ก็ได้ออกแพลตฟอร์มใหม่เพิ่มเติม คือ J2ME ซึ่งได้รับการออกแบบโดยเน้นกลุ่มผู้ใช้อุปกรณ์และเครื่องใช้อิเล็กทรอนิกส์ภาษาจาวาได้กลายเป็นแพลตฟอร์มการพัฒนาแอพพลิเคชั่นแบบเชิงวัตถุ (Object-oriented) ในอุปกรณ์และงานต่างๆ อย่างเต็มตัว นับตั้งแต่แอพพลิเคชั่นเซิร์ฟเวอร์ระดับองค์กร เครื่องคอมพิวเตอร์แบบตั้งโต๊ะทั่วไป จนถึงแอพพลิเคชั่นฝังตัวสำหรับอุปกรณ์ขนาดเล็กแพลตฟอร์มจาวา 2 ที่ใช้งานอยู่ในขณะนี้มี 3 รุ่นด้วยกัน
- จาวา 2 เอ็นเทอร์ไพร์สอิดิชั่น (J2EE) ใช้งานกับแอพพลิเคชั่นบนเครื่องเซิร์ฟเวอร์สำหรับองค์กรที่รองรับระบบงานใหญ่ๆ และไคลเอนต์จำนวนมาก
- จาวา 2 สแตนดาร์ทอิดิชั่น (J2SE) ใช้งานกับแอพพลิเคชั่นบนเครื่องคอมพิวเตอร์แบบตั้งโต๊ะทั่วไป
- J2ME ใช้งานกับแอพพลิเคชั่นรุ่นใหม่ซึ่งเน้นกลุ่มผู้ใช้อุปกรณ์อิเล็กทรอนิกส์และอุปกรณ์ฝังตัว (Embedded)
2.4 รู้จัก J2ME
J2ME เป็นแพลตฟอร์มจาวาที่ออกแบบมาเพื่อใช้กับแอพพลิเคชั่นที่ทำงานบนอุปกรณ์ขนาดเล็ก เช่น โทรศัพท์มือถือ พีดีเอ โทรศัพท์พร้อมจอภาพที่ต่อกับอินเตอร์เน็ต โทรทัศน์ดิจิตอลขนาดเล็ก อุปกรณ์บันเทิงและระบบนำทางในรถยนต์ สวิตซ์ในระบบเครือข่าย คอมโพเน็นท์ของเครื่องอำนวยความสะดวกภายในบ้าน ฯลฯ ได้นำโครงสร้างแบบโมดูลที่มีความยืดหยุ่นสูงเข้ามาใช้ เพื่อให้สามารถสนับสนุนการทำงานอุปกรณ์หลากหลายประเภท J2ME กำหนดชั้นของซอฟต์แวร์ (Software) ไว้ 3 เลเยอร์ (Layer) ด้วยกัน โดย เลเยอร์ทั้งหมดจะอยู่เหนือชั้นระบบปฏิบัติการของอุปกรณ์ ดังนี้
2.4.1 เลเยอร์จาวาเวอร์ชวลแมชชีน (Java Virtual Machine) เป็นเลเยอร์ของจาวาเวอร์ชวลแมชชีน ปรับแต่งให้เข้ากับระบบปฏิบัติการของอุปกรณ์ และรองรับแต่ละ คอนฟิกูเรชั่น (Configuration) ของ J2ME และเวอร์ชวลแมชชีน ของ J2ME ได้แก่ (Connected Virtual Machine : CVM) และ (Kilobyte Virtual Machine : KVM) ทั้ง CVM และ KVM ต่างสนับสนุนยูติลิตี้ Java Code Compact หรือคลาส Prelinker preloader และ ROmnizer ยูติลิตี้นี้จะโยงจาวาคลาสเข้ากับเวอร์ชวลแมชชีน ช่วยลดระยะเวลาเริ่มใช้งาน VM ได้มากขึ้น ตัวอย่างเช่น เรียก KVM และ CLDC ขึ้นมาก่อนโหลดไปยังหน่วยความจำแบบ ROM ของอุปกรณ์ คลาส CLDC จะถูกโยงเข้าใน KVM โดยตรง เพื่อปรับปรุงประสิทธิภาพการทำงาน เราเรียกขั้นตอนนี้ว่าการโหลดเข้าหน่วยความจำแบบ ROM (ROMized)
2.4.2 เลเยอร์คอนฟิกูเรชั่น เป็นเลเยอร์ของคอนฟิกูเรชั่นของJ2ME ซึ่งกำหนดคลาสไลบรารี่อุปกรณ์ใช้งานทั่วไปหรือกลุ่มอุปกรณ์ที่มีความต้องการหน่วยความจำและหน่วยประมวลผลใกล้เคียงกันคอนฟิกูเรชั่นในจาวาสำหรับอุปกรณ์ขนาดเล็ก มี 2 ประเภทด้วยกัน คือ CDC (Connected Device Configuration) และ CLDC (Connected Limited Device Configuration)
2.4.3 เลเยอร์โพรไฟล์ (Profile) เป็นเลเยอร์ที่สร้างเหนือเลเยอร์คอนฟิกูเรชั่น โดยกำหนดคลาสไลบรารี่เพื่อสนองตอบความต้องการขอตลาดเฉพาะกลุ่ม ตัวอย่างของโพรไฟล์ในเลเยอร์นี้ ได้แก่ PDA Profile, MID Profile, Foundation Profile และ Personal Profile
2.5 คอนฟิกูเรชั่นในJ2ME
คอนฟิกูเรชั่นและโพรไฟล์เป็นองค์ประกอบหลักของ J2ME โดยมีจุดสำคัญ คือ เพื่อปรับแต่งเวอร์ชวลแมชชีนและคลาสไลบรารี่ให้เหมาะสมกับอุปกรณ์แต่ละประเภท คอนฟิกูเรชั่น คือ ชุดที่มีคุณสมบัติขั้นต่ำของ จาวาเวอร์ชวลแมชชีน และจาวาคลาสสำหรับอุปกรณ์แต่ละประเภท เป็นตัวแทนของอุปกรณ์ที่มีลักษณะคล้ายคลึงกัน อาจกล่าวได้ว่า คอนฟิกูเรชั่นเป็นตัวกำหนดคุณสมบัติหรือไลบรารี่ขั้นต่ำของแพลตฟอร์มจาวาที่นักพัฒนาคาดว่าจะต้องมีในทุกอุปกรณ์ ขณะที่คลาสไลบรารี่ที่กำหนดในคอนฟิกูเรชั่นจะมีในทุกอุปกรณ์ที่อยู่ในกลุ่มเดียวกัน
CLDC เป็นอุปกรณ์ส่วนบุคคล พกพาได้ และใช้เชื่อมต่อข้อมูล โดยปกติมักมีส่วนติดต่อกับผู้ใช้แบบง่ายๆ เมื่อเทียบกับระบบบนเครื่องคอมพิวเตอร์ตั้งโต๊ะ โดยมีหน่วยความจำประมาณ 128 กิโลไบต์ ถึง 1 เม็กกะไบต์ ใช้หน่วยประมวลผลแบบ 16 หรือ 32 บิต เชื่อมต่อกับเครือข่ายที่มีแบนด์วิดท์ต่ำเป็น ระยะเวลาสั้นๆ โดยไม่อาศัยพอร์ต TCP/IP ตัวอย่างอุปกรณ์ประเภทนี้ ได้แก่ โทรศัพท์มือถือแบบไม่ซับซ้อนมากนัก เพจเจอร์รับส่งข้อความ เครื่องปาล์มโอเอสแบบพกพา
ในชั้นของคอนฟิกูเรชั่น มีคลาส 2 ประเภทด้วยกัน คือ คลาสที่นำมาจาก J2SE และที่ออกแบบเฉพาะอุปกรณ์ขนาดเล็ก คลาสที่นำมาจาก J2SE จะมีคุณสมบัติอย่างเดียวกันกับคลาสใน J2SE หรือเป็นซับคลาสของ J2SE เช่น แพ็คเก็จ java.io และ java.util
2.6 โพรไฟล์ของJ2ME
โพรไฟล์จะกำหนดชุดของ API ที่ต้องใช้เพิ่มเติม ตลอดจนกำหนดคุณสมบัติที่เป็นที่ต้องการของตลาดเฉพาะกลุ่มหรืออุปกรณ์เฉพาะประเภท คลาสไลบรารี่ในโพรไฟล์ช่วยให้นักพัฒนาสร้างฟังก์ชั่นเฉพาะอุปกรณ์ เช่น ส่วนติดต่อกราฟิกกับผู้ใช้การเชื่อมต่อเครือข่าย หน่วยเก็บข้อมูล Persistent Storage ฯลฯ ตามปกติแล้วจะไม่สามารถนำคลาสไลบรารี่ที่สร้างเพื่อใช้งานกับโพรไฟล์หนึ่งไปใช้กับโพรไฟล์อื่นได้ ขณะนี้มีบางโพรไฟล์ได้ถูกกำหนดแล้ว แต่ก็มีหลายโพรไฟล์ที่ยังอยู่ในขั้นตอนการดำเนินการอยู่ โพรไฟล์ Foundation และ RMI ซึ่งสร้างบน CDC กำลังเผยแพร่อยู่ ส่วนที่สร้างบน CLDC มีโพรไฟล์เดียวคือ MID Profile (Mobile Information Device Profile : MIDP) มันจะเตรียมส่วนติดต่อผู้ใช้และหน่วยเก็บข้อมูล Persistent Storage ความสามารถด้านเครือข่าย แบบจำลอง API สำหรับแอพพลิเคชั่น ไว้ให้อุปกรณ์ไร้สาย เช่น โทรศัพท์ที่ไม่ซับซ้อนมากนักและเพจเจอร์รับส่งข้อความ ส่วนโพรไฟล์ พีดีเอ (PDAP) กำลังได้รับการวิจัยอยู่
อุปกรณ์หนึ่งๆ อาจมีโพรไฟล์ใช้งานมากกว่า 1 ชนิด และบางโพรไฟล์ใช้งานเฉพาะบางอุปกรณ์หรือแอพพลิเคชั่นเท่านั้น ตัวอย่างเช่น โพรไฟล์บน CDC ส่วนใหญ่ เช่น RMI และ Personal จะสร้างไว้เหนือ Profile Foundation หากไม่มี Profile Foundation และ CDC รองรับแอพพลิเคชั่นที่เขียนก็ไม่สามารถทำงานได้
2.7 J2ME สำหรับอุปกรณ์ไร้สาย
J2ME ได้ให้กำเนิดแอพพลิเคชั่นยุคใหม่บนอุปกรณ์ไร้สาย ช่วยให้เกมแบบหลายผู้เล่นที่ทำงานผ่านอินเตอร์เน็ตการทำธุรกรรมทางโทรศัพท์มือถือ แอพพลิเคชั่นสำหรับองค์กรทั้งไคลเอนต์และเซิร์ฟเวอร์ เกิดขึ้นได้บนโทรศัพท์มือถือและเพจเจอร์รับส่งข้อความ MIDP CLDC และ KVM ได้กลายมาเป็นรากฐานในการพัฒนาจาวาแอพพลิเคชั่นบนอุปกรณ์ไร้สายยุคใหม่ มี 3 ปัจจัยในการสร้างแพลตฟอร์มสำหรับ แอพพลิเคชั่นไร้สาย คือ MIDP CLDC KVM
รูปที่ 2.1 โครงสร้างของเลเยอร์ต่างๆ
โครงสร้างของเลเยอร์ต่างๆ จากล่างขึ้นบน ดังนี้
2.7.1 เลเยอร์ฮาร์ดแวร์ MID หมายถึง ตัวโทรศัพท์มือถือ
2.7.2 เลเยอร์ซอฟต์แวร์ของระบบที่ติดตั้งมากับอุปกรณ์ หมายถึง ระบบปฏิบัติการและไลบรารี่ของระบบที่บริษัทผู้ผลิตให้มา
2.7.3 เลเยอร์ KVM เป็นส่วนที่เตรียม Runtime Environment ไว้ให้แอพพลิเคชั่นบนอุปกรณ์ไร้สาย
2.7.4 เลเยอร์ CLDC เป็นส่วนที่เตรียม API หลักของจาวาให้แอพพลิเคชั่นบนอุปกรณ์ไร้สาย
2.7.5 เลเยอร์ MIDP เป็นส่วนที่เตรียมไลบรารี่สำหรับส่วนติดต่อกราฟิกกับผู้ใช้ และหน่วยเก็บข้อมูล Persistent Storage ระบบเครือข่าย และไทม์เมอร์
นอกจากคลาสไลบารี่สำหรับ MIDP ผู้ผลิตอาจเตรียมคลาสไลบารี่เฉพาะอุปกรณ์ไว้ให้นักพัฒนา เพื่อดึงความสามารถของฟังก์ชั่นที่มีอยู่แล้วไปใช้งานให้เกิดประโยชน์สูงสุด อาทิ การโทรศัพท์การแชร์ข้อมูลกับแอพพลิเคชั่นที่ติดตั้งมาในเครื่อง จำพวก ปฏิทิน สมุดจดที่อยู่ การตรวจสอบข้อมูลอุปกรณ์ เช่น อายุแบตเตอรี่ ความแรงของสัญญาณ ฯลฯ แม้ว่าการนำคลาสเฉพาะอุปกรณ์ที่ผู้ผลิตเตรียมไว้มาใช้งาน จะช่วยเพิ่มความสามารถแก่แอพพลิเคชั่นบนอุปกรณ์ไร้สาย แต่ไม่สามารถเคลื่อนย้ายไปสู่อุปกรณ์อื่นที่ใช้ MIDP ได้ เนื่องจากคลาสที่นำมาใช้อยู่นอกเหนือขอบเขตของ MIDP
2.8 หลักการเขียนโปรแกรม
2.8.1 CLDC สภาพแวดล้อมการทำงานของจาวาใน MIDP มักมาพร้อมกับ K Virtual Machine (KVM) ไลบรารี่ของ CLDC และ MIDP และซอฟต์แวร์จัดการแอพพลิเคชั่น (Application Management Software :AMS)ไลบรารี่จาวาใน CLDC และ MIDP จะเป็นพื้นฐานรองรับการเขียนแอพพลิเคชั่นบนอุปกรณ์ไร้สาย ไลบรารี่ของ CLDC เป็นไลบรารี่ของเครือข่ายและระบบชั้นสูงที่ไม่จำกัดเฉพาะอุปกรณ์ใดอุปกรณ์หนึ่งประกอบด้วย คลาส 2 ประเภท คือ คลาสที่เป็นซับเซ็ตของ J2SE และคลาสที่เกี่ยวกับกรอบการติดต่อสื่อสารทั่วไป
คลาสประเภทแรกของ CLDC เป็นซับคลาสของไลบรารี่ J2SE กำหนดไว้ในแพ็กเกจ java.langjava.util และ java.io โดยคลาสระบบและคลาสชนิดข้อมูลเข้ากันได้กับ J2SE และ J2EEและเพื่อให้เข้ากันได้เคลื่อนย้ายข้ามแพลตฟอร์มได้สะดวก คลาสประเภทนี้จะใช้ชื่อคลาสและชื่อแพ็คเกจตามชื่อคลาสอย่างเดียวกันใน J2SE หรือตามชื่อซับคลาสใน J2SE ที่เกี่ยวเนื่องกัน โดยไม่มีการเพิ่มเมธอด public หรือprotected หรือฟิลด์ซึ่งไม่มีในคลาสที่เกี่ยวเนื่องกันใน J2SE ความหมายของคลาสและเมธอดจึงไม่เปลี่ยนไป
คลาสประเภทที่สองของ CLDC กำหนดไว้ในแพ็คเกจ javax.microedition.io คลาสเหล่านี้มีเฉพาะใน CLDC จึงไม่สามารถทำงานร่วมกับไลบรารี่ของ J2SE ได้ เป็นคลาสชั้นสูงเกี่ยวกับเรื่องทั่วไปของเครือข่าย กำหนดไว้ในแพ็กเกจ java.io และ java.net คลาสประเภทนี้จะเตรียมกรอบการติดต่อสื่อสารผ่านเครือข่ายให้กับอุปกรณ์ที่สนับสนุน J2ME โดยกรอบการสื่อสารนี้มักเรียกกันว่า Generic Connection Framework คลาสส่วนใหญ่ได้แก่อินเตอร์เฟสที่แทนการสื่อสารรูปแบบต่างๆ เช่น ซ็อกเก็ต ดาต้าแกรมซีเรียล และ http ขึ้นอยู่กับว่าผู้ผลิตอุปกรณ์หรือผู้ให้บริการเครือข่ายจะติดตั้งอินเตอร์เฟสการเชื่อมต่อเหล่านี้เพียงบางตัวหรือครบทั้งชุด เมื่อพิจารณาจากความสามารถของอุปกรณ์และเครือข่าย
2.8.2 ไลบรารี่ของ MIDP ไลบรารี่ของ CLDC ช่วยสร้างฟังก์ชั่นที่ไม่จำกัดเฉพาะอุปกรณ์บางชนิด ไลบรารี่ของ MIDP กลับตรงกันข้ามได้แก่ กี่จัดการแอพพลิเคชั่นบนอุปกรณ์ ส่วนการติดต่อกราฟิกกับผู้ใช้ทั้งแบบพื้นฐานและซับซ้อน พื้นที่เก็บข้อมูลแบบคงตัว และความสามารถเพิ่มเติมด้านเครือข่าย
2.8.3 คลาส คลาสโปรแกรมจัดการแอพพลิเคชั่น เป็นคลาสที่ติดต่อกับโปรแกรมจัดการแอพพลิเคชั่นบนอุปกรณ์ถูกกำหนดไว้ในแพ็คเกจ java.microedition.midlet แอพพลิเคชั่นทั้งหลายที่เขียนใน MIDP จะต้องขยายคลาส MIDlet ที่อยู่ในแพ็คเกจออกไป และจะต้องนำเมธอดทั้ง 3 ซึ่งได้แก่ startApp(), pauseApp() และ destroyApp() เข้ามาใช้
คลาสของส่วนติดต่อกราฟิกกับผู้ใช้ (GUI Class) เป็นชุดเครื่องมือ Abstract Windowing Toolkit ใน J2SE ออกแบบมาเพื่อใช้งานกับแอพพลิเคชั่นบนเครื่องคอมพิวเตอร์แบบตั้งโต๊ะและไม่สามารถนำมาใช้กับอุปกรณ์ไร้สายได้ เนื่องจากบริโภคทรัพยากรประเภทหน่วยความจำค่อนข้างมาก MIDP มีวิธีที่ต่างกันในการกำหนดไลบรารี่สำหรับแพ็คเกจส่วนติดต่อกราฟิกกับผู้ใช้ ด้วยการใช้ API ขั้นสูงซึ่งเน้นความสามารถในการเคลื่อนย้ายข้ามอุปกรณ์ และ API ขั้นพื้นฐานซึ่งเน้นองค์ประกอบกราฟิกเฉพาะอุปกรณ์ และ input event ทั่วไป คลาสที่เชื่อมต่อกับส่วนติดต่อกราฟิกกับผู้ใช้ และ event-handlingกำหนดไว้ในแพ็คเกจ java.microedition.lcdui Screen ถือเป็นซูเปอร์คลาสของคอมโพเน็นท์ส่วนติดต่อกับผู้ใช้โดยใช้ API ชั้นสูง ประกอบไปด้วย Alert, Form , List, Textbox ฯลฯ Canvas และ Graphic เป็นคลาสหลักของ API ระดับต่ำ (Low Level) แอพพลิเคชั่นเกมเป็นแอพพลิเคชั่นที่ใช้ API ระดับต่ำในการสร้างส่วนติดต่อผู้ใช้
คลาสของพื้นที่เก็บข้อมูลแบบคงตัว ในบางครั้งแอพพลิเคชั่นที่เขียนบน MIDP จำเป็นต้องเก็บข้อมูลไว้บนอุปกรณ์อย่างถาวร คลาสที่กำหนดไว้ในแพ็คเกจ java.microedtion.rms ให้กลไกการเก็บข้อมูลถาวรที่เรียกว่า RecordStore โดยยอมให้แอพพลิเคชั่นเขียนลบและปรับปรุงบันทึกข้อมูลในหน่วยเก็บข้อมูลถาวรในอุปกรณ์ คลาสของอินเตอร์เฟสเหล่านี้กำหนดในแพ็คเกจ java.microedition.io
2.8.4 MIDlet หมายถึงแอพพลิเคชั่นบน MIDP MIDlet มีส่วนคล้ายกับจาวาแอปเพล็ต แม้จะไม่มีเมธอด main() แต่ MIDlet ก็นำคลาส java.microedtion.midlet.MIDlet ตลอดจนเมธอดstartApp(), pauseApp() และ destroyApp() เข้ามาใช้ นอกจากนี้ MIDlet ยังกำหนด constructor แบบ public ที่ไม่มีอาร์กิวเมนต์ใดๆ อีกด้วย เราสามารถให้คำนิยามของคลาส
javax.microedtion.midlet.MIDlet ได้ดังนี้
public abstract class MIDlet extends Object {
protected MIDlet()
protected abstract void startApp() throws MIDletStateChangeException
protected abstract void pauseApp()
protected abstract void destroyApp() throws MIDletStateChangeException
public final String getAppProperty(String key)
public final void notifyDestroyed()
public final void notifyPaused()
public final String getAppProperty(String key)
public final void resumeRequest()
}
คลาส MIDlet ระบุเมธอดที่สามารถเรียกใช้โดยซอฟต์แวร์จัดการแอพพลิเคชั่น (AMS) เพื่อสั่งให้แอพพลิเคชั่น MIDlet เริ่มต้นและหยุดทำงาน
การทำงานของ MIDlet การกระทำของ MIDlet ประกอบไปด้วย 3 สถานะ คือกำลังทำงาน หยุดชั่วคราวและถูกทำลาย อาศัยซอฟต์แวร์จัดการแอพพลิเคชั่น เป็นตัวควบคุมการเปลี่ยนสถานะหนึ่งไปยังอีกสถานะหนึ่งควบคุมด้วยเมธอด startApp(), pauseApp() และ destroyApp() ที่มาพร้อมกับ MIDlet จากรูปที่ 2.3 แสดงให้เห็นจุดเปลี่ยนระหว่างสถานะทั้ง 3 โดยการเรียกใช้เมธอดข้างต้น เมื่อMIDlet พร้อมสั่งกระทำการ ซอฟต์แวร์จัดการแอพพลิเคชั่นจะสร้างตัวอย่าง MIDlet ขึ้นมาก่อนโดยใช้ constructor แบบ public ที่ไม่มีอาร์กิวเมนต์ใดๆ โดย MIDlet จะอยู่ในสถานะหยุดชั่วคราว จากนั้นซอฟต์แวร์จัดการแอพพลิเคชั่นจะเรียกเมธอด startApp() ขึ้นมา และ MIdlet จะเข้าสู่สถานะกำลังทำงานเปิดรับทรัพยากรที่ต้องการและเริ่มต้นการทำงาน ในสถานะนี้ MIDlet จะทำงานและดึงทรัพยากรที่ต้องการไว้ใช้งาน เมื่อซอฟต์แวร์จัดการแอพพลิเคชั่นไม่ต้องการให้ MIDlet ทำงานต่อไป ก็จะเรียกเมธอด pauseApp() จากนั้น MIDlet จะหยุดทำงานและเข้าสู่สถานะหยุดชั่วคราว คืนทรัพยากรที่ดึงมาใช้งานและเข้าสู่ภาวะไม่ทำงาน MIDlet สามารถกลับไปอยู่ที่สถานะกำลังทำงาน ได้เมื่อซอฟต์แวร์จัดการแอพพลิเคชั่นเรียกเมธอด startApp() ขึ้นมา
ท้ายที่สุดเมื่อซอฟต์แวร์จัดการแอพพลิเคชั่นไม่ต้องการเรียกใช้งาน MIDlet หรือต้องการเคลียร์หน่วยความจำเพื่อให้โปรแกรมอื่นได้ใช้งาน ก็จะส่งสัญญาณเตรียมทำลาย MIDlet ทิ้งด้วยการเรียกเมธอด destroyApp() และเข้าสู่สถานะถูกทำลาย ซึ่ง MIDlet จะปล่อยทรัพยากรทั้งหมด ทำการจัดเก็บข้อมูลถาวรต่างๆ และหยุดการทำงานทั้งหมด หาก MIDlet อยู่ระหว่างสั่งกระทำขั้นตอนสำคัญอยู่ ก็อาจร้องขอไม่เข้าสู่สถานะถูกทำลายได้โดยเรียกใช้ MIDletStateChangeException อย่างไรก็ดีซอฟต์แวร์จัดการแอพพลิเคชั่นอาจปฏิเสธหรือยินยอมตามคำร้องขอนี้ก็ได้ ตัวแปรบูลีน unconditional ในลายเซ็นของเมธอด destroyApp() จะเป็นตัวกำกับว่าการร้องขอนี้สมควรหรือไม่ ถ้าตัวบ่งชี้มีค่าเท่ากับ true การร้องขอเป็นอันตกไป ตรงกันข้ามหากมีค่าเท่ากับ false ก็จะได้รับการตอบรับและจะเรียกเมธอด destroyApp() ขึ้นมาใหม่ในคราวต่อไป หาก MIDlet ต้องการเข้าสู่สถานะหยุดชั่วคราวหรือถูกทำลายด้วยตัวเอง ก็สามารถทำได้โดยเรียกเมธอด notifyPause() หรือ notifyDestroy() ตามลำดับ โดยเมธอดทั้ง 2 จะแจ้งให้ซอฟต์แวร์จัดการแอพพลิเคชั่นทราบว่า MIDlet ได้เข้าสู่สถานะหยุดชั่วคราว/ถูกทำลายแล้ว ในกรณีนี้ซอฟต์แวร์จัดการแอพพลิเคชั่นจะไม่เรียกเมธอด pauseApp() หรือ destroyApp() อีก MIDlet จะเข้าสู่สถานะหยุดทำงานได้ก็ต่อเมื่อผ่านสถานการณ์ทำงานมาก่อนแล้ว ในทางตรงกันข้าม หากต้องการเข้าสู่สถานะถูกทำลาย สามารถเข้าได้โดยตรงจากสถานะหยุดทำงานชั่วคราวและสถานะกำลังทำงานนอกจากนี้ยังสามารถเข้าสู่สถานะหยุดการทำงานได้ในขณะที่กำลังทำงาน
2.8.5 API ของส่วนติดต่อกับผู้ใช้ใน MIDP มี 2 กลุ่มหลักๆ ด้วยกันคือ API ระดับสูงและระดับล่าง API ระดับสูงออกแบบให้เป็น Abstract เน้นความยืดหยุ่นในการโยกย้ายไปใช้งานในระบบอื่นแอพพลิเคชั่นที่ใช้ API ระดับสูงจะควบคุมวิธีแสดงผลได้น้อยมากและเข้าถึงได้เฉพาะอีเวนต์ระดับสูงเท่านั้น ในทางตรงกันข้ามการใช้ API ระดับล่างจะสามารถควบคุมการแสดงผลได้เต็มที่ สามารถเข้าถึงอุปกรณ์ป้อนข้อมูล และจัดการอีเวนต์พื้นฐานที่เกิดจากการตอบโต้ของผู้ใช้ได้
2.8.5.1 Displayable และ Display ฟังก์ชั่นหลักอย่างหนึ่งของส่วนติดต่อกับผู้ใช้ ก็คือ การแสดงข้อมูลบนหน้าจอใน J2ME MIDP ออบเจ็กต์ Displayable จะเก็บข้อมูลที่ต้องการนำเสนอและออบเจ็กต์ Display จะนำออบเจ็กต์ Displayable นั้นไปแสดงบนจอให้ผู้ใช้เห็น
Displayable เป็นคลาสหลักของส่วนติดต่อกับผู้ใช้ของ MIDP สามารถเก็บภาพกราฟิกที่สร้างเฉพาะอุปกรณ์และนำไปแสดงบนจอ
MIDP กำหนด API ของส่วนติดต่อกับผู้ใช้ออกเป็น 2 กลุ่มคือ API ระดับสูงและระดับล่าง คลาส Screen เป็นคลาสย่อยของ Displayable ที่ใช้ APระดับสูง ส่วนคลาส Canvas เป็นคลาสย่อยของ Displayable ที่ใช้ API ระดับล่าง
ขนาดและรูปร่างของหน้าจออุปกรณ์จะแตกต่างกันออกไป เนื่องจาก API ระดับสูงจะจัดการกับความแตกต่างของขนาดหน้าจอ ดังนั้น ในการเขียนแอพพลิเคชั่นจึงไม่ต้องพะวงเรื่องความแตกต่างของขนาดหน้าจอมากนัก แต่หากเป็นแอพพลิเคชั่นที่ใช้ API ระดับล่างจะต้องระวังเรื่องความแตกต่างของหน้าจอแสดงผลเหล่านี้
Displayable ทุกตัวต้องรีจิสเตอร์ Command และ CommandListener เพื่อที่จะสามารถรับอีเวนต์ของคอมมานด์ได้
รูปที่ 2.3 โครงสร้างลำดับขั้นของคลาส Displayable
Display เป็นตัวจัดการการแสดงผล ได้เพียงตัวเดียวเท่านั้นแอพพลิเคชั่นสามารถอ้างถึงออบเจ็กต์ Display ได้ด้วยเมธอด getDisplay() เมื่อตั้งแต่เริ่มเรียกใช้ MIDlet.startApp() ไปจนถึง MIDlet.destroyApp() ออบเจ็กต์ Display ทั้งหมดที่ได้จาก getDisplay() จะยังคงอยู่ตลอด จนกว่าจะเสร็จสิ้นโปรแกรม MIDlet
คลาสDisplayable มีเมธอด getCurrent() สำหรับดึง Displayable ปัจจุบัน และมีเมธอดไว้สำหรับแสดงผลคือ setCurrent (Displayable nextDisplayable)แอพพลิเคชั่น สามารถควบคุม Displayableปัจจุบัน และ เรียก เมธอด Display.setCurrent() ได้ตลอดเวลา เมธอดของ MIDlet สามารถกำหนดหรือดึงค่า Displayable ปัจจุบันด้วย เมธอด Display.setCurrent() และDisplay.getCurrent() แอพพลิเคชั่นหน้าฉากและหลังฉาก แม้สามารถสั่งให้แอพพลิเคชั่นหลายตัวทำงานพร้อมกันบนอุปกรณ์หนึ่งๆ อุปกรณ์ก็จะแสดงผลได้เฉพาะ Displayable ปัจจุบันเท่านั้น ดังนั้นแอพพลิเคชั่นใดที่มี Displayable ปัจจุบันแสดงผลอยู่บนจอจะเรียกว่าเป็นแอพพลิเคชั่นหน้าฉาก (foreground) ซึ่งสามารถรับอีเวนต์การป้อนข้อมูลเข้าจากผู้ใช้ได้ แอพพลิเคชั่นที่เหลือซึ่งไม่ได้แสดงผลจะเรียกว่าแอพพลิเคชั่นหลังฉาก (background) เนื่องจากเมื่อแอพพลิเคชั่นหลังฉากกลายเป็นแอพพลิเคชั่นหน้าฉาก ก็จะสามารถแสดงผล Displayable ที่ถูกต้องได้
2.8.5.2 Image คลาส Image ใช้เก็บข้อมูลรูปกราฟิก ออบเจ็กต์ Image จะอยู่ในหน่วยความจำที่แยกจากส่วนแสดงผล ออบเจ็กต์ Image สามารถวาดลงบน Canvas
2.8.5.3 อีเวนต์และการจัดการอีเวนต์ ส่วนติดต่อกับผู้ใช้ประกอบด้วย 2 ส่วนหลักคือ หน้าจอที่ทำหน้าที่แสดงผล และตอบสนองการโต้ตอบของผู้ใช้แท้จริงแล้วจุดประสงค์หลักในการใช้คลาส Canvas ก็เพื่อการเข้าถึงและการจัดการกับ event ระดับล่าง แต่ event ระดับสูง ก็สามารถเกิด จาก Object Canvas ได้ด้วยเช่นกันแอพพลิเคชั่นสามารถที่จะเพิ่มคอมมานด์ใน Canvas ได้ โดยจากการใช้ method addCommand() เหมือนกับซับคลาสของ Displayable อื่นๆ และยังสามารถรีจิสเตอร์ CommandListener ใน Canvas ด้วย method set CommandListener() ได้เช่นกัน
2.8.5.4 พื้นฐานเกี่ยวกับ Canvas เป็นซับคลาสของ Displayable ซึ่งใช้ API ระดับล่าง คลาสนี้มีเมธอด paint สำหรับการวาดและเมธอดอื่นๆ สำหรับจัดการอีเวนต์ระดับล่างซึ่งแอพพลิเคชั่นสามารถเขียนใหม่ได้ เมธอด Paint() ในคลาส Canvas ถูกประกาศเป็น Abstract เช่นเดียวกับคลาส Canvas ดังนั้นแอพพลิเคชั่นจะต้องการขยายคลาส Canvas เพื่อใช้งานและจะต้องมีเมธอด Paint() เพื่อเป็นซับคลาสของ Canvas แต่เมธอดสำหรับจัดการอีเวนต์ระดับล่างไม่ได้ถูกประกาศเป็น Abstract จึงมีค่าว่าง(นั่นคือ จะไม่ทำงานใดๆ ) ดังนั้น แอพพลิเคชั่นไม่จำเป็นต้องมีเมธอดการจัดการอีเวนต์ครบทั้งหมด หากแต่ต้องการเฉพาะอีเวนต์ที่แอพพลิเคชั่นสนใจเท่านั้น
ขนาดที่แท้จริงของพื้นที่แสดงผลจะแตกต่างกันไปตามอุปกรณ์แต่ละชนิด แอพพลิเคชั่นไม่ควรกำหนดขนาดที่ตายตัวแต่ควรเช็คขนาดของพื้นที่แสดงผลโดยใช้เมธอด getHeight() และ getWidth()
จุดประสงค์หลักในการใช้คลาส Canvas ก็เพื่อเข้าถึงและจัดการอีเวนต์ระดับล่าง แต่อีเวนต์ระดับสูงก็สามารถเกิดจากออบเจ็กต์ Canvas ได้ด้วยเช่นกัน แอพพลิเคชั่นสามารถเพิ่มคอมมานต์ใน Canvas ได้โดยใช้เมธอด addCommand() เหมือนกับซับคลาสของ Displayable อื่นๆ และยังสามารถรีจิสเตอร์ CommandListner ใน Canvas ด้วยเมธอด setCommandListener() ได้เช่นกัน
2.8.5.5 กราฟิก ในส่วนของกราฟิกนี้ จะเป็นคลาส Graphics ทำหน้าที่สร้างภาพเรขาคณิต 2 มิติ คลาสนี้จะคล้ายกับ javax.awt.Graphics ใน J2SE ส่วนในการวาดของคลาส Graphics เท่านั้นที่เป็นแบบแทนที่พิกเซล พิกเซลที่มีอยู่เดิมบนจอจะถูกแทนที่ด้วยพิกเซลปัจจุบันที่ระบุใน Object Graphics ในคลาส Graphics จะไม่มีฟังก์ชั่นก์อื่นที่ทำหน้าที่รวมค่าของพิกเซล อาทิคำสั่งที่เกี่ยวกับบิตแมพ หรือการผสม/ซ้อนภาพแบบอัลฟ่า (คือการทำให้ฉากหลังโปร่งเพื่อซ้อนกับอีกภาพ) วิธีเดียวที่จะดึงออบเจ็กต์ Graphics มาวาดได้ ทำได้โดยใช้เมธอด paint(Graphics g) ของออบเจ็กต์ Canvas แอพพลิเคชั่นสามารถวาดเนื้อหาบนออบเจ็กต์ Canvas ด้วยการใช้ออบเจ็กต์ Graphicsนี้เท่านั้น
2.8.5.6 ระบบพิกัด ของกราฟิกมีจุดปัก (เรียกว่าจุด anchor) เริ่มที่มุมซ้ายของพื้นที่วาดค่า X จะเพิ่มจากซ้ายไปขวา และค่า Y จะเพิ่มจากบนลงล่างในระบบของพิกัดจะอ้างถึงตำแหน่งระหว่างพิกเซลไม่ใช่ตำแหน่งของพิกเซลเอง เช่นพิกเซลแรกที่มุมบนซ้ายสุดจะอยู่พิกัด ในแกน X คือ (0,0),(1,0) หรือ (width,0) และในแกน Y คือ (0,1),(1,1) หรือ (0,height)
รูปที่ 2.4 ระบบพิกัดของ Graphic
2.8.5.7 แอคชั่น แอพพลิเคชั่นหลายตัวร้องการอีเวนต์ของปุ่มลูกศรและอีเวนต์อื่นๆ สำหรับเล่นเกม MIDP กำหนดค่าของปุ่มเหล่านั้นดังนี้ UP, DOWN, LEFT, RIGHT, FIRE,GAME_A, GAME_B, GAME_C และ GAME_D แต่ละปุ่มจะจับคู่กับแอคชั่นของเกม 1 แอคชั่นอย่างไรก็ตามแอคชั่นเกมหนึ่งๆ อาจใช้ปุ่มรวมกันมากกว่า 1 ปุ่ม
วิธีการจับคู่แอคชั่นเกมกับ key code จะขึ้นอยู่กับระบบ เช่น ในอุปกรณ์บางตัวแอคชั่น UP, DOWN, LEFT, RIGHT อาจจับคู่กับปุ่มลูกศรทั้งสี่ แต่อุปกรณ์อีกตัวอาจจับคู่ไปเป็นปุ่มตัวเลข 2, 4, 6, 8 เป็นต้น
2.8.5.8 Object Graphics สามารถวาดบนจอโดยตรงหรือจะวาดลงในบัฟเฟอร์ของรูปที่ไม่อยู่บนจอก็ได้ฉากที่ Object Graphics วาดลงไปนั้นจะเป็นอะไร ก็ขึ้นอยู่กับแหล่งกำเนิดของ Object Graphics วิธีเดียวที่จะดึง Object Graphics มาวาดภาพได้ ทำได้โดยการใช้ เมธอด Paint(Graphics g) ของ Object Canvas แอพพลิเคชั่นสามารถที่จะวาดเนื้อหาลงไปบน Object Canvas ด้วยการใช้ Object Graphics นี้เท่านั้น แอพพลิเคชั่นสามารถดึง Object Graphics เพื่อวาดลงในบัฟเฟอร์ของรูปได้โดยการใช้ method getGraphics() แอพพลิเคชั่นสามารถเก็บ Object Graphics ที่ดึงมาใช้ได้ตลอดและเรียกใช้คำสั่งในการวาดได้ตลอดเวลา
2.8.5.9 สี API ระดับล่างใช้ระบบสีแบบ 24 บิต นั่นคือใช้ 8 บิต สำหรับแต่ละองค์ประกอบของสี คือ สีแดง สีเขียว สีน้ำเงิน เนื่องจากอุปกรณ์บางชนิดอาจจะไม่สนับสนุนสีแบบ 24 การนำไปใช้งานจึงต้องมีการจับคู่สีที่แอพพลิเคชั่นต้องการใหม่ให้เป็นสีที่อุปกรณ์นั้นๆ สามารถที่จะแสดงผลได้ แอพพลิเคชั่นสามารถตรวจได้ว่าอุปกรณ์สามารถแสดงผลสีหนึ่งๆ ได้หรือไม่ ด้วย method Display.isColor() และดูจำนวนสี ( ถ้า isColor() เป็น true ) หรือระดับเฉดเทา ( ถ้า isColor() เป็น false ) ด้วย method Display.numColor()
โดยปกติแล้วก่อนที่แอพพลิเคชั่นจะวาดเนื้อหาบนจอ หรือรูปภาพ จะต้องกำหนดสีของ foreground และ background ก่อน ในคลาส Graphics นั้นมีเพียง เมธอด setColor() เท่านั้น การเซ็ตสี background ต้องใช้วิธี setColor() เพื่อให้ได้สีที่ต้องการ จากนั้นจึงใช้วิธีเติมสีรูปสี่เหลี่ยมด้วย fillRext() แล้วจึงค่อยเซ็ตสีที่ต้องการสำหรับ foreground
2.8.6 Game API ประกอบด้วยคลาสที่ใช้ในการพัฒนาเกมดังนี้
2.8.6.1 GameCanvas รองรับการสรางภาพเคลื่อนไหวและตรวจสอบสถานะของปุ่มมือถือ ทำหน้าที่เสมือนกระดาษวาดรูปคล้ายกับคลาสCanvas แต่มีคุณสมบัติเพิ่มเติมคือ
- มีเมธอดสนับสนุนการสร้างภาพเคลื่อนไหว
- มีเมธอดสำหรับตรวจสอบสถานะของปุ่มโทรศัพท์
ความแตกต่างระหว่าง GameCanvas และ Canvas
-ใน Canvas เราจะสร้างภาพกราฟิกภายในเมธอด paint() และเรียกเมธอด repaint() เพื่ออัพเดทหน้าจอ
- ใน GameCanvas เราจะใช้ออบเจ็กต์กราฟิกที่คืนค่ามาจากเมธอด getGraphics() ในการวาดภาพบนจ้าจอ และเรียกเมธอด flushGraphics() เพื่ออัพเดทหน้าจอ
วิธีตรวจสอบสถานะของปุ่มมือถือ
- ในคลาส Canvas จะรอการเกิดอีเวนต์จากการกดปุ่มโดยใช้เมธอด getGameAction()
- ในคลาส GameCanvas จะตรวจสอบสถานะปุ่มกด ดังนี้
2.8.6.2 thread คือ ระบบปฎิบัติการจะแบ่งกระบวนการทำงานออกเป็น กระบวนการย่อยๆ ที่เรียกว่า thread ซึ่งในจาวารองรับthread หลายๆ ตัวในเวลาเดียวกัน(multithreading) หลักการนี้จำเป็นมากในการสร้างภาพเคลื่อนไหวซึ่งอาจมีการทำงานหลายกระบวนการเกิดขึ้นพร้อมกันเช่น ในขณะที่ภาพกำลังเคลื่อนไหวอยู่เราก็สามารถกดปุ่มโทรศัพท์ไปพร้อมๆ กัน เมื่อมีการเรียกเมธอด start() ของ thread เมธอด run()ของคลาสที่ implements Runnable นั้นจะถูกเรียกให้ทำงาน ดั้งนั้นถ้าต้องการให้ thread ทำอะไรก็เขียนcodeใน เมธอด run()
2.8.6.3 layer ใช้เป็นตัวแทนส่วนต่างๆ ในเกม เช่น ชั้นของพื้นหลัง คลาส layer จะถูกใช้ผ่านทางคลาสย่อยชื่อคลาส Sprite และคลาส Tiled Layer
-บอกขนาดและตำแหน่งของ layer
public int getX(), public int getY(),public int getWidth() และ public int getHeight()
-กำหนดตำแหน่งของ layer
public int setPosition(int x,int y) // (x,y) คือ พิกัดมุมซ้ายบนของ layer
-วิธีเคลื่อนย้าย layer
public void move(int dx,int dy)
// Dx คือ ระยะในแนวแกน x โดยอ้างอิงจากตำแหน่งปัจจุบัน
// Dy คือ ระยะในแนวแกน y โดยอ้างอิงจากตำแหน่งปัจจุบัน
-ซ่อนหรือแสดง layer
public boolean getVisible(), public void setVisible(Boolean visible)
// Visible เป็น true ถ้าต้องการกำหนดให้ layer ถูกมองเห็นได้
2.8.6.4 layerManager ใช้จัดการกับออบเจ็กต์ของคลาส layerต่างๆ ใช้แสดงส่วนต่างๆ ของเกมลงบนหน้าจอเรียงตามลำดับที่กำหนดไว้ โดย layer ที่มีลำดับ 0 จะอยู่บนสุดและลำดับต่อๆ ไปก็จะถูกเรียงซ้อนกัน
public void append (layer l), public void insert (layer l,int index)
//L คือ layer ที่ต้องการเพิ่มเข้าไป index คือ ลำดับของlayer ที่ต้องการวาง
2.8.6.5 View Window หน้าต่างแสดงพื้นที่เกมขณะนั้น โดยพื้นที่ของเกมมักจะใหญ่กว่าพื้นที่หน้าจอแสดงผล ดังนั้นจะมีบางส่วนของเกมเท่านั้นที่ถูกวาดในแต่ละครั้ง
public void setViewWindow (int x,int y,int width,int height)
//(x,y) คือ พิกัดของมุมซ้ายบนซึ่งจะอ้างอิงจากจุดเริ่มต้น(0,0)
//Width X Height คือขนาดของ ViewWindow
เราสามารถวาดส่วนต่างๆ ที่ถูกรวมอยู่ใน layerManager บนหน้าจอโดย
public void paint(Graphics g,int x, int y)
//G คือ ออบเจ็กต์ของคลาส Graphics
//(x,y) คือ ตำแหน่งมุมซ้ายมือของ layerManager
2.8.6.6 Tiledlayer สืบทอดมาจากคลาส layer เน้นที่ส่วนของฉากพื้นหลังซึ่งประกอบไปด้วยเซลล์เล็กๆ ที่ถูกเติมด้วยภาพเล็กๆ จนเต็ม
รูปที่ 2.5 เรียงภาพเล็กๆ ให้กลายเป็นภาพที่ต่างกัน
การสร้างฉากหลังเริ่มต้นด้วยการสร้างออบเจ็กต์ Tiledlayer ด้วยการเรียกคอนสตรักเตอร์ต่อไปนี้
public TiledLayer(int colums,int rows,Image image,int tileWidth,int tileHeight)
// Colums คือจำนวน คอลัมน์ของ Tiledlayer
// Rows คือจำนวนแถวของ Tiledlayer
// Image คือ รูปภาพที่ใช้
// tileWidth X tileHeight คือขนาดของ tile
ค่าเริ่มต้นแต่ละเซลล์ใน TiledLayer คือ 0 ซึ่งหมายถึงช่องว่าง เราสามารถเปลี่ยนได้โดยใช้เมธอด
public void setcell(int col,int row,int tileIndex)
public void fillcell(int col,int row,int numCols,int nmRows,int tileIndex)
// (col, row) คือตำแหน่งของเซลล์ที่ต้องการใส่รูปลงไป
// tileIndex คือลำดับของ tile ที่จะใส่ลงไป
// numCols คือ จำนวนคอลัมน์นับจาก col
// numRows คือ จำนวนของแถวนับจาก row
2.8.6.7 Animated Tile สามารถทำให้ tile มีชีวิตชีวาได้ โดยเอา tile สลับกับ tile ที่จับคู่กับมันในช่วง run time โดยค่า Aninated Tile (เป็นจำนวนเต็มลบ) ของ tile แต่ละตัวนั้น
public int createAnimatedTile(int staticTileIndex)
//TileIndex คือลำดับของ tile ที่ต้องการนำมาทำ Aninated Tile หลังจากได้ค่า tile แล้วเราสามารถจับคู่ tile กับ Aninated Tileที่ต้องการให้สลับกันโดยใช้เมธอด
public void setAnimatedTile(int animatedTileIndex, int staticTileIndex)
//animatedTileIndex คือค่า animatedTile ที่ได้จากเมธอด createAninatedTile()
//TileIndex คือลำดับของ tile ที่ต้องการจับคู่ Aninated Tile
2.8.6.8 Sprite เป็นคลาสย่อยของคลาสlayer ใช้ในการสร้างออบเจ็กต์ขนาดเท่า tile 1 อันและเคลื่อนไหวได้อิสระบนพื้นหลังหรือออบเจ็กต์อื่นๆ
public Sprite(Image img,int frameWidth,int frameHeight)
public Sprite(Image img)
// Img คือรูปที่จะใช้
// frameWidth X frameHeight คือขนาดของ Sprite
// Animating Sprite การสร้าง Spriteให้เคลื่อนไหวขึ้นอยู่กับความต่อเนื่องลำดับของเฟรมจะเรียง 0,1
public void setFrameSequence(int[]Sequence)
// Sequence คือ array ชนิด int กำหนดลำดับความต่อเนื่องของเฟรม
วิธีเปลี่ยนทิศทางของ Sprite
setTransform(int transform)
2.8.7 Media API เป็น แพกเก็จที่จัดการเกี่ยวกับเสียงภายในเกม
2.8.8 หน่วยเก็บข้อมูลแบบคงตัว J2ME MIDP มีระบบฐานข้อมูลแบบเรกคอร์ดง่ายๆ ที่เรียกว่า record management system (RMS) ตารางในฐานข้อมูลจะเรียกว่าเป็น record store และแต่ละรายการข้อมูลใน recorstroe จะเรียกว่า เรกคอร์ด ชุดคำสั่ง API สำหรับสร้าง เข้าถึง และจัดการกับเรกคอร์ดต่างๆ นั้นจะอยู่ในแพ็กเกจ javax.microedition.rms
Record Stores rms ที่มีใน MIDP เป็นระบบฐานข้อมูลแบบง่ายๆ record store ซึ่งเทียบเท่ากับตารางในฐานข้อมูล คือไฟล์ที่ประกอบด้วยชุดเรกคอร์ด รายละเอียดของ record store จะกำหนดในคลาส RecordStore class
2.9 ทฤษฎีของส่วนปัญญาประดิษฐ์
ในส่วนนี้จะแบ่งออกเป็น
-การหาตำแหน่งของ มอนสเตอร์ หรือ ตัวผู้เล่น หรือตัว AI ที่ใกล้ที่สุด
(Mindistance Finding ) ใช้ทฤษฎีทางคณิตศาสตร์ การหาระยะทางแบบยุคลิด (Euclidean distance)
-การหาระยะทางที่สั้นที่สุด (Shortest Path) โดย ทฤษฎีของ A* 's Algorithm
-การสุ่ม (Randomize Algorithm) การสุ่มการเดิน การสุ่มตกไอเท็ม
-การตรวจสอบการชน (Collision Detection) การชนกันของ Pixel ของ Sprite
หลักการทำงานของ ตัวปัญญาประดิษฐ์
-ค่าพลังชีวิตผู้เล่น มากกว่า 70% เลือกการเดินแบบสุ่ม (Random) เพื่อไปโจมตีมอนสเตอร์ แต่โอกาสจะมีน้อย
-ค่าพลังชีวิตผู้เล่น น้อยกว่า 70% เลือกหาตำแหน่งของมอนสเตอร์ตัวที่ใกล้ที่สุด และใช้ระยะทางที่สั้นที่สุด ไปโจมตีมอนสเตอร์
-ค่าพลังชีวิตผู้เล่น น้อยกว่า 50% ทำการฟื้นฟูพลังชีวิตผู้เล่น ภายใต้เงื่อนไขการนับเวลา (cooldown)
รูปที่ 2.6 flow chart แสดงการทำงานของตัวปัญญาประดิษฐ์
2.9.1 ประยุกต์ใช้ทฤษฎีที่เกี่ยวข้องในส่วนของปัญญาประดิษฐ์
2.9.1.1 Randomized Algorithm ในการสุ่มการเดินของปัญญาประดิษฐ์
2.9.1.2 A* Algorithm จะประยุกต์มาใช้งานบางส่วนเท่านั้น โดย A* จะมีสมการดังนี้
Evaluation function f(n) = g(n) + h(n)
g(n) คือ ความรู้ต้นทุนที่มีมาก่อนถึงปัจจุบัน ในตัวปัญญาประดิษฐ์จะนำค่า HP ของตัวผู้เล่น ที่มีมาก่อนถึงเวลา ณ ปัจจุบัน เพื่อพิจารณารูปแบบการเดินให้ฟังก์ชั่น h(n)
h(n) คือ ประเมินโอกาสที่นำไปสู่ความสำเร็จ ในตัวปัญญาประดิษฐ์จะอาศัยการประเมินจากฟังก์ชั่น g(n) แล้วเลือกรูปแบบเพื่อเคลื่อนที่ไปสู่ความสำเร็จ (การโจมตีมอนสเตอร์)
f(n) คือ ประเมินการต้นทุนเริ่มต้นไปยังเป้าหมาย ในตัวปัญญาประดิษฐ์จะนำการประเมินค่า HP และเลือกรูปแบบการปฎิบัติดังที่กล่าวมา เพื่อไปโจมตีมอนสเตอร์ หรือ ฟื้นฟู HP ผู้เล่น
2.9.1.3 ระยะทางแบบยุคลิด (อังกฤษ: Euclidean distance, Euclidean metric) คือระยะทางปกติระหว่างจุดสองจุดในแนวเส้นตรง ซึ่งขยายผลมาจากทฤษฎีบทพีทาโกรัส
รูปที่ 2.7 แสดงระยะทางระหว่างจุด 2 จุด
จากนั้นก็นำระยะทางที่หาแต่ละตัวของมอนสเตอร์มาหาค่าน้อยสุด ก็จะได้ระยะทางที่น้อยสุด
2.9.1.4 การตรวจพบการกระทบกัน (Collision Detection) เป็นวิธีการตรวจสอบว่าพิกเซล (Pixel) ของ สไปรต์ (Sprite) เคลื่อนที่กระทบกับ สไปรต์ (Sprite) ในทิศทาง ซ้าย และขวา โดยเรียกใช้เมธอด collidesWith() ใน class sprite จากนั้นก็ให้เปลี่ยนเป็นภาพของการโจมตี โดยใช้เมธอด setFrameSequence() และ setTransform() จากนั้นก็ไปลดค่าของตัวแปรที่เก็บพลังชีวิตของมอนสเตอร์เอาไว้
2.9.1.5 ตัวปัญญาประดิษฐ์ในส่วนของมอนสเตอร์ มี Algorithm ต่างๆ คล้ายๆ ในส่วนของตัวปัญญาประดิษฐ์ คือ
- การเคลื่อนที่ มีการเดินแบบสุ่ม การเดินแบบหาตำแหน่งของผู้เล่น หรือ ตัวปัญญาประดิษฐ์ ที่อยู่ใกล้ที่สุดและหาระยะทางที่ใกล้ที่สุดเพื่อ ไปทำการโจมตี
- ระดับของมอนสเตอร์มีผลต่อการเลือกโจมตี แบบ เดี่ยว หรือ รุม ฝ่ายผู้เล่น
- เมื่อตายมีโอกาสสุ่มไอเทมตก
- สาย Data Link ที่เชื่อมต่อระหว่างโทรศัพท์มือถือกับ Personal Computer
ความหมายของเกมคอมพิวเตอร์
เกมคอมพิวเตอร์ คือ
เกมที่ถูกสร้างขึ้นมาเพื่อเล่นบนเครื่องคอมพิวเตอร์ สามารถแบ่งตามลักษณะการแสดงผลได้เป็น เกม 2 มิติ และเกม 3 มิติ
เกม 2 มิติ เป็นรูปแบบเกมที่มีการใช้ภาพแบบ 2 มิติ ตัวละครหรือฉากสามารถเคลื่อนที่ได้
เฉพาะในแนวแกน x และ y ไม่สามารถเปลี่ยนมุมมองในการเล่นได้ ตัวอย่างของเกม 2 มิติ เช่น คอนทร้า หรือ มาริโอ้ ที่เล่นบนเครื่องเล่นเกมยี่ห้อแฟมิลี่ (Family) ในสมัยก่อน หรือในสมัยนี้ ก็เช่น
เรดอะเลิร์ต ที่เล่นบนเครื่องคอมพิวเตอร์ในปัจจุบัน เป็นต้น
2) เกม 3 มิติ เป็นรูปแบบเกมที่มีการใช้ภาพแบบ 3 มิติ ตัวละครหรือฉากสามารถเคลื่อนที่ได้ทั้งในแนวแกน x แกน y และ แกน z ผู้เล่นสามารถเปลี่ยนมุมมองในการเล่นได้ ตัวอย่างของเกม 3 มิติ เช่น วอร์คราฟ 3 ไลน์เอจ ซิมส์ 2 เป็นต้น
ปัจจุบันมีเกม 2 มิติ และ 3 มิติ มากมายนับไม่ถ้วน เกมบางเกมถูกสร้างขึ้นมาแล้วได้รับความนิยมจากผู้เล่นเป็นอย่างมาก เช่น สตาร์คราฟ และ เคาน์เตอร์ สไตรค์ เป็นต้น แต่บางเกมกลับไม่ได้รับความนิยมเท่าที่ควร เช่น เวิร์ม ซึ่งเปลี่ยนจากการพัฒนาเกมแบบ 2 มิติ เป็น 3 มิติ เป็นต้น
ความหมายของ XNA
xna คือ กลุ่มของเครื่องมือและคลาสไลบารี่ที่ใช้พัฒนาเกมเพื่อเล่นบนระบบวินโดว์ (Windows) ระบบเอ็กซ์บอกซ์ 360 (Xbox 360) และระบบซูน (Zune) ภายในเอ็กซ์เอ็นเอประกอบไปด้วยคำสั่งต่างๆมากมาย เช่น คำสั่งในการวาดรูป การแสดงผล การรับค่าอินพุท การคำนวณทางคณิตศาสตร์ เป็นต้น เอ็กซ์เอ็นเอเป็นฟรีแวร์ที่ทางบริษัทไมโครซอฟท์เป็นผู้พัฒนาขึ้น
ภาษาที่ใช้กับเอ็กซ์เอ็นเอ คือ ภาษาซีชาร์ป โดยเอ็กซ์เอ็นเอ 4.0 ต้องใช้ร่วมกับโปรแกรมวิชวลซีชาร์ป 2010 เอ็กซ์เพรส อิดิชั่น หรือโปรแกรมวิชวลสตูดิโอ 2010 รุ่นต่างๆ
2.8.2 จุดประสงค์ของการพัฒนาเอ็กซ์เอ็นเอ
1) เพื่อสร้างเครื่องมือที่สามารถพัฒนาเกมให้เล่นได้ทั้งในระบบวินโดว์ ระบบเอ็กซ์บอกซ์ 360 และระบบซูน โดยการเขียนโปรแกรมส่วนใหญ่จะมีความคล้ายคลึงกัน ต่างกันตรงที่การใช้คุณสมบัติที่เฉพาะเจาะจงสำหรับระบบนั้นๆ
2) เพื่อให้การพัฒนาเกมง่ายขึ้น โดย
ผู้พัฒนาเกมสามารถสร้างเกมที่ออกแบบเองภายในเวลาไม่กี่นาที
ไม่ต้องสนใจเรื่องการจัดการกับหน้าต่างเกม การ์ดแสดงผล การรับค่าโหมด
ของการแสดงผล สนใจเพียงแค่การเขียนโปรแกรมในส่วนเนื้อหาของเกม และจัดหาคอนเทนต์ (Content) เท่านั้น
การจัดการคอนเทนต์สามารถทำได้ง่าย โดยใช้คอนเทนต์ ไปป์ไลน์(Content Pipeline) ซึ่งจะจัดการในเรื่องของการนำเข้าคอนเทนต์ (Import) การคอมไพล์คอนเทนต์ (Compile) และโหลดคอนเทนต์ (Load)
คอนเทนต์ที่ได้จากการคอมไพล์จะอยู่ในรูป .xnb ซึ่งทำให้การแจกจ่ายเกมทำได้สะดวก ไม่ต้องกังวลรูปแบบและความครบถ้วนของคอนเทนต์เนื่องจากทุกอย่างจะอยู่ใน .xnb ทั้งหมดและถูกแปลงให้อยู่ในรูปแบบที่สามารถนำไปใช้ได้แล้ว
มี Starter Kits ให้สำหรับผู้เริ่มต้น โดยจะมีทั้งส่วนของโปรแกรมและคอน
เทนต์ที่ใช้สร้างเกม รวมไปถึงเทคนิคและข้อแนะนำในการปรับแต่งส่วนต่างๆ ผู้เริ่มต้น ยังสามารถใช้ Start Kits เป็นแม่แบบในการพัฒนาได้อีกด้วย
3) สร้างชุมนุมของผู้พัฒนาเกมด้วยเอ็กซ์เอ็นเอ เพื่อแลกเปลี่ยนแนวคิด เทคนิคต่างๆในการพัฒนาเกม รวมถึงเครื่องมือและ Tutorial สำหรับผู้เริ่มต้น
2.8.3 องค์ประกอบของเอ็กซ์เอ็นเอ
เอ็กซ์เอ็นเอประกอบด้วย 2 ส่วนหลักๆ ดังรูป
1) เอ็กซ์เอ็นเอ เกมสตูดิโอ เอ็กซ์เพรส (XNA Game Studio Express) เป็นส่วนของไอดีอี (IDE) และเครื่องมือที่ใช้ในการพัฒนาเกมทั้งหมด โดยขยายขีดความสามารถของวิชวลซีชาร์ป 2010 เอ็กซ์เพรส อิดิชั่น และวิชวลสตูดิโอ2010 ให้สนับสนุนการทำงานบนเอ็กซ์เอ็นเอเฟรมเวิร์ก (XNA Framework)
2) เอ็กซ์เอ็นเอเฟรมเวิร์ก เป็นส่วนของไลบรารี่ที่ใช้ในการพัฒนาเกม ซึ่งเป็นไฟล์ dll ที่เขียนด้วยภาษาซีชาร์ป โดยจะทำงานบนดอทเน็ตเฟรมเวิร์ก (.Net Framewrok) ในระบบวินโดว์ และทำงานบนดอทเน็ตคอมแพคเฟรมเวิร์ก (.Net Compact Framework) ในระบบเอ็กซ์บอกซ์ 360
2.8.4 เอ็กซ์เอ็นเอเฟรมเวิร์ก เอ็กซ์เอ็นเอเฟรมเวิร์ก ถูกพัฒนาขึ้นโดยมีพื้นฐานมาจากดอทเน็ตเฟรมเวิร์ก 4.0ของระบบวินโดว์ และดอทเน็ตคอมแพคเฟรมเวิร์ก 4.0 ของระบบเอ็กซ์บอกซ์ 360เอ็กซ์เอ็นเอเฟรมเวิร์ก จะประกอบไปด้วยคลาสไลบรารี่ต่างๆ ซึ่งใช้พัฒนาเกมโดยเฉพาะ เกมที่สร้างขึ้นจากเอ็กซ์เอ็นเอ สามารถทำงานได้ทุกๆระบบที่สนับสนุนเอ็กซ์เอ็นเอเฟรมเวิร์ก ซึ่งตอนนี้มีเพียงระบบวินโดว์เอ็กซ์พี ระบบวินโดว์วิสต้า ระบบเอ็กซ์บอกซ์ 360 และระบบซูน เท่านั้นเอ็กซ์เอ็นเอเฟรมเวิร์ก ประกอบไปด้วย 4 ชั้น (Layers) คือ Games, Extended Framework, Core Framework และ Platform
รายละเอียดที่สำคัญเกี่ยวกับแต่ละชั้นของเอ็กซ์เอ็นเอเฟรมเวิร์ก มีดังนี้ 1) Games เป็นชั้นที่อยู่ชั้นบนสุด ประกอบด้วยโปรแกรมและคอนเทนต์ของผู้สร้างเกม นอกจากนี้ยังมี Starter Kits ซึ่งเป็นชุดเริ่มต้นที่ทางไมโครซอฟท์จัดไว้ให้ผู้สร้างเกมใช้ศึกษาเป็นตัวอย่างในช่วงแรกของการพัฒนาเกม 2) Extended Framework จุดหลักของ Extended Framework คือ ช่วยอำนวยความสะดวกในการพัฒนาเกม ประกอบด้วย Application Model และ Content Pipeline 3) Core Framework Layer นี้มี Core Functionality ที่ชั้นอื่นนำไปขยายใช้งานต่อเช่นการเชื่อมต่อกับ Managed DirectX ในชั้นนี้ จะแบ่งกลุ่มการทำงานออกเป็น Graphics, Audio, Input, Math และ Storage 4) Platform เป็นชั้นที่อยู่ชั้นล่างสุดของโครงสร้างของเอ็กซ์เอ็นเอ ประกอบด้วยlow-level native and managed APIs สำหรับให้เอ็กซ์เอ็นเอเฟรมเวิร์กที่อยู่ชั้นสูงกว่าเรียกใช้ส่วนนี้ทำหน้าที่ติดต่อกับฮาร์ดแวร์หรือตัวกลาง เช่น Direct3D, XACT, Xinput และ Xcontent 5) Content Pipeline มีหน้าที่จัดการกับคอนเทนต์ต่างๆที่จะนำมาใช้ในเอ็กซ์เอ็นเอ เช่น รูปภาพ โมเดล 3 มิติ ตัวหนังสือ และ เสียง เป็นต้น คอนเทนต์ไปป์ไลน์จะทำการแปลงหรือคอมไพล์ไฟล์ต่างๆที่นำเข้ามาใช้ในเกมให้อยู่ในรูปของ .xnb ซึ่งเอ็กซ์เอ็นเอสามารถใช้ได้ทันที ไฟล์ต่างๆที่ถูกเรียกใช้ผ่านทางคอนเทนต์ไปป์ไลน์ เอ็กซ์เอ็นเอจะคอยจัดการในเรื่องของการโหลดไฟล์และการจัดการกับหน่วยความจำต่างๆให้โดยอัตโนมัติ 6) Application Model เกมที่พัฒนาโดยใช้เอ็กซ์เอ็นเอ จะมีคลาสหลักคือ คลาสGame ซึ่งมีเมธอดที่สำคัญคือInitialize () ใช้ตั้งค่าเริ่มต้นของเกม และโหลดคอนเทนต์ที่ไม่ใช่รูปภาพหรือตัวหนังสือLoadGraphicsContent () ใช้สำหรับโหลดรูปภาพหรือตัวหนังสือUnloadGraphicsContent () ใช้สำหรับลบคอนเทนต์ต่างๆออกจากหน่วยความจำเมื่อไม่ต้องการUpdate (GameTime gameTime) ใช้ในการประมวลผลเงื่อนไขต่างๆDraw (GameTime gameTime) ใช้ในการแสดงภาพของเกมลงบนจอGame Design Cognition : หัวใจของการออกแบบเกม หัวใจสำคัญของการออกแบบเกม ที่เป็นทั้งจุดเริ่มต้นและผลลัพธ์สุดท้ายที่จะได้ก็คือความสนุก แต่จะสร้างความสนุกอย่างไร สิ่งที่จะเป็นแรงผลักดันให้ผู้ออกแบบและผู้พัฒนากำหนดและในแนวคิดที่จะ entertaining by nature สิ่งนี้เรียกว่า Game Design Cognition (ขอแปลว่า หัวใจของการออกแบบเกม) เป็นสิ่งจำเป็นที่จะต้องเข้าใจและพัฒนาสำหรับอุตสาหกรรมที่ต้องสร้างความสนุกจากอากาศธาตุนี้ หัวข้อของการดีไซน์นี้มักจะไม่ค่อยได้พบเห็นจากเกมในปัจจุบัน บทความนี้จึงของนำเสนอหัวใจหลักของการออกแบบเกม ยกตัวอย่างเช่น เกม Gear Of War ขั้นตอนการออกแบบเกมนี้ อาจเริ่มมากจากคอนเซปท์หลักที่เน้นความเป็นเทพนิยายกรีซ ที่ให้ตัวเอกมีบทบาททางการต่อสู้สูง เกมอาจจะเริ่มที่ส่วนสำคัญหรือเนื้อหา ที่เน้นการต่อสู้หรือใช้อาวุธอย่างดุดัน หรืออาจจะเป็นรูปแบบการเล่น อย่าง divine powers system และ power-ups ที่ให้ผู้เล่นกระโดดและโจมตีได้อย่างรุนแรง อย่างไรก็ตาม ภาพการออกแบบทั้งหมดนี้ ไม่ได้ออกมาอย่างเรียงตามตัวเสียทั้งหมด ส่วนใหญ่แล้วการออกแบบเกมจะเป็นการวกกลับไปมา ระหว่างขั้นตอนบนกับขั้นตอนล่าง ในระดับล่างที่ชีกในกลไกการออกแบบและการเล่นจริง ส่วนในระดับบนจะเน้นภาพที่เกมนำเสนอ ดังนั้น บทความนี้จึงศึกษาในแต่ละระดับของการออกแบบและความสัมพันธ์ของแต่ละระดับ ในแบบแนวดิ่งเพื่อให้ได้ความสัมพันธ์ทั้งแบบ Top-Down และ Bottom-Upที่เป็นวิถีของหัวใจในการออกแบบเกม หัวใจของการออกแบบอาจเริ่มที่ไอเดียแล้วเปลี่ยนเป็นเกมการเล่น หรือเริ่มที่เกมการเล่นแล้วใส่ไอเดียตามลงไป กว่าจะเป็นเกมได้ต้องมีการรวมกันของสองด้านนี้ ขั้นตอนการออกแบบเหล่านี้คือเนื้อหาของบทความ ซึ่งจะแบ่งเป็นเลเยอร์
สอนสร้างเกม, สอนทำเกม ,บทความ
สอนสร้างเกม 2D/3D C++ C# JAVA XNA Flash และบริการสร้างเกมสำหรับ บริษัท, promote สินค้า,เรียนต่อต่างประเทศ สอนเขียนเกมC# FULL OPTION GAME
SUCESS 100% STUDIOGAME สิ้นสุดการรอคอย กับ คอร์สสร้างเกม สู่ฝันตะลุย โลก IMAGINE มันส ทะลุมิติ
เปิดโอกาสให้ตัวเอง ความฝัน เป็นจริงได้ ด้วยสองมือของเรา!!!
คอร์สใหม่ สำหรับนักเรียน สร้างเกม โดยไม่ต้องมีพื้นฐานมาก่อน
ใช้ PROGRAM สร้างเกมไม่ต้องเขียนโปรแกรม
สร้างเสร็จใน 7 วัน แบบ GODLIKE !!!