ฉันจะใช้คุณสมบัติต่าง ๆ ในระบบเอนทิตีได้อย่างไร


31

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

ฉันกำลังสร้างเอ็นจิ้นใน JavaScript และฉันได้นำคุณสมบัติหลักมาใช้ซึ่งรวมถึง: การจัดการอินพุต, ระบบภาพเคลื่อนไหวที่ยืดหยุ่น, ตัวส่งอนุภาค, คลาสคณิตศาสตร์และฟังก์ชั่น, การจัดการฉาก, กล้องและเรนเดอร์ ของสิ่งอื่น ๆ ที่เครื่องยนต์มักจะสนับสนุน ฉันอ่านคำตอบของ Byte56 ซึ่งทำให้ฉันสนใจที่จะทำให้เครื่องยนต์กลายเป็นระบบเอนทิตี มันจะยังคงเป็นเอ็นจิ้นเกม HTML5 ที่มีปรัชญาฉากพื้นฐาน แต่ควรสนับสนุนการสร้างเอนทิตีจากส่วนประกอบ


ปัญหาที่ฉันมีตอนนี้คือปรับแนวคิดเครื่องยนต์เก่าของฉันให้เข้ากับกระบวนทัศน์การเขียนโปรแกรมใหม่นี้ นี่คือคำจำกัดความบางส่วนจากคำถามก่อนหน้านี้ที่อัปเดต:

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

  • ตัวแทนเป็นผู้ถือข้อมูล แต่ด้วยวิธีการที่สามารถทำงานกับข้อมูลที่ ตัวอย่างที่ดีที่สุดคือองค์ประกอบVector2Dหรือ "ตำแหน่ง" มันมีข้อมูล: xและyแต่ยังมีบางส่วนวิธีการที่ทำให้การดำเนินงานเกี่ยวกับข้อมูลง่ายขึ้นเล็กน้อย: add(), normalize()และอื่น ๆ

  • ระบบเป็นสิ่งที่สามารถดำเนินการบนชุดของหน่วยงานที่ตอบสนองความต้องการบางอย่าง; โดยปกติเอนทิตีจะต้องมีชุดของคอมโพเนนต์ที่ระบุเพื่อดำเนินการ ระบบเป็นส่วน "ตรรกะ" ส่วน "อัลกอริทึม" ฟังก์ชั่นทั้งหมดที่จัดทำโดยส่วนประกอบที่มีไว้สำหรับการจัดการข้อมูลได้ง่ายขึ้น


กล้อง

กล้องมีVector2Dคุณสมบัติตำแหน่งคุณสมบัติการหมุนและวิธีการบางอย่างสำหรับการจัดตำแหน่งให้อยู่กึ่งกลางจุด แต่ละเฟรมจะถูกป้อนให้กับโหมดแสดงภาพพร้อมกับฉากและวัตถุทั้งหมดจะถูกแปลตามตำแหน่งของมัน จากนั้นฉากจะแสดงผล

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

ตัวส่งอนุภาค

ปัญหาที่ฉันมีกับตัวส่งอนุภาคคืออีกครั้งสิ่งที่ควรเป็น ฉันค่อนข้างแน่ใจว่าตัวอนุภาคเองไม่ควรเป็นนิติบุคคลเพราะฉันต้องการสนับสนุนพวกเขามากกว่า 10,000 คนและฉันเชื่อว่าการสร้างเอนทิตีจำนวนมากจะส่งผลกระทบต่อประสิทธิภาพการทำงานของฉันอย่างมาก

ฉันจะแสดงวัตถุชนิดนี้ในระบบเอนทิตีได้อย่างไร

ผู้จัดการการป้อนข้อมูล

อันสุดท้ายที่ฉันอยากพูดถึงคือวิธีจัดการอินพุต Inputในรุ่นปัจจุบันของฉันของเครื่องยนต์ที่มีระดับที่เรียกว่า มันเป็นตัวจัดการที่สมัครสมาชิกกับเหตุการณ์เบราว์เซอร์เช่นการกดปุ่มและการเปลี่ยนตำแหน่งเมาส์และยังรักษาสถานะภายใน จากนั้นคลาสผู้เล่นมีreact()วิธีการซึ่งยอมรับวัตถุอินพุตเป็นอาร์กิวเมนต์ ข้อดีของการทำเช่นนี้คือวัตถุอินพุตอาจถูกจัดลำดับเป็น. JSON แล้วแชร์ผ่านเครือข่ายเพื่อให้สามารถจำลองแบบผู้เล่นหลายคนได้อย่างราบรื่น

