2D 사이드 스크롤 게임에서 "방"을 어떻게 감지합니까?


24

Terraria가 "주거지"를 감지하는 방식과 같이 게임에서 만들 수있는 특정 유형의 건물과 방을 인식하는 시스템을 만들고 싶습니다. 이 게임에서, 일련의 조건을 만족하는 블록 구역을 구성하여 타일 기반 세계에서 주택을 건설 할 수 있습니다.

  1. 이 구역은 플레이어가 배치 한 블록으로 "외부"와 완전히 절연되어 있습니다.
  2. 영역은 5x7 사각형에 맞을 수 있습니다.
  3. 밀폐 된 공간에는 적어도 하나의 테이블, 하나의 광원 및 의자가 있습니다.
  4. 구역에서 나오는 문이 있습니다.
  5. Terraria에는 전경 및 배경 타일 레이어가 있습니다. 존의 전체 배경은 플레이어가 배치 한 블록으로 채워 져야합니다.

플레이어가 적절한 크기의 지역을 건설 한시기를 효율적으로 감지하는 방법과 해당 지역에 필요한 가구 / 구성 요소가 모두 포함되어 있는지 효율적으로 확인할 수 있습니까?

모든 주택 요구 사항을 충족하는 내부 구역의 예 :

여기에 이미지 설명을 입력하십시오


5
좀 더 자세히 설명해 주시겠습니까? Terraria의 "빌드 유형"이란 무엇이며 "거주"는 무엇입니까? 모든 사람이 그 게임을 한 것은 아니며, 사람들이 도움을주기를 원한다면 한 가지 질문에 집중하고, 그 질문에 명확한 답이 있는지 확인하십시오 (의견이 아님)
TomTsagk

1
유형과 함께 사용되는 다른 구성 요소 / 타일을 의미합니다. 내 질문은 아래에서 해결됩니다. 도움을 주셔서 감사합니다. 앞으로 더 자세히 설명하고 향후 질문에 더 구체적으로 설명하겠습니다.
Bernardo Becker

1
여담으로서, 차이가되도록 실내거주지 . 글 머리 기호 목록에는 동일한 정의로 볼 것을 제안합니다. 테라 리아를 예로 들어, 적들이 거주지가되지 않아도 (예 : 테이블이 없거나 차원이 5x5에 불과한 경우에도) 방에 스폰되지 않음
Flater

답변:


37

Terraria에는 익숙하지 않지만 범람 채우기 알고리즘을 사용하여 쉽게 수행 할 수 있습니다 .

픽셀 대신 타일을 확인하고, 확인 된 각 타일에 대해 알고리즘이 다른 타일을 계속 검사하는 동안 프로세스 중에 찾은 객체를 배열 또는 목록에 저장하면서 평가할 수 있는지 평가합니다.

알고리즘은 캐릭터가있는 타일에서 시작합니다. 1 초마다 시작할 수 있습니다. 2 ... 최상의 간격을 찾기 위해 조정해야합니다.

알고리즘이 너무 오래 실행되는 것을 방지하는 것이 좋습니다. 이는 실행 당 알고리즘이 실행할 수있는 타일 수를 제한하여 수행 할 수 있습니다. 그렇지 않으면 캐릭터가 열린 영역에있을 때 알고리즘에서 지연이 오래 발생합니다.

편집하다

주석에서 언급했듯이 플레이어가 타일을 변경할 때 또는 알고리즘을 시작 하는 am I modified?변수가 있는 타일과 같이 알고리즘 시작 시점에 대한 다른 접근법을 사용할 수 있습니다 true. 그러나이 방법에주의해야합니다.

  • 방의 일부이지만 캐릭터가있는 타일이 아닌 타일을 수정하면 어떻게 되나요? 다른 플레이어 나 환경 이벤트로 인해 타일이 변경되었거나 타일 수명이 다했을 수 있습니다. 캐릭터는 수정 사항을 인식하지 못하며 오류가 발생하기 쉬운 업데이트 된 방을 감지하기 위해 알고리즘을 실행하지 않습니다.

캐릭터가없는 타일에서 이러한 수정 사항을 감지하는 일종의 접근 방식을 구현할 수 있지만 간격에서 알고리즘을 실행하는 것이 가장 간단한 접근 방식이며 오류가 덜 발생합니다. 모든 프레임에서 플러드 필을 실행하지 않도록하십시오.

편집 종료


9
"플레이어 배치 블록"타일 중 플러드 필 만 사용하는 이유는 무엇입니까? 이것은 동굴이나 저택에 "플레이어가 배치 한 블록"으로 채워지지 않는 한 개방 된 지역에서 무한한 홍수로 채워지는 것을 막거나 줄일 수 있습니다.
jimbo1qaz

