เกมแอนดรอยด์จำนวนมากมีขนาดไม่ใหญ่พอที่จะแสดงให้เห็นถึงการบันทึก / โหลดหรือตัวเลือก / การตั้งค่าไม่ต้องคำนึงถึงตัวละครที่กำหนดเองและสิ่งที่คล้ายกันเพราะพวกเขาเล่นด้วยมือเพียง 10 นาทีในบ้านรถไฟ
อย่าทำผิดพลาดกับสิ่งที่มีขอบเขตขนาดใหญ่สำหรับเกม Android เกมแรก ทำเกมเล็ก ๆ ให้เป็นกลุ่มแล้วทำสิ่งที่ใหญ่กว่า
เฉพาะ Android อย่างชาญฉลาด:
โครงสร้าง:
ฉันอยากจะแนะนำให้มีเกมเกือบทั้งหมดในชั้นเรียนกิจกรรมเดียว Android ทำงานบนแนวคิดที่ว่าแต่ละกิจกรรมเป็นเหมือนมินิแอพกึ่งอิสระของกิจกรรมอื่น ๆ ในแอป แอพนี้เป็นกิจกรรมสแต็คเป็นหลักโดยผู้ใช้จะเห็นว่าใครอยู่ด้านบนสุด
เมื่อคุณป๊อปอัปหนึ่งอันด้านบนโดยทั่วไปจะถูกทำลายและจะถูกสร้างขึ้นใหม่ในครั้งถัดไปที่ผู้ใช้เริ่มกิจกรรมใหม่ (เจตนาเริ่มต้นกิจกรรม) สิ่งนี้ทำให้ยากที่จะรักษาสถานะระหว่างกิจกรรมและนำไปสู่สถาปัตยกรรมกิจกรรมเดียว
คุณอาจต้องการที่จะมีกิจกรรมประเภทหน้าจอหลักที่มีเมนู "เกมใหม่ / เกมโหลด / ตัวเลือก" ที่มันและทำให้กิจกรรมที่เปิดตัว อย่างไรก็ตามคุณจะต้องมีเมนูในเกมและกิจกรรมเกมของคุณซึ่งจะมีฟังก์ชั่นส่วนใหญ่อยู่ในนั้น
แอพของฉันเองฉันสร้าง "เมนูกิจกรรม" ที่มีฟังก์ชั่นที่เปิดตัวเกมใหม่บันทึกโหลดเปลี่ยนตัวเลือก จากนั้น HomeActivity ของฉันก็ขยายออกไปเช่นเดียวกับ GameActivity ของฉัน
เนื่องจากทุกอย่างอยู่ในคลาสกิจกรรมเดียวฉันขอแนะนำให้สร้างลำดับชั้นของคลาสกิจกรรมและใช้ล็อตส่วนตัวที่ได้รับการป้องกันและขอบเขตเริ่มต้น ด้วยวิธีนี้คุณอย่างน้อยสามารถแยกสิ่งต่าง ๆ ออกเป็นไฟล์ต่าง ๆ เพื่อหยุดไม่ให้มีไฟล์กิจกรรมที่ไม่สามารถจัดการได้หนึ่งไฟล์ เช่นสำหรับแอพของฉัน:
GraphicsEngine extends MenuActivity
.
PhysicsEngine extends GraphicsEngine
.
GameLogicActivity extends PhysicsEngine
.
UIActivity extends GameLogicActivity
.
เนื่องจากแอพของฉันเป็น 3D opengl-es สิ่งต่าง ๆ มากมายที่ฉันไม่ทำงานข้ามกิจกรรมดังนั้นทุกอย่างอยู่ในกิจกรรมเดียวกันดังนั้นฉันอาจจะเอนเอียงกับการใช้สถาปัตยกรรมกิจกรรมเดียว
-
Threading
สำหรับกิจกรรมเกมคุณมีสองเธรด (หรือ 3 ถ้าคุณกำลังทำสิ่ง 3D OpenGL) หนึ่งเธรดคือ UI / เธรดหลัก นี่คือเธรดกิจกรรมที่เริ่มต้นและทำงานในและมอบให้คุณโดย Android
เธรด UI นี้เป็นสิ่งเดียวที่คุณสามารถอัปเดตองค์ประกอบ UI (มุมมองเลย์เอาต์และอื่น ๆ ) ได้อีกทั้งยังเป็นสิ่งที่ผู้ฟังสำหรับอินพุตผู้ใช้จะรัน คุณไม่เห็นกลไกใด ๆ ของเธรด UI เพียงว่ามันทำงานแบบวนซ้ำในพื้นหลังที่ใดที่หนึ่ง
คุณสร้างกระทู้ด้วยตัวเอง (ฉันขอแนะนำให้ใช้AsyncTaskแม้จะมีข้อบกพร่องทั้งหมด) สิ่งนี้จะทำสิ่งที่ไม่ใช่ UI ทั้งหมดที่คุณทำในเกมวนรอบปกติเช่นการอัพเดทการเคลื่อนไหวการคำนวณการชนการคำนวณการต่อสู้และอื่น ๆ
คุณทำให้ AsyncTask เธรด / คลาสนี้เป็นคลาสภายในของกิจกรรมของคุณ ด้วยวิธีนี้คุณสามารถมีออบเจ็กต์ขอบเขตกิจกรรมบางอย่าง ( Vector<Spaceship>
) ที่สามารถเข้าถึงได้โดยทั้งเธรด UI และเธรดเกมวนรอบ
เนื่องจากตรรกะของเกมเกิดขึ้นในเธรดเกมวนรอบนั่นเป็นเพียงเธรดเดียวที่จะต้องเปลี่ยนค่าตัวแปร (ปรับปรุงความเร็วของรถถังลด HP ของผู้เล่น) เธรด UI เพิ่งอ่านค่าดังนั้นควรมีปัญหาการเกิดพร้อมกันน้อยที่สุด
สิ่งที่ยุ่งยากเล็กน้อยคือทำให้เธรด UI ทำการอัพเดตตามคำร้องขอของเธรดเกมวนรอบ มีสองวิธีในการทำเช่นนี้ หากคุณอ่านเอกสาร AsyncTask จะมีวิธี publishProgress () / onProgressUpdate () นี่คือการเพิ่มสิ่งต่าง ๆ ในคิวของเธรด UI เพื่อทำลูปถัดไป
ตัวจัดการทำสิ่งเดียวกันทั้งหมดโดยที่คุณใช้เมธอด handleMessage () และวิธีการนั้นจะถูกดำเนินการจริงโดยเธรด UI ถัดไป
ในที่สุดการป้อนข้อมูลของผู้ใช้ใด ๆ ที่อยู่ในเธรด UI คุณสามารถอัปเดตองค์ประกอบ UI ได้ทันทีจากนั้น (ดังนั้นภายในการนำไปใช้ของผู้ฟัง onClick / onTouch ใด ๆ ) หากคุณต้องการอัปเดตวัตถุเกมคุณสามารถใช้สิ่งต่าง ๆ เช่นซิงโครไนซ์หรือคุณสามารถใช้คิวการอัปเดตของคุณเองใน AsyncTask ที่เหมือนกับเธรด UI มันจะผ่านไปในครั้งต่อไปที่เรียกใช้วนรอบเกม
Android คู่มือ
-
UI
สำหรับโครงสร้าง UI จริงภายในกิจกรรมเดียวฉันขอแนะนำให้มีโครงร่างเฟรมเป็นเค้าโครงพื้นฐานของคุณ องค์ประกอบลูกในโครงร่างเฟรมทำงานเหมือนคิว องค์ประกอบแรกได้รับการวาดครั้งแรกที่สองได้รับการวาดด้านบนของที่หนึ่งที่สามที่อยู่ด้านบนของที่สอง
ด้วยวิธีนี้คุณสามารถมีไฟล์เลย์เอาต์ XML หลายไฟล์และจัดการลูก ๆ ของเลย์เอาต์เฟรมสามารถสลับชุดมุมมองเข้าและออกได้อย่างง่ายดาย
หากคุณมี SurfaceView ที่ด้านล่าง (ลูกคนแรกในเลย์เอาต์เฟรม) คุณสามารถใช้มุมมอง / วิดเจ็ต Android ตามปกติทั้งหมด (ปุ่มมุมมองข้อความมุมมองเลื่อน) เป็นต้นเหนือมุมมองพื้นผิว ส่วนกราฟิกของเกม
ตัวอย่างเช่นหากมีบางอย่างกำลังโหลดคุณสามารถหยุดเกมวนชั่วคราว / เพียงแค่ข้ามทุกอย่างเพิ่มหน้าจอ 'โหลด' ทึบแสงเป็นลูกคนสุดท้ายในโครงร่างเฟรมและผู้ใช้จะเห็น 'โหลด' ปรากฏขึ้นบนหน้าจอ ค่อนข้างไม่รู้ว่ามุมมองอื่นอยู่ด้านหลัง วิธีนี้คุณไม่ต้องลบมุมมองที่ใช้เวลานานในการตั้งค่าหรือก่อให้เกิดความยุ่งยากในแต่ละครั้งที่มีการเพิ่ม / ลบ
ฉันจะแนะนำให้ใช้ View.setVisibility ล็อต ตัวอย่างเช่นคุณสามารถเพิ่มโครงร่าง 'คลังโฆษณา' ทั้งหมดลงในโครงร่างเฟรมพื้นฐานของคุณจากนั้นเพียงตั้งค่าความสามารถในการมองเห็น (View.Visible) เมื่อผู้ใช้คลิกเพื่อดูพื้นที่โฆษณาของพวกเขาและ setVisibility (View.Gone) เมื่อปิดอีกครั้ง ด้วยวิธีนี้คุณไม่ได้จัดการลูก ๆ ของโครงร่างมากเท่ากับเพิ่มทุกอย่างและทำให้สิ่งที่มองเห็น / มองไม่เห็นและเมื่อผู้ใช้ทำสิ่งต่าง ๆ
สิ่งนี้ช่วยในการทำเกลียวอีกครั้ง; เมื่อผู้ใช้คลิกเพื่อเปิดสินค้าคงคลัง onCLickListener จะถูกจัดการในเธรด UI สินค้าคงคลังจะปรากฏให้เห็นในนั้นและเมธอด updateInventory นั้นถูกเรียกอีกครั้งจากเธรด UI โดยมีเพียง getters ในวัตถุเกมทั้งหมดที่ถูกเรียก
นี่คือแผนภาพที่ฉันทำไว้สำหรับคำถามก่อนหน้านี้เกี่ยวกับแนวคิดโครงร่างกิจกรรม / เฟรมเดี่ยว: