엔터티 시스템 프레임 워크의 타일 맵?


12

엔터티 시스템 프레임 워크, 특히 Artemis를 읽었습니다. 그것이 나에게 적합한 지 결정하려고합니다. 나는 타일 기반의 2D 픽셀 아트 게임을 엄격히 연구하고 있으며, 그것이 리소스를 많이 사용한다고 생각하지 않습니다. 나는 항상 과거에 많은 상속과 함께 표준 OOP를 사용했습니다.

Entity System Framework에 대한 나의 이해는 (아직 내가 완전히 이해했는지는 확실하지 않습니다) :

  • 엔티티는 ID에 지나지 않습니다.
  • 구성 요소는 엔티티 구성 요소 풀에 추가 된 벙어리 데이터 일뿐입니다.
  • 시스템은 시스템 구성 요소 서명과 일치하는 모든 엔티티를 처리하기 위해 세계에 연결된 업데이트 기능입니다.

내 이해가 정확하다면 타일 맵과 AI 행동 트리를이 프레임 워크에 추가하는 것을 개념화하는 데 약간의 어려움이 있습니다. 앞으로 AI에 대해 물어볼 것입니다.

이 프레임 워크에 타일 맵을 만들어야합니까? 또는 타일 맵 편집기로 쉽게 생성 할 수 있도록 별도로 유지해야합니까?

타일 ​​맵을이 프레임 워크에 빌드해야한다면 각 타일이 다른 개체입니까? 그리고 타일 맵은 시스템입니까? 아니면 타일 맵 자체가 상속을 가진 단일 엔티티입니까?

타일 ​​맵이 분리 된 경우 외부 타일 맵에 대해 엔티티를 감지하는 가장 좋은 방법은 무엇입니까?

내가 나열한 여러 옵션이 올바르다는 것을 이해하지만, 과거에 누군가이 작업을 수행 한 경우 혼란에 대한 정보를 얻을 수 있습니다. 어쩌면 내가 생각하지 않은 다른 대안이 있습니까?

감사합니다.


완전히 임의의 음표 인 X / Y 좌표는 ID로도 작동합니다. 엔티티 시스템에서 구현하는 것이 아니라 엔티티 시스템에서와 동일한 방식으로 타일에 효과를 첨부 할 수 있습니다.
윌리엄 마리아 거

Byte56의 제안을 전달하면 구성 요소가 실제로 데이터 홀더가 될 필요는 없습니다. 그들이 실제로 그 데이터를 조작 할 수 있다면 유용 할 때가 있습니다. 예를 들어 벡터.
jcora

나는이 제안도 정말로 좋아한다. 타일 ​​맵 헬퍼를 데이터와 분리하거나 타일 맵을 여러 구성 요소 / 엔티티로 분리하지 않고도 엔티티 프레임 워크에 타일 맵을 추가 할 수 있습니다.
스펜서 Marr

Tilemap은 또 다른 구성 요소이며 충돌 시스템 및 렌더러 시스템은 타일 맵 및 타일 맵 렌더링으로 충돌을 처리합니다.
Kikaimaru

답변:


8

한참 동안 이미 개발 작업을 한 후에 엔터티 구성 요소 프레임 워크 (Artemis와 유사)를 구현했지만 빈 슬레이트에서 시작하면 다르게 수행했을 것이라고 생각하지 않습니다.

나는 세계가 실체 프레임 워크와 완전히 분리되어있다. 세상을 어떤 종류의 개체 또는 개체의 집합으로 변환하는 것은 의미가 없습니다. 내 세계는 큐브가있는 3D이지만 타일에도 동일하게 적용됩니다. 엔티티는 세계의 다른 모든 것을 구성하지만 지형은 분리되어 있습니다. 그러나 큐브를 제거하면 "재료"엔티티가 생성됩니다.

충돌 감지는 그다지 묶기 어렵지 않습니다. 여러분의 세계에는 isSolidAt(x,y)충돌 시스템이 활용할 유형 방법이있을 것입니다. 솔직히, 나는 이미 다른 대답으로 오늘 한 번 말했다 , 당신에게 가장 의미있는 것을하십시오. 타일 ​​맵을 별개로 만들거나 엔티티로 만들어서 규칙을 어기는 것은 아닙니다. 머리를 감쌀 수있는 것이 가장 좋습니다. 저에게는 그것은 세상을 분리시키고 다른 모든 것을 독립 체로 만드는 것이 었습니다.


1
내지도 엔티티 라고 가정 해 봅시다 . 다른 엔티티가지도의 isSolidAt방법 에 액세스하는 방법은 무엇입니까?
Gerardo Marset

지도를 엔티티로 저장하는 것은 아마도이 상황에 대한 좋은 아이디어는 아닙니다. 이 상황에서 직접 통신해야한다고 가정합니다. 지도 엔터티를 담당하는 시스템은지도 엔터티에 액세스 할 수 있으며 요청시 해당 엔터티에서 정보를 검색 할 수 있습니다.
MichaelHouse

4

타일 ​​맵을 엔티티에 별도의 구성 요소로 추가하고 (모든 타일이 내부에 있음) 타일 맵에 대한 별도의 렌더러도 있으므로 3D 또는 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
전체 타일 맵이 단일 구성 요소에 포함되어 있습니까? 일종의 게임 환경 개체 / 마스터 개체에 연결되어 있습니까? 렌더러를 타일 맵 구성 요소와 분리하면 상당히 큰 이점을 얻을 수 있습니다.
스펜서 Marr

답변을 업데이트 해 주셔서 감사합니다! 나는 코드 스 니펫을 좋아한다.
스펜서 Marr
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.