หน่วยงาน / ระบบส่วนประกอบและ UI“ นิติบุคคล”


14

ฉันยังคงเป็นมิตรกับระบบนิติบุคคล / ส่วนประกอบ ฉันพบว่าเนื่องจากฉันมีส่วนประกอบที่มีประโยชน์สำหรับการวาด sprites (หรือ spritesheets) และการจัดการอินพุต (การคลิกเมาส์ / สัมผัส) ฉันจึงต้องการนำสิ่งเหล่านี้มาใช้ใหม่เพื่อสร้างส่วนประกอบ UI (เช่นปุ่มเช่นหน้าจอเลือกระดับ)

สิ่งนี้ทำให้ฉันประหลาดอย่างมาก ฉันมักเข้าใจสิ่งต่าง ๆ ว่า "รูปแบบเกม" เช่นผู้เล่นศัตรูการเพิ่มพลัง ฯลฯ ในทางกลับกันจากมุมมองการใช้รหัสซ้ำการใช้ compnents ใหม่สำหรับ UI นั้นเหมาะสมมาก

UI / GUI เกี่ยวข้องกับระบบ / ส่วนประกอบอย่างไร (และที่ไหน)

(หมายเหตุ: คำถามนี้เป็นผู้ไม่เชื่อเรื่องพระเจ้าแพลตฟอร์มเพราะมันใช้กับหลายแพลตฟอร์ม / ภาษา)


3
ฉันคิดว่ามันดูสมเหตุสมผลสำหรับคุณเท่านั้นเพราะคุณกำลังสร้างเกม 2d ลองจินตนาการว่าคุณจะสร้างเกม 3 มิติ (ด้วย 2d gui) แทบไม่มีตรรกะการเรนเดอร์ที่สามารถนำกลับมาใช้ใหม่ได้และส่วนประกอบ 2d gui ในโลก 3 มิติจะไม่สมเหตุสมผล คุณควรสร้าง GUI บนระบบส่วนประกอบ เช่นเดียวกับ GameplayScreen ของคุณสร้างโลกเอนทิตีที่มีส่วนประกอบและหนึ่งในองค์ประกอบจะเป็นกล้องที่มี "Canvas" ที่นักแสดงภาพของคุณจะวาด และผืนผ้าใบนั้นจะกลายเป็นพื้นหลังของหน้าจอนั้น
Kikaimaru

1
@ Kikaimaru คุณมีประเด็นเกี่ยวกับ 2D บางทีฉันอาจเป็น MVC มากเกินไป แต่ดูเหมือนว่าจะเป็น "โมเดล" (เอนทิตีเกม) และมุมมอง / คอนโทรลเลอร์ (ส่วนประกอบ UI) มันใช้งานได้จริง แต่นี่เป็นวิธีที่ควรใช้หรือไม่ มีวิธีที่ดีกว่านี้ไหม? คนอื่นทำอย่างไร
ashes999

@ ashes999 ความคิดเห็นและคำถามของคุณเริ่มต้นจากส่วนลึกของหัวใจของฉัน :)
Narek

@ อาร์เมนฉันไม่เคยได้รับคำตอบที่น่าพอใจสำหรับเรื่องนี้
ashes999

@ ashes999 ให้ฉัน ทุกคนพูดว่าคุณไม่ควรผสม MVC กับ ECS แต่ทำไม มันจะไม่ดีเหรอ? อาวุธที่แตกต่างกันสำหรับงานที่แตกต่างกันคุณไม่เห็นด้วย?
Narek

คำตอบ:


4

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

บ่อยครั้งที่คุณสามารถเข้าถึง ECS และไม่ใช่ระบบพื้นฐาน (เช่นระบบการวาดภาพ) ในกรณีนี้คุณสามารถใช้ส่วนประกอบได้เนื่องจากคุณไม่มีทางเลือกอื่น

หากคุณเข้าถึงระบบพื้นฐาน (เช่น Ruby roguelike ที่เข้าถึง Curses โดยตรง) คุณอาจพบว่าการวาด / การแสดงผลโดยตรงบนระบบนั้นมีประสิทธิภาพมากกว่า (รหัสน้อยกว่าบอบบางน้อยกว่าเป็นธรรมชาติมากกว่า) เอนทิตีและส่วนประกอบ


