2D 타일 기반 사이드 스크롤러 지형을 무작위로 생성하려면 어떻게해야합니까?


11

다음 타일셋을 사용하여 2D sidecroller 게임에 대한 맵을 임의로 생성하고 싶습니다. 여기에 이미지 설명을 입력하십시오

나는 예를 들어, bitmasking 과정에 대한 몇 가지 좋은 기사를 발견했다 : http://www.angryfishstudios.com/2011/04/adventures-in-bitmasking/ http://www.saltgames.com/2010/a-bitwise -적용 타일 맵 /

나는 거대한 if 절이나 switch 문을 수행하는 대신 비트 마스크 / 타일 마스크를 사용하는 아이디어를 좋아합니다.

그러나 전체 프로세스를 시각화하는 데 문제가 있으며이 기사 중 어느 것도 무작위 화에 대해 이야기하지 않습니다.

내 타일은 내가 연결된 예제의 타일이 보이는 것처럼 한 가지 방법이 아닌 여러 가지 다른 방식으로 함께 맞습니다.

예를 들어 다음은 몇 가지 예입니다.

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

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

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

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

내 타일은 여러 가지 방식으로 함께 사용되므로 8 비트 마스크가 작동하지 않을 것이라고 생각합니다. 따라서 더 큰 비트 마스크를 사용하려고 생각했습니다. char [8] 또는 char 4 와 같은 것 .

누군가 일반 알고리즘이 어떻게 보일지에 대한 의사 코드 / 예제를 보여 줄 수 있다면 대단히 감사하겠습니다.

답변:


3

그렇습니다. 마스크 크기는 점점 더 많은 옵션으로 증가 할 것입니다-자신의 링크 http://www.saltgames.com/2010/a-bitwise-method-for-applying-tilemaps/ 두 번째 부분은 주요 아이디어를 설명합니다.

본질적으로 타일 사이의 각 '테두리'에 대한 X 가능성을 열거해야합니다. 귀하의 특정 예에서 "타일 상단 / 하단"은 (1) 흰색 (2) 또는 (3) 반으로 덮여있을 수 있습니다. 이는 기사에 제공된 '1 차'예와 일치합니다.

그러나 마스크는 타일 가능성을 그릴 수있는 것으로 제한하는 데 도움이 되며 실제지도를 현명한 방법으로 생성 하는 방법을 보여주는 방법은 아닙니다 .

특정 타일셋은 실제로 매우 제한적입니다. 단 하나의 표면 상승 / 하강 만 설명하며 '정수 레벨'시작 지점에는 몇 가지 유효한 선택 사항 만 있습니다. 예를 들어, 타일 # 2 이후에는 타일 # 1 또는 # 8 만 가능합니다. 왼쪽에서 오른쪽으로 이동하면 이전 타일 다음에 올 수있는 (몇 개의) 타일 목록을 만들고 임의로 그 중 하나를 선택할 수 있습니다.


나는 이것이 내가 찾고있는 대답이라고 생각하지만 여전히 약간 흐립니다. 설명의 마지막 부분이 어떻게 작동하는지 텍스트 또는 의사 코드로 좀 더 자세하게 알 수 있습니까? "단순으로 왼쪽에서 오른쪽으로 이동하여 이전 타일 다음에 올 수있는 (몇 개의) 타일 목록을 만들고 임의로 타일 중 하나를 선택할 수 있습니다."
erebel55

1
각 타일 유형마다 그 이후에 어떤 타일이 허용되는지 목록을 작성하십시오. 타일이 거의 없으므로 수동으로 빠르게 수행 할 수 있습니다. '높이'가 변경되어 새 타일 아래의 모든 항목을 # 10으로 채 웁니다.
Peteris

아, 그래서 당신은 비트 마스킹 대신 에이 방법을 사용한다고 말하고 있습니까?
erebel55

1
예, 모든 2D 컨텐츠가 의미가있는 경우 비트 마스킹이 유용하지만 맵은 높이가 변하는 단일 레벨의 수평 표면 인 것 같습니다.
Peteris 2013

"산"의 높이는 다양하고 서로 흐를 것입니다. 따라서 기본적으로 계속 움직일 때마다 산이 계속 높이 변경됩니다. 서로 다른 지점에서 임의의 크기를 갖는 코사인 / 사인파와 같은 종류입니다. 지도를 생성 할 때 왼쪽에서 오른쪽으로 또는 위에서 아래로 이동해야합니까?
erebel55

6

1D Perlin 또는 단면 노이즈 기능 사용을 고려 했습니까? 여기에는 다음과 같은 여러 가지 장점이 있습니다.

  1. 무한정 (부동 소수점 정밀도 범위 내), 반복되지 않는 지형

  2. 예제에서와 같이 실시간으로 생성되거나 (더 빠른 셰이더에서도 ) 미리 생성되어 텍스처에 저장 될 수 있습니다.

  3. Perlin과 simplex가 연속적이므로 테두리가 자동으로 일치합니다.

  4. 지형 자체는 의사 난수이지만 봉투 기능을 적용하거나 평평한 영역이나 필요한 기타 특정 지형 기능이 필요한 영역의 옥타브 수를 쉽게 줄일 수 있습니다.

1D Perlin 구현에 대한 자세한 설명이 링크를 참조하십시오 .

엔벨로프는 기본적으로 스칼라 필드 또는 출력을 저장하거나 표시하기 전에 노이즈 기능을 곱한 함수입니다.

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

(위에 언급 된 기사에서 초기 이미지를 빌 렸습니다.)

이 예에서 빨간색 선은 다음과 같이 정의 된 조각 별 함수를 나타냅니다.

x < 0.3 : y = (0.3-x)/0.3)
x < 0.5 : 0
x < 0.7 : (x - 0.5) / 0.2
else    : 1

... 매끄러운 기능을 사용하여 더 잘 정의 할 수 있습니다. 이 경우에는 고원 전에 항목을 0으로 축소 한 다음 나중에 1로 다시 조정합니다.

최신 정보

다음은 내 프로젝트 중 하나의 3D 심플 렉스 "지형"의 예입니다. 확산 + 정반사 조명이 적용되어 완전히 vert + tess + frag shader pipe 내에서 생성되었습니다. 상황에 따라 지형 슬로프를 얻기 위해 수직 슬라이스를 제거합니다.

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

하향식 직교 뷰 :

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


이것은 실제 타일 이미지 자체를 생성하는 기술입니까?
erebel55

1
@ erebel55 예. 2D 기능을 사용하여 (예를 기반으로) 이미지 내에 다른 식물의 아이들을 배치하고 경사 지형을 생성 할 위치를 결정할 수 있습니다. 나는 이것을 3D로 사용하여 훌륭한 결과를 얻었습니다.
3Dave

흥미로운 방법처럼 보입니다. 이미지를 이미 만들었 으므로이 경로를 따라 가고 싶지는 않습니다.
erebel55

네, 그것이 당신을 위해 일하고 있다면 기존 물건을 던질 이유가 없습니다.
3Dave

글쎄, 난 아직 무작위 세대가 작동하지 않았지만, 나는 희망한다;) 나는 당신에게이 방법에 대한 찬성 투표를했는데, 그것은 흥미롭고 장차 언젠가 사용할 수 있기 때문이다. 감사합니다
erebel55
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.