สิ่งนี้แปลเป็นระบบเอนทิตีได้อย่างไร

คำตอบ:


26
  • กล้อง: การทำให้องค์ประกอบนี้ดูเรียบร้อย มันก็จะมีisRenderingธงและช่วงความลึกเหมือนฌอนกล่าวว่า นอกจาก "field of view" (ฉันเดาว่าคุณอาจเรียกมันว่าสเกลในแบบ 2D หรือไม่) และโซนเอาท์พุท โซนเอาท์พุทสามารถกำหนดส่วนของหน้าต่างเกมที่กล้องนี้แสดงผล มันจะไม่แยกตำแหน่ง / การหมุนเหมือนที่คุณพูดถึง เอนทิตีที่คุณสร้างที่มีองค์ประกอบกล้องจะใช้ตำแหน่งและส่วนประกอบการหมุนของเอนทิตีนั้น จากนั้นคุณจะมีระบบกล้องที่ค้นหาเอนทิตีที่มีส่วนประกอบของกล้องตำแหน่งและการหมุน ระบบใช้เอนทิตีนั้นและดึงเอนทิตีทั้งหมดที่สามารถ "ดู" จากตำแหน่งการหมุนความลึกของมุมมองและมุมมองไปยังส่วนที่ระบุของหน้าจอ ที่ให้ตัวเลือกมากมายสำหรับการจำลองพอร์ตมุมมองหลายตัวหน้าต่าง "มุมมองตัวอักษร" หลายคนในเครื่อง

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

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

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


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

สิ่งนี้ให้ความรู้สึกบริสุทธิ์ทางสถาปัตยกรรม แต่ระบบการแสดงผลจะกำหนดกล้องที่ใช้งานให้สั้นลงเมื่อทำการวนซ้ำผ่านเอนทิตีทั้งหมดได้อย่างไร
Pace

@ ก้าวเนื่องจากฉันต้องการให้กล้องที่ใช้งานพบได้อย่างรวดเร็วฉันน่าจะอนุญาตให้ระบบกล้องอ้างอิงถึงเอนทิตีที่มีกล้องที่ใช้งานอยู่
MichaelHouse

คุณวางตรรกะในการควบคุมกล้องหลายตัวไว้ที่ไหน (ดูหมุนหมุน ฯลฯ )? คุณควบคุมกล้องหลายตัวได้อย่างไร
ลาส

@plasmacel หากคุณมีวัตถุหลายอย่างที่ใช้การควบคุมร่วมกันมันจะเป็นความรับผิดชอบของระบบควบคุมของคุณในการพิจารณาว่าวัตถุใดที่ได้รับอินพุต
MichaelHouse

13

นี่คือวิธีที่ฉันเข้าหานี้:

กล้อง

กล้องของฉันเป็นเอนทิตีอื่น ๆ ซึ่งมีส่วนประกอบต่อไปนี้:

  1. TransformมีTranslation, RotationและScaleคุณสมบัตินอกเหนือไปจากคนอื่น ๆ สำหรับความเร็ว ฯลฯ

  2. Pov(จุดชมวิว) มีFieldOfView, AspectRatio, Near, Farและสิ่งอื่นที่จำเป็นในการผลิตเมทริกซ์ฉายนอกเหนือไปจากIsOrthoธงที่ใช้ในการสลับระหว่างมุมมองและประมาณการ orthographic Povยังจัดเตรียมคุณสมบัติ lazy-load ที่ProjectionMatrixใช้โดยระบบการเรนเดอร์ที่ถูกคำนวณภายในเมื่ออ่านและแคชจนกว่าคุณสมบัติอื่นใดจะถูกแก้ไข

ไม่มีระบบกล้องเฉพาะ ระบบการแสดงผลรักษารายการของPovและมีตรรกะในการพิจารณาว่าจะใช้รายการใดเมื่อแสดงผล

อินพุต

InputReceiverองค์ประกอบสามารถแนบนิติบุคคลใด ๆ นี่มีตัวจัดการเหตุการณ์ที่แนบมา (หรือแลมบ์ดาหากภาษาของคุณรองรับ) ที่ใช้เพื่อจัดการการประมวลผลอินพุตเฉพาะเอนทิตีซึ่งใช้พารามิเตอร์สำหรับสถานะคีย์ปัจจุบันและก่อนหน้าตำแหน่งเมาส์ปัจจุบันและก่อนหน้าของรัฐและสถานะปุ่มจริง ๆ มีตัวจัดการแยกต่างหากสำหรับเมาส์และคีย์บอร์ด)

