본문 바로가기

반응형

전체 글

(429)
랜덤 던전 - 오토 타일링 들어가며이전 포스트 '랜덤 던전 생성(Procedural Dungeon Generation)'에서는 절차적으로 랜덤 던전을 생성하는 방법과 그에 필요한 기술들을 알아 보았다. 이번 포스트에서는 이전 포스트에서 생성된 던전 데이터를 기반으로 실제 우리가 '게임'이라 불릴만한 그래픽이 적용된 결과를 만들어 보도록 하겠다.본 포스트에 사용된 예제는 유니티를 이용해 제작 되었으며 전체 프로젝는 여기에서 확인할 수 있다.git에서 프로젝트를 받아 바로 유니티 프로젝트를 실행하면 다음과 같이 Player.idle_front 를 찾을 수 없다는 에러를 볼 수도 있다.이는 스프라이트 아틀라스가 생성되지 않아서 그런것 이므로 프로젝트에서 스프라이트 아틀라스를 생성 할 수 있도록 설정 해주도록 한다.유니티 메뉴 Edit ..
랜덤 던전 생성(Procedural Dungeon Generation) 들어가며필자는 픽셀 던전과 같은 던전을 탐험하는 로그라이크 게임을 좋아한다. 세상에는 이미 천재들이 만들어 놓은 명작 로그라이크 게임들이 존재하지만, 항상 나만의 스토리와 퀘스트를 가진 나만의 로그라이크 게임을 가지는 꿈을 가지고 있다.그 시작으로 이번 포스트에서는 로그라이크 게임의 메인 요소인 '랜덤하게 생성되는 던전'에 대한 내용을 다뤄 보도록하겠다. 본 포스트에서는 랜덤 던전을 만들기 위한 기술과 알고리즘들 살펴 볼 것이며, 필자가 이 포스트를 위한 예제를 만들며 직접 겪은 경험들과 생각들 또한 더해보도록 하겠다.본 포스트에 사용된 예제는 유니티 기반으로 개발 되었으며 전체 프로젝트는 [여기]에서 확인할 수 있다. 만일 여러분이 코드를 분석하고자 한다면 주요 알고리즘과 자료 구조는 DungeonGe..
보이어 왓슨(Bowyer-Watson) 알고리즘 들어가며보이어 왓슨(Bowyer-Watson) 알고리즘은 델로네 삼각분할(Delaunay Triangulation)이라는 공간 분할법을 구현하는 여러가지 방법 중에 하나다.보이어 왓슨 알고리즘에 앞서 델로네 삼각분할을 간략하게 살펴 보도록 하자.델로네 삼각분할은 공간을 분할하는 방법 중에 하나로써 평면 위의 임의의 점들을 삼각형 형태로 연결하는 방법이다. 다만 단순 삼각형을 만드는 것이 아니라, "삼각형의 내각의 최소값이 최대가 되도록 한다"라는 규칙을 가진다. 간단히 말하면 최대한 정삼각형에 가까운 삼각형들을 만드는 것이다.다음 그림을 살펴 보자 :위 그림의 A의 네 점들을 연결하여 삼각형을 만든다고 생각해 보자. 두 가지 선택이 가능한데, B의 경우 처럼 세로로 분할 해 긴 삼각형 형태를 만들거나, ..
삼각형의 외접원 구하기 들어가며점 세 개로 이루어진 다각형을 우리는 삼각형이라고 부르고, 이 삼각형의 모든 꼭지점을 지나는 원을 '삼각형의 외접원'이라고 정의 한다.만일 여러분이 직접 컴퍼스를 들고 삼각형의 세 꼭지점이 동시에 놓이는 원을 그리려고 하면 '모든 점을 지나는 원'의 '중심'을 정확히 찾기가 쉽지 않다는 것을 알게 될 것이다.하지만 원리만 안다면 그렇게 어렵지 않게 삼각형의 외접원을 구하는 것이 가능하다. 이번 포스트에는 외접원을 구하는 원리에 대해 살펴 보도록 하겠다.원의 정의기하학에서 원(圓, 영어: circle)은 '평면 위의 한 점으로 부터 일정한 거리에 있는 점들의 집합'으로 정의 되고 있다. 좀 더 간단히 말하면 원은 '중심점'과 '반지름'으로 구성되어 있다는 말이다. 원은 중심점과 반지름을 이용해 그릴..
벡터(vector)의 연산 벡터는 두 점들 사이의 차이 또는 변위(displacement)를 나타낸다. 기하학에서의 벡터기하학에서의 벡터(일반적으로 'v' 라고 표현)는 크기(또는 길이)와 방향을 가지는 요소이고 끝이 화살표인 선분으로 표현된다. 길이(or 크기)가 1인 벡터는 '단위' 또는 '정규화된' 벡터라고 한다.'제로 벡터'는 길이가 0이고 방향을 가지지 않는다.벡터는 위치를 가지지 않는다. 위치와 상관 없이 동일한 크기와 방향을 가지는 벡터는 같다.기하학에서 벡터는 '방향'과 '변화', 이 두가지 의미로 사용 될 수 있다. 벡터의 덧셈 뺄셈실수와 마찬가지로 벡터도 산술 연산이 가능하다. 벡터의 덧셈은 두 벡터를 결합하여 새로운 벡터를 만든다. 벡터의 덧셈의 대수학적 법칙은 실수의 덧셈과 유사하다.v + w = w + v ..
단위 벡터(Unit Vector) 단위 벡터(Unit Vector)란?단위 벡터는 크기(길이)가 1인 벡터를 의미한다. 주로 벡터의 방향을 나타내는데 사용되며, 벡터의 정규화(normalization)를 통해 얻을 수 있다.단위 벡터는 원래의 벡터 방향을 유지하면서 길이를 1로 조정한 벡터단위 벡터의 특징크기(길이) : 단위 벡터의 크기는 항상 1이다.방향 : 단위 벡터는 원래 벡터와 같은 방향을 가지며, 벡터의 방향만을 나타낸다.표기법 : 일반적으로 단위 벡터는 아래 처럼 모자(^)를 씌워 표현하거나 ei형태로 나타낸다.단위 벡터의 예2차원 : i = (1, 0), j = (0, 1)3차원 : i = (1, 0, 0), j = (0, 1, 0), k = (0, 0, 1)단위 벡터를 구하는 방법(정규화)일반 벡터에서 단위 벡터를 구하는 ..
A*(Astar) 길찾기 알고리즘 들어가며로그라이크의 근본은 누가 뭐래도 작은 타일들로 이루어진 복잡한 미로 속에서 몬스터와 싸워나가며 결국엔 던전을 클리어하고 보물을 얻는것이라 생각한다. 그런데 던전에서 캐릭터와 몬스터들이 이동하는 것을 보니 한 가지 궁금한것이 생긴다. 복잡한 미로 속에서 캐릭터는 어떻게 유저가 이동하라는 곳으로 자연스럽게 이동하는 것일까? 몬스터는 어떻게 장애물들을 피해 플레이어를 공격해 올 수 있는 것일까? 이번 포스트 이런 물음에 답을 주기 위해 게임을 만드는데 필수 요소 중의 하나인 길 찾기(path finding) 알고리즘에 대해 살펴 보도록 하겠다.다익스트라 vs A*알고리즘을 조금이라도 공부해본 사람이라면 길 찾기 알고리즘이라고 하면 가장 먼저 다익스트라 알고리즘을 떠올릴 것이다. 다익스트라 알고리즘은 '..
[C++] 스레드 동기화 - lock_guard 들어가며 이전 포스트 '스레드 동기화 - mutex'에서는 C++ 표준 라이브러리에서 제공하는 std::mutex 객체의 lock, unlock 함수를 직접 호출하여 크리티컬 섹션에 진입할 수 있는 스레드를 직접 컨트롤 했었다. 하지만 이런 방법은 앞으로 살펴 볼 '실수'를 유발할 수 있고, 이 실수들은 데드락을 발생 시켜 프로그램을 영원히 블록 시킬수 있다. 이번 포스트에서는 std::mutex의 멤버 함수를 직접 호출할 때 야기할 수 있는 '실수'들을 살펴 보고, std::lock_guard를 사용했을 때의 이점에 대해 살펴 보도록 하겠다. std::mutex의 문제 위에서 std::mutex의 lock과 unlock 멤버 함수를 직접 호출하는 경우 프로그래머의 '실수'로 인해 프로그램이 데드락 상태..

반응형