2주차에선 몬스터를 생성하고 몬스터의 움직임을 구현했다.
그리고 난수 생성기에 들어갈 난수 시드값은 randomdevice로 선언했다.
이것은 프로그램이 실행될 때 하드웨어의 상태에 따라 다른 시드값이 발생한다.
단 이 선언 자체가 작업량이 매우 큰 편이므로 static 선언으로 프로그램 실행 중 한번만 선언하게끔 했다.
이 시드값을 바탕으로 난수 생성기를 돌려야했다.
이 프로젝트를 진행하기 전 나는 시간(currentTime)을 시드값으로 사용하는 rand함수를 사용했다.
그러나 자료 조사를 하면서, rand함수는 한계가 명확하단걸 알았다.
그러다 찾은 대안의 랜덤 함수가 메르센 트위스터라는 난수 생성기이다.
기존의 rand 함수는 난수의 반복주기가 약 2^32로 짧다는 단점을 갖고있다.
그러나 메르센 트위스터 난수의 반복주기는 2^19937-1이나 갖기 때문에 거의 완벽한 랜덤값을 가질 수 있다.
(메르헨 트위스터 난수 발생기가 "거의" 완벽한 이유는 결국엔 시드값을 필요로 하기 때문이다. 시드 값을 가지는 난수 생성기는 시드값만 추정할 수 있으면, 난수의 패턴을 알 수 있기 때문이다.)
몬스터의 움직임을 구현한 코드이다.
그러나 이 코드는 극복해야할 문제점이 많다.
첫번째는 몬스터가 일직선으로 못 나아가는 현상이다.
몬스터가 캐릭터를 향해 일직선으로 가야하는 상황에서 부들부들 떨면서 간다.
몬스터가 일직선으로 이동하는 판정이 나빠서 생기는 현상같다.
기울기 범위를 조정하여 일직선으로 이동하는 범위를 늘리면 해결가능할거 같다.
두번째는 실제 구현에 비해 if문이 쓸데없이 많아보인다.
단순한 계산을 통해 이동 방향을 정하는건 좋지만, if문을 더 줄여보고싶다.
내가 생각하는 가장 좋은 방법은 몬스터의 이동 방향 (벡터)를 한번에 더 많이 선언 할 수 있다면 더 좋을거 같다.
예를 들어 지금 몬스터의 방향은 다섯 가지 * 사분면의 방향으로 정해진다.
그러나 기울기 값이 아닌 삼각함수를 사용하여 더 많은 가짓수의 방향을 선언할 수 있지 않을까?
그렇다면 사분면의 방향을 나누는 if문이 줄어들 것이다.
마지막 세번째가 가장 복잡한 문제인데, 이 코드는 몬스터 비트맵이 겹칠수 밖에 없는 코드이다.
뱀파이어 서바이어에서는 몬스터가 겹치는 일이 없다.
몬스터가 겹친다면 몬스터의 수를 제대로 셀 수 없고,
공격 한번에 여러마리의 몬스터가 공격당할테니 밸런스 면에서도 큰 문제이다.
그러므로 나는 몬스터들끼리 서로가 거리를 유지하게 코드를 짜야한다.
서로의 거리를 유지하면서, 플레이어에게 향해가도록 코드를 짜야한다.
내 생각엔 인공지능 시간에서 배운 너비탐색 알고리즘을 활용하는게 좋을거 같다.
'개발 프로젝트 > Win32 - VampireSurvivor 모작' 카테고리의 다른 글
로그라이크 게임 구현(4) - 비쥬얼 업데이트, TransparentBlt 함수 (0) | 2022.05.12 |
---|---|
로그라이크 게임 구현 - Context based steering algorithm을 활용한 움직임 구현 (0) | 2022.04.07 |
로그라이크 게임 구현 2주차 (1) (0) | 2022.03.24 |
로그라이크 게임 구현 1주차 (5) (0) | 2022.03.24 |
로그라이크 게임 구현 1주차(4) (0) | 2022.03.24 |