ฉันจะพัฒนาเกม Android ของฉันได้อย่างมีประสิทธิภาพได้อย่างไร [ปิด]


11

ฉันได้แนบรูปภาพของแผนภูมิการไหลที่ทำด้วยสี แผนภูมิการไหลของแนวคิดเกม

ภาพแสดงวิธีที่ฉันต้องการพัฒนาเกมของฉัน ฉันต้องการเกมที่ทำงานได้ยอดเยี่ยมด้วยการเข้ารหัสอัจฉริยะที่ง่ายต่อการอัปเดตและคุณสมบัติโฆษณาตลอดเวลา แพลตฟอร์มเป้าหมายของฉันคือสมาร์ทโฟน Android และรหัสทั้งหมดจะถูกเขียนด้วยภาษาจาวาพร้อมกับทรัพยากร XML ที่สูงเกินจริงหากเป็นเช่นนั้น ฉันไม่ได้กำลังมองหารหัสที่ยาก แต่รหัสหลอกจะช่วยได้ฉันต้องการคำแนะนำและคำแนะนำจากผู้เชี่ยวชาญมากกว่า

คำถามของฉันคือ:

นี่เป็นวิธีที่ดีในการเขียนโปรแกรมเกมหรือมีวิธีที่ดีกว่าในการทำเกมนี้หรือไม่? มีการดัดแปลงใด ๆ ที่จำเป็นต้องทำหรือไม่? ข้อเสนอแนะใด ๆ ที่จะเป็นประโยชน์เพราะฉันไม่เคยมีประสบการณ์ในการเขียนโปรแกรมเกมดังนั้นฉันต้องการคำแนะนำจากคนที่เขียนเกมหลายเกมและรู้จากประสบการณ์ว่าควรตั้งรหัสของพวกเขาให้ทำงานได้อย่างมีประสิทธิภาพอย่างไร

คำตอบ:


12

เกมแอนดรอยด์จำนวนมากมีขนาดไม่ใหญ่พอที่จะแสดงให้เห็นถึงการบันทึก / โหลดหรือตัวเลือก / การตั้งค่าไม่ต้องคำนึงถึงตัวละครที่กำหนดเองและสิ่งที่คล้ายกันเพราะพวกเขาเล่นด้วยมือเพียง 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 ในวัตถุเกมทั้งหมดที่ถูกเรียก

นี่คือแผนภาพที่ฉันทำไว้สำหรับคำถามก่อนหน้านี้เกี่ยวกับแนวคิดโครงร่างกิจกรรม / เฟรมเดี่ยว:

ป้อนคำอธิบายรูปภาพที่นี่


ดังนั้นในความเห็นของคุณฉันควรมีเลย์เอาต์เฟรมเพื่อเก็บส่วนประกอบของลูปเกมทั้งหมดใช่ไหม ถ้าฉันทำอย่างนั้นฉันจะได้มุมมองในคลาส HUD เพื่อโต้ตอบกับ SurfaceView ได้อย่างไรเช่นพูดว่า d-pad / virtual analog เสมือนจริง? ฉันได้ลองทำสิ่งต่าง ๆ เช่นนั้นมาก่อนและพบข้อผิดพลาด
kdavis8

ฉันจะเขียนคำตอบของฉันอีกครั้งเพื่อให้ชัดเจนขึ้น
Spoon Thumb

เขียนคำตอบของฉันอีกครั้ง หวังว่าจะทำให้ชัดเจน
Spoon Thumb

ขอบคุณมากสำหรับความล้มเหลวที่ทำให้สิ่งต่าง ๆ ออกมามีบทเรียนที่ดีมากมายสำหรับการพัฒนาเกม Android
kdavis8

11

สิ่งที่ฉันเห็นในไดอะแกรมของคุณนั้นเกี่ยวข้องกับ UI และดูเหมือนว่าสมเหตุสมผลมาก มีไดอะแกรมของคุณเพียงเล็กน้อยที่สงวนไว้สำหรับตรรกะเกมจริงและมันก็คลุมเครือมาก

ฉันคิดว่าคุณกำลังพยายามอย่างหนักเกินไป ฉันอยากจะแนะนำให้คุณเริ่มเขียนโค้ด เลือกปัญหาเฉพาะและเริ่มแก้ไข คุณจะได้เรียนรู้มากมายจนเมื่อถึงเวลาที่คุณมีความคิดที่ดีขึ้นว่าพื้นที่ของปัญหาของคุณคืออะไรคุณจะมีมุมมองที่แตกต่างไปจากเดิมอย่างสิ้นเชิง (มีประโยชน์มากกว่า)


2
ฉันไม่เห็นด้วยกับสิ่งนี้อีก เลือกสถาปัตยกรรมการออกแบบที่เหมาะกับเกมและความชอบของคุณจากนั้นเริ่มเขียนโค้ด เมื่อคุณไปถึงอุปสรรค์ประสิทธิภาพที่เฉพาะเจาะจงเพิ่มประสิทธิภาพจนกว่าจะทำงาน กลไกแต่ละอย่างในเกมของคุณจะมีลักษณะการปฏิบัติงานและการเพิ่มประสิทธิภาพที่เป็นไปได้ - คุณต้องคิดถึงพวกมันเป็นรายบุคคลไม่ใช่ทั้งหมด
พหุนาม

เราจะหาคำแนะนำเกี่ยวกับรูปแบบดังกล่าวสำหรับสถาปัตยกรรมเกมได้จากที่ใด มันจะมีประโยชน์มากสำหรับฉัน
bot_bot
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.