ไทล์แม็พใน Entity System Framework


12

ฉันอ่านกรอบ Entity System เป็นพิเศษโดยเฉพาะอาร์ทิมิส ฉันพยายามตัดสินใจว่ามันเหมาะสมกับฉันหรือไม่ ฉันทำงานบนเกมอาร์ตพิกเซล 2d อย่างเคร่งครัดและฉันไม่คิดว่าพวกเขาจะต้องใช้ทรัพยากรมากนัก ฉันเคยใช้ OOP มาตรฐานมาแล้วและมีมรดกมากมายในอดีต

ความเข้าใจของฉันเกี่ยวกับ Entity System Framework ตอนนี้ (ฉันไม่แน่ใจว่าฉันเข้าใจทั้งหมดหรือไม่) คือ:

  • เอนทิตีเป็นอะไรนอกจาก ID
  • ส่วนประกอบคืออะไร แต่ข้อมูลที่เป็นใบ้เพิ่มไปยังกลุ่มส่วนประกอบเอนทิตี
  • ระบบคือฟังก์ชั่นอัปเดตที่เชื่อมต่อกับโลกเพื่อจัดการทุกเอนทิตีที่ตรงกับลายเซ็นองค์ประกอบของระบบ

หากความเข้าใจของฉันถูกต้องฉันก็มีปัญหานิดหน่อยที่จะเพิ่มแนวความคิดในการเพิ่ม tilemaps และ AI Behavioral Trees ในกรอบนี้ ฉันจะถามเกี่ยวกับ AI ในอนาคต

ควรมีการสร้าง tilemap ในเฟรมเวิร์กนี้หรือไม่? หรือควรแยกไว้ต่างหากเพื่อให้ง่ายต่อการสร้างด้วยโปรแกรมแก้ไข tilemap?

ถ้า tilemap ควรสร้างไว้ในเฟรมเวิร์กนี้แต่ละไทล์เป็นเอนทิตีที่แตกต่างกันหรือไม่? และ tilemap เป็นระบบ? หรือเป็น tilemap เองเอนทิตีเดียวที่มีการสืบทอดสร้างขึ้นจากมัน?

หาก tilemap กระจายตัวอะไรจะเป็นวิธีที่ดีที่สุดในการตรวจจับการชนกันของเอนทิตีเทียบกับ tilemap ภายนอก

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

ขอบคุณ.


บันทึกย่อแบบสมบูรณ์พิกัด X / Y ทำงานเป็น ID ได้เช่นกัน ไม่ใช่ว่าฉันแนะนำให้คุณใช้มันในระบบเอนทิตีของคุณ แต่คุณสามารถแนบเอฟเฟกต์ไปยังไทล์ของคุณในลักษณะเดียวกับที่คุณทำในระบบเอนทิตี
William Mariager

สวัสดีเพิ่งผ่านข้อเสนอแนะของ Byte56: องค์ประกอบไม่จำเป็นต้องเป็นผู้ถือข้อมูลที่โง่ บางครั้งมันจะมีประโยชน์หากพวกเขาสามารถใช้ข้อมูลนั้นได้จริง เช่นเวกเตอร์
jcora

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

Tilemap เป็นเพียงองค์ประกอบอื่นและระบบการชนและระบบการแสดงผลจัดการกับการชนด้วย tilemap และการแสดงผลของ
tilemap

คำตอบ:


8

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

ฉันมีโลกของฉันแตกต่างจากกรอบเอนทิตี้ทั้งหมด มันไม่สมเหตุสมผลเลยที่ฉันจะเปลี่ยนโลกให้เป็นเอนทิตี้หรือการสะสมเอนทิตี โลกของฉันเป็นแบบ 3 มิติที่มีลูกบาศก์ แต่ฉันเชื่อว่ามันใช้กับกระเบื้องได้ เอนทิตีประกอบทุกอย่างอื่นในโลก แต่ภูมิประเทศแยกจากกัน อย่างไรก็ตามเมื่อลบคิวบ์ออกแล้วพวกมันจะวางไข่เอนทิตี "วัสดุ"

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


1
สมมติว่าแผนที่ของฉันเป็นหน่วยงาน นิติบุคคลอื่นจะดำเนินการเกี่ยวกับisSolidAtวิธีการของแผนที่ได้อย่างไร
Gerardo Marset

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

4

ฉันเพิ่ม tilemap เป็นองค์ประกอบแยกต่างหากไปยังเอนทิตี (ที่มีไทล์ทั้งหมดอยู่ภายใน) และยังมีโหมดเรนเดอร์แยกต่างหากสำหรับแผนที่ย่อยดังนั้นฉันจึงสามารถเรนเดอร์แบบ 3 มิติหรือ 2d เพื่อสร้างกระเบื้องทั้งหมดเป็นเอนทิตีที่เป็นไปได้

อะไรแบบนั้น:


Entity e("map");
e.addComponent(new Tilemap("1.xml"));
e.addComponent(new TilemapRenderer2d(graphics));

tile map is something like that
class Tilemap
{
  array of tiles;
  getTileAtPosition(); 
  isWalkable ; etc;
}

class ITilemapRenderer
{}

class TilemapRenderer2d
{
draw() 
{ 
  foreach (tile in owner()->component()->tiles()) 
  {
    if (tile == ground) ground_sprite->draw() ....
  }
}

ประโยชน์ในการแยกการวาดจากตรรกะเป็นแนวคิดพื้นฐานของรูปแบบ MVC


1
ไทล์แมปทั้งหมดมีอยู่ในองค์ประกอบเดียวหรือไม่ มันแนบมากับเอนทิตีของเกมสภาพแวดล้อม / เอนทิตีหลักบางอย่าง? ฉันเห็นประโยชน์มากที่ได้รับจากการแยก render-er จากส่วนประกอบ tilemap
Spencer Marr

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