Tilemaps trong một khung hệ thống thực thể?


12

Tôi đã đọc về Entity System Frameworks cụ thể là Artemis. Tôi đang cố gắng để quyết định nếu nó phù hợp với tôi. Tôi nghiêm túc làm việc trên các trò chơi nghệ thuật pixel 2d dựa trên gạch và tôi không nghĩ chúng sẽ tốn nhiều tài nguyên như vậy. Tôi đã luôn sử dụng OOP tiêu chuẩn với rất nhiều sự kế thừa trong quá khứ.

Sự hiểu biết của tôi về Khung hệ thống thực thể ngay bây giờ (tôi không chắc là tôi đã nắm bắt hoàn toàn chưa) là:

  • Các thực thể không có gì ngoài ID
  • Các thành phần không là gì ngoài dữ liệu câm được thêm vào nhóm thành phần thực thể
  • Hệ thống là các chức năng cập nhật được gắn vào thế giới để xử lý mọi thực thể phù hợp với chữ ký thành phần Hệ thống

Nếu sự hiểu biết của tôi là chính xác thì tôi gặp khá nhiều rắc rối khi khái niệm hóa việc thêm tilemaps và Cây hành vi AI vào khung này. Tôi sẽ hỏi về AI trong tương lai.

Có nên xây dựng một tilemap vào khung này không? Hoặc nó nên được giữ riêng biệt để dễ dàng tạo bằng trình chỉnh sửa tilemap?

Nếu tilemap nên được xây dựng trong khung này, mỗi ô có phải là một thực thể khác nhau không? Và tilemap một hệ thống? Hoặc bản thân tilemap là một thực thể duy nhất có sự kế thừa được xây dựng từ nó?

Nếu tilemap là vừa phải, cách tốt nhất để phát hiện va chạm với các thực thể chống lại tilemap bên ngoài là gì?

Tôi hiểu rằng nhiều tùy chọn mà tôi đã liệt kê có thể đúng, nhưng nếu có ai đã làm điều này trong quá khứ, họ có thể làm sáng tỏ sự nhầm lẫn của tôi. Có lẽ có một sự thay thế khác mà tôi đã không nghĩ đến?

Cảm ơn bạn.


Một lưu ý hoàn toàn ngẫu nhiên, tọa độ X / Y cũng hoạt động như ID. Không phải tôi đang đề nghị bạn triển khai nó trong hệ thống thực thể của mình, mà thay vào đó, bạn có thể đính kèm các hiệu ứng vào các ô của mình theo cách tương tự như trong hệ thống thực thể.
William Mariager

Này, chỉ cần chuyển qua đề xuất của Byte56: các thành phần không thực sự cần phải là chủ sở hữu dữ liệu câm. Đôi khi nó sẽ hữu ích nếu họ thực sự có thể vận hành dữ liệu đó; vectơ, ví dụ.
jcora

Tôi thực sự thích đề nghị này là tốt. Tôi có thể thêm tilemaps vào khung thực thể mà không phải tách trình trợ giúp tilemap khỏi dữ liệu hoặc phải chia tilemap thành nhiều thành phần / thực thể.
Spencer Marr

Tilemap chỉ là một thành phần khác, và hệ thống va chạm và hệ thống kết xuất xử lý các va chạm với tilemap và kết xuất của tilemap
Kikaimaru

Câu trả lời:


8

Tôi đã triển khai một khung thành phần thực thể (tương tự như Artemis) sau khi tôi đã phát triển được một thời gian, nhưng tôi không nghĩ rằng mình sẽ làm mọi thứ khác đi nếu bắt đầu từ một bảng trống.

Tôi có thế giới của tôi hoàn toàn tách biệt với khung thực thể. Tôi không có ý nghĩa gì khi chuyển đổi thế giới thành một loại thực thể hoặc bộ sưu tập các thực thể. Thế giới của tôi là 3D với các hình khối, nhưng tôi tin điều tương tự cũng áp dụng cho gạch. Các thực thể tạo nên mọi thứ khác trên thế giới, nhưng địa hình tách biệt. Tuy nhiên, khi các hình khối được loại bỏ, chúng tạo ra các thực thể "vật chất".

Phát hiện va chạm không quá khó để liên kết. Thế giới của bạn có thể sẽ có isSolidAt(x,y)các phương thức loại mà hệ thống va chạm của bạn sẽ sử dụng. Thành thật mà nói, tôi đã nói điều này một lần hôm nay trong một câu trả lời khác , làm bất cứ điều gì có ý nghĩa nhất với bạn. Bạn không vi phạm bất kỳ quy tắc nào bằng cách tách riêng bản đồ ô vuông hoặc biến nó thành một thực thể. Bất cứ điều gì bạn có thể quấn đầu xung quanh là những gì tốt nhất. Đối với tôi, đó là giữ cho thế giới tách biệt và biến mọi thứ khác thành thực thể.


1
Nói bản đồ của tôi một thực thể. Làm thế nào một thực thể khác đi về việc tích lũy isSolidAtphương pháp của bản đồ ?
Gerardo Marset

Lưu trữ bản đồ như một thực thể có lẽ không phải là một ý tưởng tuyệt vời cho tình huống này. Tôi cho rằng bạn phải liên lạc trực tiếp với nó trong tình huống này. Hệ thống phụ trách thực thể bản đồ sẽ có quyền truy cập vào thực thể bản đồ và có thể truy xuất thông tin từ thực thể đó khi được yêu cầu.
MichaelHouse

4

Tôi đã thêm tilemap dưới dạng một thành phần riêng biệt vào thực thể (có tất cả các ô bên trong) và cũng có trình kết xuất riêng cho bản đồ ô vuông, vì vậy tôi có thể kết xuất nó ở dạng 3d hoặc trong 2d. Để tạo ra tất cả các gạch như các thực thể là có thể nhưng đắt tiền.

đại loại như thế:


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() ....
  }
}

lợi ích trong việc tách bản vẽ khỏi logic là ý tưởng cơ bản của mẫu MVC


1
Toàn bộ tilemap được chứa trong một thành phần duy nhất? Có gắn liền với một số loại thực thể môi trường trò chơi / thực thể chủ? Tôi có thể thấy một lợi ích khá lớn có được bằng cách tách render-er khỏi thành phần tilemap.
Spencer Marr

Cảm ơn bạn đã cập nhật câu trả lời của bạn! Tôi yêu đoạn mã.
Spencer Marr
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.