คุณวางตรรกะขององค์ประกอบ UI ขั้นสูงไว้ที่ไหน กล่าวคือ เฮลธ์บาร์ที่ต้องรู้ว่าเมื่อไรที่ผู้เล่นโดนโจมตีและลดจำนวนเท่าไหร่ ฉันไม่สามารถไปถึงหากต้องการระบบที่เฉพาะเจาะจงหรือสคริปต์หรือสิ่งอื่น ...
ประมุขลิมา

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

แต่วัตถุแถบสุขภาพในสถาปัตยกรรมนั้นคืออะไร? มันเป็นเอนทิตีที่มีองค์ประกอบ "แถบสุขภาพ" หรือไม่? คลาสที่สืบทอดจาก Entity หรือไม่ วัตถุปกติที่มีการอัพเดทการเรียกรหัสฮาร์ด
Emir Lima

1
@EmirLima ฉันจะสร้างโมเดลแถบสุขภาพเป็นนิติบุคคลและผู้เล่นเป็นนิติบุคคล คุณสามารถทำสิ่งที่เหมาะสมกับคุณ
ขี้เถ้า 999

1

ใน 2D หรือ 3D ระบบคอมโพเนนต์ของเอนทิตี (ECS) อย่างน้อยควรมีการเข้าถึงระบบ GUI หากไม่ใช่ส่วนหนึ่งของ ECS เดียวกัน

โดยส่วนตัวแล้วฉันจะไม่ผสมทั้งสองอย่าง ความสามารถในการใช้รหัสสำหรับ GUI นั้นเกิดขึ้นจริงที่ระดับบนสุดเท่านั้น ตอบสนองต่อเมาส์ / คีย์บอร์ดการเรนเดอร์และอื่น ๆ ฟังก์ชั่นที่ใช้ปุ่มที่แตกต่างกันหรือข้อมูลที่แสดงรายการบางอย่างไม่ได้เป็นสิ่งที่สามารถสร้างให้พอที่จะนำมาใช้ซ้ำได้

ตัวอย่างเช่นผมจะคิดส่วนประกอบสำหรับหน่วยงานที่ GUI จะเป็นสิ่งที่ชอบposition, และrender guiโดยที่องค์ประกอบของ GUI จะกำหนดประเภทของการดำเนินการที่ผู้ใช้ GUI ทำ อย่างไรก็ตามการกระทำนั้นจะมีลักษณะเฉพาะและบริบทที่เฉพาะเจาะจง ผลลัพธ์นี้ในระบบที่จัดการส่วนประกอบ GUI ที่มีขนาดใหญ่มากและได้รับการออกแบบมาเพื่อจัดการฟังก์ชัน GUI แต่ละตัว (โหลดเกม, บันทึกเกม, ค้นหาเซิร์ฟเวอร์ ฯลฯ ) ฟังดูวุ่นวาย

ฉันต้องการทำไฟล์คลาสมาตรฐานสำหรับแต่ละ GUI "หน้าจอ" มีฟังก์ชั่นทั้งหมดสำหรับหน้าจอนั้นในที่เดียว (โดยอ้างอิงกับคลาสฟังก์ชั่นทั่วไป) มันเยอะมากและง่ายต่อการจัดการ

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

ดังนั้นเอนทิตีจะยังคงมีองค์ประกอบ GUI อยู่บ้าง แต่จะเป็นเอนทิตี "ในเกม" ไม่ใช่เอนทิตี GUI ส่วนนี้จะใช้ระบบ GUI ภายนอกเพื่อสร้างส่วนต่อประสาน GUI


เสียงเหมือนระบบที่ฉันมีค่อนข้างแตกต่างจากที่คุณอธิบาย ฉันมีคลาสเอนทิตี้ของTouchButtonซึ่งประกอบด้วย spritesheet และ touch-click-listener สำหรับป๊อปอัปหน่วยฉันอาจจะใช้สิ่งนั้นเป็นส่วนผสมของ sprite component + component listener mouse อืมมม
ashes999
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.