2017-01-13 16 views
2

먼저이 전체 소설을 읽는 데별로 관심이없는 사람이면 누구나이 질문에 코드가 없습니다.이 이론은 순전히 이론적 인 것입니다. 나는 내 전화를 들고 있는데,이 상황에 가장 적합하고 가장 쉬운 방법에 대한 질문입니다.타일 맵에 대한 int [,] 배열 또는 타일 [,] 배열

그래서 나는 기본적인 Tilemap 엔진 *이되어야한다고 생각하며 노력하고 있습니다. 그리고 나는 나의 접근 방식에 대해 의심 스럽습니다. 나는 이미 여러 번 그것을 다시 썼다. 그것이 너무 오래 걸린 것은 아니지만, 프로젝트는 여전히 기저귀에 있다고 말할 수 있습니다.

기본적으로 Sprite 클래스에는 string name, int Id, texture2d 텍스처가 있습니다.

그리고 Sprite 클래스에서 파생 된 Tile 클래스가 생성자에 추가되어 있습니다. Int X, int Y, bool walkable.

첫 번째 시도에서 2D 정수 배열을 사용하여 원하는 타일의 ID 값을 배열의 위치에 할당했습니다. 그리고 타일 맵을 그릴 때 나는 전체 배열을 두 번 반복 할 것이고 새로운 타일을 반환 할 Tile 함수를 사용하여 현재 루프의 배열 위치와 동일한 ID를 가진 타일을 찾는다. 루프 X 및 Y (명백한 이유 때문에 텍스처 크기로 곱함)로 계속 그립니다. 이 시점에서 내 Tile 클래스에는 X 및 Y 값이 없었습니다. 어떤 것을 앞뒤로 던지는 것 같았습니다. 그리고 어떤 이유로 그것이 원시적 인 접근 방식이라고 느꼈습니다.

그러나 또 다른 접근법을 생각해 보았습니다. 2D 타일 배열을 만들었고 각 배열 위치에 ID 값을 할당 한 다음이를 일치시켜 새로운 인스턴스를 만든 다음 그 값을 그려야했습니다. 배열을 반복하고 생성자에서 현재 X와 Y를 사용하여 원하는 타일의 새 인스턴스를 배열 위치에 놓은 다음 Tile.X 및 Tile.Y로 그립니다. 더 잘 맞는 것 같았습니다.

코드를 실행하기 전에 적어도 약 1 초가 걸렸습니다. 이제 타일을 그리기 전에 전체 배열에 타일을 채울 필요가있었습니다. 그렇지 않으면 이전에 ID가 0 인 타일이 있었기 때문에 null 객체 참조를 반환했습니다. 다른 것이 지정되지 않은 경우 기본값으로 그립니다. 내가 전에 가지고 있던 모든 엉망진창의 어딘가에, ID가 0 인 경우 그려주지 말라고하는 간단한 "if"도 있었지만 나중에 추가했습니다. 이제 Tile 배열을 사용하여 동일한 작업을 수행 할 수 있다는 것을 알았습니다. 0인지 확인한 다음 null이 아닌지 확인합니다. 그러나 null인지 확인하는 데별로 신경 쓰지 않습니다. 다시 말하지만, 코드가 완전히 생각해 보지 못하고 무언가를하고 있지 않다면, 그것은 나에게 원시적 인 것처럼 보입니다. 이전에 ID를 사용했던 타일과 xml을 매치하는 방법을 모르기 때문에 tilemap으로 간단한 xml 파일을 구문 분석하려고하면 또한 필레의 일종이 될 것입니다. Btw, 전에는 XML로 일한 적이 없기 때문에 문제가 될지 짐작할 수 있습니다.

* "프로젝트"가 엔진이라고 생각 될 수있는시기와 이유를 분명히 밝히지 만 기본적인 것은있을 수 있지만 그 역시 멋진 것입니다. 왜냐하면 나는 그것을 완전히 이해하지 못했기 때문입니다.

**이 상황에서 foreach를 사용하는 것이 더 적합 할 것이라는 것을 깨달았지만, 그 타일 배열은 afaik에서만 작동합니다.

TL : DR 내 질문을 끝내려면 무엇이 가장 적합합니까? 타일 ​​맵에 대한 int [,] 또는 Tile [,]? 그리고, 두 개의 무관 한 X와 Y int를 사용하는 대신 위치 지정을 위해 Tile 클래스에서 vector2를 사용해야합니까?