ตัวอย่างเช่นในเกมทดสอบคล้าย Asteroids ที่ฉันสร้างเมื่อทำความคุ้นเคยกับ Entity / Component ฉันมีวิธีป้อนแลมบ์ดาสองวิธี จัดการกับการนำทางของเรือโดยใช้ปุ่มลูกศรและสเปซบาร์ (สำหรับการยิง) อีกตัวจัดการการป้อนข้อมูลด้วยแป้นพิมพ์ทั่วไป - ปุ่มสำหรับออก, หยุดชั่วคราว, ฯลฯ , ระดับการเริ่มต้นใหม่ ฯลฯ ฉันสร้างสององค์ประกอบแนบแลมบ์ดาแต่ละองค์ประกอบของตัวเองจากนั้นกำหนดองค์ประกอบของตัวรับสัญญาณการนำทางไปยังเอนทิตี้ของเรือ เอนทิตีหน่วยประมวลผลคำสั่งที่มองไม่เห็น

ต่อไปนี้เป็นตัวจัดการเหตุการณ์เพื่อจัดการคีย์ที่จัดขึ้นระหว่างเฟรมที่แนบกับInputReceiverส่วนประกอบของเรือรบ(C #):

  void ship_input_Hold(object sender, InputEventArgs args)
    {
        var k = args.Keys;
        var e = args.Entity;

        var dt = (float)args.GameTime.ElapsedGameTime.TotalSeconds;

        var verlet = e.As<VerletMotion>();
        var transform = e.As<Transform>();

        if (verlet != null)
        {

        /// calculate applied force 
            var force = Vector3.Zero;
            var forward = transform.RotationMatrix.Up * Settings.ShipSpeedMax;

            if (k.Contains(Keys.W))
                force += forward;

            if (k.Contains(Keys.S))
                force -= forward;

            verlet.Force += force * dt;
        }

        if (transform != null)
        {
            var theta = Vector3.Zero;

            if (k.Contains(Keys.A))
                theta.Z += Settings.TurnRate;

            if (k.Contains(Keys.D))
                theta.Z -= Settings.TurnRate;

            transform.Rotation += theta * dt;
        }

        if (k.Contains(Keys.Space))
        {
            var time = (float)args.GameTime.TotalGameTime.TotalSeconds - _rapidFireLast;

            if (time >= _rapidFireDelay)
            {
                Fire();
                _rapidFireLast = (float)args.GameTime.TotalGameTime.TotalSeconds;
            }
        }
    }

หากกล้องของคุณเป็นมือถือให้มันเป็นของตัวเองInputReceiverและTransformส่วนประกอบแนบแลมบ์ดาหรือตัวจัดการที่ใช้ควบคุมสิ่งที่คุณต้องการและคุณทำเสร็จแล้ว

นี่เป็นสิ่งที่เรียบร้อยที่คุณสามารถย้ายInputReceiverส่วนประกอบด้วยตัวจัดการการนำทางที่แนบมาจากเรือไปยังดาวเคราะห์น้อยหรืออย่างอื่นสำหรับเรื่องนั้นและบินไปรอบ ๆ แทน หรือโดยการกำหนดPovองค์ประกอบให้กับสิ่งอื่นในฉากของคุณ - เช่นดาวเคราะห์ดวงโคมไฟถนน ฯลฯ - คุณสามารถดูฉากของคุณจากมุมมองของเอนทิตีนั้น

InputSystemชั้นเรียนที่รักษารัฐภายในสำหรับแป้นพิมพ์เมาส์ ฯลฯInputSystemกรองคอลเลกชันกิจการภายในไปยังหน่วยงานที่มีInputReceiverส่วนประกอบ ในUpdate()วิธีการมันจะวนซ้ำผ่านคอลเลกชันนั้นและเรียกตัวจัดการอินพุตที่แนบกับแต่ละคอมโพเนนต์เหล่านั้นในลักษณะเดียวกับที่ระบบการเรนเดอร์ดึงแต่ละเอนทิตีด้วยRenderableส่วนประกอบ

อนุภาค

ขึ้นอยู่กับว่าคุณวางแผนจะโต้ตอบกับอนุภาคอย่างไร ถ้าคุณแค่ต้องการระบบอนุภาคที่มีพฤติกรรมเหมือนวัตถุเดียว - ดอกไม้ไฟแสดงว่าผู้เล่นไม่สามารถแตะหรือโดนได้ - ฉันจะสร้างเอนทิตี้เดี่ยวและParticleRenderGroupส่วนประกอบที่มีข้อมูลอะไรก็ตามที่คุณต้องการสำหรับอนุภาค - การสลายตัว ฯลฯ - ที่Renderableองค์ประกอบของคุณไม่ครอบคลุม เมื่อเรนเดอร์ระบบเรนเดอร์จะดูว่าเอนทิตีมีสิ่งที่RenderParticleGroupแนบมาและจัดการตามนั้นหรือไม่

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

จากนั้นไม่ว่าในการใช้งานของคุณMotionSystem(หรืออะไรก็ตามที่ใช้ในการจัดการการอัปเดตตำแหน่งเอนทิตี้ ฯลฯ ) หรือโดยเฉพาะให้ParticleSystemทำการประมวลผลใด ๆ ที่จำเป็นสำหรับแต่ละอนุภาคต่อเฟรม RenderSystemจะต้องรับผิดชอบสำหรับการสร้าง / batching และแคชคอลเลกชันของอนุภาคที่พวกเขากำลังสร้างและทำลายและทำให้พวกเขาตามที่ต้องการ

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

ข้อสรุป

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

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


คุณวางตรรกะในการควบคุมกล้องหลายตัวไว้ที่ใด (ดูหมุนหมุน ฯลฯ )?
ลาส

7

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

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

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


4

กล้องจะเป็นนิติบุคคลหรือเพียงส่วนประกอบ?

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

ฉันค่อนข้างแน่ใจว่าตัวอนุภาคไม่ควรเป็นสิ่งที่มีค่า

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

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


1

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

กล้อง :

มีองค์ประกอบ "กล้อง" ซึ่งสามารถเพิ่มไปยังเอนทิตีใด ๆ ฉันไม่สามารถคิดได้ว่าข้อมูลใดที่ฉันควรใส่ในส่วนนี้ แต่ฉันสามารถแยกส่วนประกอบ "ตำแหน่ง" และ "การหมุน" ได้! followวิธีไม่จำเป็นต้องถูกนำมาใช้เพราะมันมีอยู่แล้วต่อไปนิติบุคคลที่ถูกแนบไป! และฉันมีอิสระที่จะย้ายไปรอบ ๆ ปัญหาเกี่ยวกับระบบนี้จะเป็นวัตถุกล้องที่แตกต่างกันมากมาย: จะRendererSystemรู้ได้อย่างไรว่าควรใช้วัตถุใด? และฉันเคยผ่านวัตถุกล้องไปรอบ ๆ แต่ตอนนี้ดูเหมือนว่าRendererSystemจะต้องทำซ้ำสองครั้งในทุกหน่วยงาน: ก่อนอื่นเพื่อค้นหาสิ่งที่ทำหน้าที่เหมือนกล้องและสองเพื่อทำให้ทุกอย่างเป็นจริง

ผู้ส่งอนุภาค :

จะมีสิ่งParticleSystemที่จะอัปเดตเอนทิตีทั้งหมดที่มีองค์ประกอบ "ตัวส่ง" อนุภาคเป็นวัตถุที่โง่ในพื้นที่พิกัดสัมพัทธ์ภายในองค์ประกอบนั้น มีปัญหาในการแสดงผลที่นี่: ฉันอาจต้องสร้างParticleRendererระบบหรือขยายการทำงานของฟังก์ชันที่มีอยู่

ระบบอินพุต :

ข้อกังวลหลักสำหรับฉันที่นี่คือตรรกะหรือreact()วิธีการ ทางออกเดียวที่ฉันพบคือระบบแยกต่างหากสำหรับระบบนั้นและส่วนประกอบสำหรับแต่ละระบบซึ่งจะระบุว่าจะใช้ระบบใด นี่มันแฮ็คจริงๆและฉันไม่รู้วิธีจัดการมันดี สิ่งหนึ่งคือตราบใดที่ฉันเป็นห่วงความInputสามารถนั้นยังคงอยู่ในชั้นเรียน แต่ฉันไม่เห็นว่าฉันจะรวมเข้ากับส่วนที่เหลือของเกมได้อย่างไร


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

@ melak47 นั้นเป็นเรื่องจริงฉันก็คิดเช่นกัน แต่ฉันต้องการที่จะใช้มันอย่างที่ Aremis ทำ แต่นี้ "ระบบการจัดเก็บการอ้างอิงไปยังหน่วยงานที่เกี่ยวข้อง" ดูเหมือนว่าจะมีมากขึ้นและมีข้อบกพร่อง ...
jcora

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