20
왜 일정한 간격으로 이것을 실행 하시겠습니까? 블록을 배치 할 때 (또는 해당되는 경우 파기 할 수 있고 두 경우 모두 블록 당 상각 된 일정한 시간에 완료 될 수 있음) 또는 맵의 특정 부분을로드 할 때 블록을 실행 한 다음 결과를 저장할 수 있습니다. 그곳에.
NotThatGuy

3
@immibis : Terraria는 바닥을 바꿀 필요가 없다고 확신합니다. 또한 게임이 타일을 배치 한 사람에 따라 행동을 인식하는 방을 바꿀 것이라고는 기대하지 않습니다. 예를 들어 절벽에 인접한 방을 만들면 어떻게됩니까?
Flater

3
Terraria는 배경 벽을 놓을 필요가 있으며 자연적인 배경 흙 / 바위가있는 집을 형성하지 않습니다. 실제로 플레이어가 배치 한 블록 만 확인합니다.
loa_in_

3
CPU를 절약하기 위해 블록 변경시 알고리즘을 실행 한 다음 각 블록의 상태를 저장합니다. 이것으로, 그것은 간단합니다isRoom()
Herr Derb

3

@Ferreira da Selva가 말했듯이 플러드 필 알고리즘을 사용해보십시오. 그러나 알고리즘을 실행할 때 몇 가지 다른 기준을 사용하여 포함 여부를 판별 할 수 있습니다.

예를 들어, 각 타일마다 배경 타일이 있는지 확인하고없는 경우 타일이 포함되어 있지 않다는 것을 알 수 있습니다. 또는 여러 프레임에서 분리하여 지연된 실행을 수행하여 프로세서의 부하를 줄이고 지연을 줄 이도록 할 수 있습니다. 또는 플레이어가 준수해야하는 룸 크기 제한을 만들 수 있습니다.

이러한 조합을 사용하면보다 효율적이고 효과적으로 수행 할 수 있습니다.


3

컴퓨터 과학에는 두 가지 어려운 문제가 있습니다. 이름 지정, 캐시 무효화 및 일대일 오류.

이것은 캐시 무효화 문제입니다.

"이것이 내부에있다"라는 기록이 있다면 블록을 배치하거나 제거 할 때마다 플러드 필을 통해 블록과 해당 영역을 업데이트하기가 매우 쉽습니다.

이를 최적화하기 위해 일련의 "내부"계층을 원할 수 있습니다.

"셀"은 플레이어가 배치 한 블록 (특정 크기까지)으로 둘러싸인 영역입니다.

"방"은 배경 타일이있는 셀입니다.

"내부"는 문, 조명 및 의자가있는 방입니다.

플레이어가 배치 한 전경 블록을 배치 할 때 시계 방향 / 반 시계 방향으로 이동하여 새 셀이 형성되는지 확인하십시오. 플레이어가 배치 한 포 그라운드 블록을 제거 할 때 셀이 깨 졌는지 확인하십시오. 그렇다면 두 셀을 병합하여 새 셀이 형성되는지 확인하십시오.

새로운 세포가 형성되거나 형성되지 않으면, 방이나 내부에 있는지 확인하십시오.

셀은 룸에 필요한 배경 타일 수를 추적 할 수 있습니다. 그런 다음 셀이 형성되고 백그라운드 타일이 셀에서 추가되거나 제거 될 때 간단한 카운트는 셀이 룸인지 판별 할 수 있습니다.

마찬가지로 셀은 의자와 광원 (및 모든 종류의 물체)이 몇 개나 있는지 추적 할 수 있습니다. 그런 다음 내부 점검은 간단합니다.

출입도 가능합니다.


그래서 우리는 "셀"로지도를 보강합니다. 타일이 추가되거나 제거되면 위치의 셀을 확인하고 셀의 수를 늘리거나 줄입니다.

전경 블록을 추가하거나 제거 할 때 시계 방향 / 반 시계 방향 걷기를 사용하여 셀의 내부와 외부를 정의합니다. 셀의 크기가 제한되어 있으므로이 보행은 제한된 수의 단계를 수행합니다.

보너스로, 당신은 이제 방 안에 각 개체 유형의 개수가 있기 때문에 "부족한"방이나 "방이 거룩한 분수로 축복을 받았다"또는 방에 대한 다른 것에 대해 이야기 할 수있는 저렴한 방법이 있습니다. 또는 방의 크기가 제한되어 있으므로 반복을 수행하면 캐시가 제거됩니다.

각 위치는 최대 하나의 셀에 있으므로 각 위치의 셀 ID를 기본 맵에 저장할 수 있습니다.


0

플러드 필 알고리즘을 사용하는 경우 각 타일을 검사 할 때마다 증가하는 변수도 만드십시오. 따라서 35 (7 * 5, 방의 최대 크기)보다 크면 검사가 중지됩니다!


7 * 5는 방 안에 꼭 들어가야하는 최소 크기의 사각형입니다.
Rick
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.