주 - 나는 컴퓨터 과학 학생이며, 지금까지 "hello world"교육 만 받았고 나머지는 개인적인 관심에서 나온 것입니다. 또한, 결함이나 용어가 잘못 사용 된 경우 나 수정하십시오. 나는 도움이 필요하기 때문에 여기에서 묻고 있는데, 온 - 오프 주제에 관계없이 모든 도움을 제공 할 것입니다. 그러나 그것이 적절하고 건설적인 방법으로 주어지면 감사하겠습니다.

편집 : 신성한 sht, 나는 그것을 많이 썼다조차 깨닫지 못했다. 이 모든 것을 읽는 사람이라면, 당신은 진정한 MVP입니다!

+0

나는 이것을 읽는 것을 즐겼다. 그러나 나는 당신에게 답을 가지지 않는다. .. Monogame와 타일 이론에 관한 굉장한 지위! – jhhoff02

+0

잘 묶여 있고 상대적으로 작은지도의 내지도 구조는 대개 'TileStack'의 2 차원 배열입니다. 'TileStack'은 좌표에 대한 메타 데이터를 가지고 있고,'List'는'Tile'입니다. 'Tile'은 Tile의 id와 타일 인스턴스에 대한 색, 오프셋, 회전 등과 같은 추가 정보를 포함합니다. –

답변

1

게임의 일부 영역에는 타일이 하나도 없을 수도 있고, 서로 위에 여러 개의 타일이있을 수도 있습니다.

예를 들어 바닥에 서있는 테이블은 바닥 타일과 반투명 테이블 타일을 모두 볼 수 있습니다. 이는 타일의 간단한 2 차원 배열이이 경우 충분하지 않음을 의미합니다.
아마도 좌표가 그려지는 타일 인스턴스의 목록일까요? 그런 다음 목록을 반복하고 화면에 타일 순서를 지정합니다.

0

여전히 관련성이 있지만 어쨌든 관련이 있는지 알 수 없습니다. 내 경험에 비추어 볼 때, [int]뿐 아니라 int [,] 타일을 사용하고 미래에 대해 생각해보십시오 (특히 매우 일반적인 건물 엔진 인 경우) 누군가가 타일을 애니메이션화하거나 일부 입력하려고 할 것입니다 로직을 타일에 적용합니다.

int [,]를 사용하여 타일 맵을 빌드 할 수 있지만 XML을 사용하는 것이 더 좋습니다. 팁 : TileID를 반복하거나 긴 switch-case (또는 많은 ifs ofc)를 사용하는 대신 사전 (HashMap의 C# 구현)에 저장할 수 있고 O (1) 대신에 O (n) (중요 할 수도 있고 그렇지 않을 수도 있음, 얼마나 많은 타일이 있는지에 달려 있습니다). 델리게이트에 생성 함수 등을 사전에 저장할 수 있습니다.

Tile [,] 또는 int [,]를 사용하지 않는 주된 문제는 충돌 감지입니다. 올바른 인덱스 (또는 인덱스 범위)를 계산하는 대신 타일 전체 집합을 반복해야합니다. 계산은 j = x/tilewidth;처럼 보일 것입니다 (O (n) 대신에 다시 O (1), 여기서는 매우 중요합니다).

테이블 (의자, 식물 등)의 틸맵에 레이어를 두 개 이상 지정하려는 경우 레이어 클래스 (타일 [,]을 포함해야 함)를 만들거나 타일 [,,,]을 사용할 수 있습니다. 여기서 첫 번째 인덱스는 레이어입니다. 나는 마지막 것이 더 복잡하고 덜 일반적이기 때문에 첫 번째가 더 좋다고 생각한다.

0

둘 다 할 수 있습니다!

"일반 타일 데이터"를 어딘가에 저장하고지도 타일 특정 데이터 (지도에 1 타일과 관련된 데이터, MapTile 또는 다른 것으로 불릴 수 있음)를 목록에 저장합니다.

그래서, 당신의 타일 클래스는 스프라이트는 "걷기"상태 등을 유지 것이며,이 타일 모델의에 MapTile이 참조를 보유 것, 그것은 맵의 위치는 레이어의,, 그리고 어쩌면 상태에서의 지도의 특정 타일에 고유 한 모든 데이터.

타일을 그리려면 MapTile 목록을 스크롤하고 타일 위치에 관련된 모델을 그립니다.

이 방법을 사용하면 메모리 사용량을 줄이고 Tile [,] 메서드의 기능을 사용할 수 있습니다.