[포니 게임 개발] 27. 다양한 카메라 모드 로딩화면

Posted by 적분 ∫2tdt=t²+c
2013.05.29 09:52 프로그래밍/포니게임개발



많은 부분을 손봤는데요, 크게 나눠보자면


1.카메라 기능 강화

2.로딩 화면 추가

3.스크립트처리 강화

4.모델링 추가

5.AMD 라데온에서 화면이 제대로 뜨지 않는 버그 수정

6.그래픽/사운드 설정 불러오기/저장


정도가 되겠네요.


먼저 카메라를 세분화했습니다.

기존의 시스템에서는 단순히 맵 상의 지정된 경로만을 따라서 움직이는 카메라와 고정되어있는 카메라만을 지원했습니다. 하지만 다양한 레벨 디자인을 위해서 카메라 코드를 대대적으로 수정해, 총 4종류로 카메라를 분류하고 지원하게 되었습니다. (명칭과 분류는 제가 자의적으로 붙인것이에요. 통용되는 용어와는 다를 수 있음을 밝힙니다.)



분류

 위치

 시선의 방향

 거리

 예

 Free Camera

 플레이어 캐릭터의 위치를 따라감

 플레이어 캐릭터의 시선을 따라감

 고정된 값

 일반적인 FPS 게임들

 Fixed Angle Camera

 플레이어 캐릭터의 위치를 따라감

 고정된 값

 고정된 값

 디아블로3

 Fixed Camera

 고정된 값

 고정된 값

 고정된 값

 특정한 지점만을 보여주기 위한 것으로 플레이 상에서는 자주 사용되지 않음

 Path Camera

 카메라 경로 상의 한 지점

 카메라 경로 상의 지점에서의 기울기

 카메라 경로에서 멀어진 정도를 이용하여 계산함

 소닉 제네레이션즈 등의 경로를 따라 달리는 게임


이 분류대로라면 기존까지 사용하던 카메라 모드는 Path Camera였죠. 근데 이제는 4종류 카메라를 모두 사용할 수 있게되었습니다. 말로만 봐서는 느낌이 잘 안올거같아서 영상을 준비했습니다.


먼저 Path Camera

맵 상에서는 보이지 않지만 양쪽의 건물 사이로 카메라 경로가 지나가고 있습니다. 그래서 카메라 경로상에서 멀어지면 자동으로 카메라 거리가 늘어나서 넓은 범위를 비추게 되지요. 또한 뒷부분에서는 자동으로 카메라가 회전합니다. 그건 그 쪽에서 카메라 경로가 틀어졌기 때문입니다. 이 경로대로라면 플레이어는 앞으로 가는 방향키 하나만 누르고 있어도 회전도 하게됩니다. 플레이어가 이동해야하는 경로가 정해져 있을때 사용하면 좋습니다.


다음에는 Fixed Angle Camera

플레이어 캐릭터의 위치만을 따라다니는 카메라입니다. 플레이어가 회전을 해도 카메라는 회전하지 않습니다. 디아블로3의 카메라, 스타크래프트2의 카메라 등등이 이러한 형태죠. 방향키를 누르는 방향이 월드 상에서 움직이는 위치와 일치하기 때문에, 3d길치인 플레이어들도 쉽게 적응할 수 있다는 장점이 있죠. 하지만 늘 고정된 방향만 볼 수 있기 때문에 입체감이 떨어질 수 있죠.


다음에는 구현하는데 가장 애먹었던 Free Camera


(이 영상이 최근 작업 현황이 다 담긴 영상입니다.)

플레이어 캐릭터의 위치와 시선을 모두 반영하는 카메라입니다. 플레이어가 회전을 하면 카메라도 같이 따라 돌죠. 플레이어가 자유롭게 회전하고 이동하며 이곳 저곳을 둘러볼 수 있기에 자유도가 높다는 장점이 있습니다. 하지만 다루기가 까다롭고, 3d길치 유저들은 길을 잃어버리기 쉽죠.

더불어 구현하는 것도 까다로웠는데

1. 플레이어 캐릭터의 시선을 카메라가 그대로 따라가서는 안됩니다. 처음에는 아무것도 모르고 카메라가 시선을 정확하게 같이 따라가게했더니, 플레이어가 휙휙 회전하니 카메라도 덩달아 휙휙 너무 빨리 회전해서 어지럽게 되더라구요. 또한 카메라가 캐릭터와 같이 회전하므로, 캐릭터는 상대적으로 늘 같은 위치에 있어 보여서, 캐릭터가 도는게 아니라 세상이 역으로 도는것처럼 보입니다.


2. 4방향키의 역할을 잘 분배해야합니다. 처음에는 [↑]키만 앞으로 이동하는데 쓰고, [←][→]키는 좌우로 회전하는데 사용하고, [↓]키는 180도 회전하는데 사용했습니다. 보통 플레이어들은 방향키를 누르면 자연스레 움직이는 것을 생각하기 때문에, 이 조작법은 너무 불편했습니다. 또한 [↓]키 같은 경우, 플레이어는 후진하기를 원하며 이 키를 누르는데, 이 조작법에서는 [↓]를 누르고 있으면 캐릭터가 뱅글뱅글 돌 뿐(으아 어지럽다~~) 후진은 전혀 하지 않습니다.


그래서 이런 모드와 비슷한 카메라를 사용하는 게임을 찾아서 열심히 플레이해봤습니다. 마침 깔려있던 [소닉 제네레이션즈]를 면밀히 살펴본 결과

[↑][↓]키는 카메라의 회전 없이 캐릭터만 앞뒤로 이동한다는 것과

[←][→]키는 캐릭터가 회전하며 이동하고, 카메라는 캐릭터의 회전 중 일부만을 따라간다는 것을 알아냈습니다.


그래서 다음과 같이 수정했습니다.


1. 카메라는 최대 초당 80도 회전합니다. 캐릭터가 더 빨리 회전해서 이동한다고 해도 카메라는 80도까지만 회전하도록 하여, 너무 빨리 도는 카메라 때문에 어지러운 현상을 방지합니다. 또 카메라와 캐릭터 회전이 달라지기에, 캐릭터도 상대적으로 회전하는것으로 보여 세상이 역으로 도는것처럼 보이는 현상이 없앨 수 있습니다.

2. [←][→]키는 캐릭터를 현재 카메라 방향에서 좌우로 이동시키며 카메라 역시 회전시키고, [↑][↓]키는 캐릭터를 현재 카메라 방향 전후로 이동시키고, 카메라를 회전시키지 않습니다.


그 결과 카메라 움직임이 자연스러워졌습니다ㅎㅎ 이야 신난다!


다음 작업으로는 로딩화면을 추가한 것입니다.

로딩화면 자체는 어려운 작업이 아니었는데, 로딩화면에서 스레드를 생성하여 데이터를 로딩하는 작업이 복잡했습니다. 핵심은 역시나 동기화입니다. 사족을 달자면 c 11의 std::thread로 만든 작업은 반드시 join()을 호출해주어야 깔끔하게 종료가 됩니다. 무조건 호출해야할것!


다음 작업은 스크립트의 문법 오류가 있으면 출력하도록 한 것이죠. 당연히 해야할 일이었는데, 그동안은 귀찮다는 이유로 문법오류가 있으면 예외를 던지고 죽어버리게했거든요...

그리고 구역(region)을 유닛에게 부착할 수 있게 하는 트리거함수를 추가했습니다. (이렇게 다이나믹한 레벨 디자인의 세계로 넘어가는거야~)


그리고 핑키파이와 래리티 모델링을 추가했습니다. 대사는 덤.


가장 중요한 문제였던 라데온 그래픽카드에서의 문제를 해결했습니다. 윈8이 깔린 AMD APU 노트북이 있는데, 이상하게도 거기서는 렌더링은 말짱하게 잘되는데 마지막에 화면이 꺼멓게 나오더라구요. 며칠을 고민해도 해결책이 안 나왔는데, 사소한 곳에서 문제가 있었나봅니다. 쉐이더 코드에서 버텍스 쉐이더는 VertexShader = vs1_1 MRT(); 요런식으로 1.1버전에 맞춰놓았는데, 이걸 vs3_0으로 바꾸니 말끔하게 해결됐습니다. 쉐이더를 최소사양으로 적으면 안되는 경우도 있나봅니다. 요즘에는 개나소나 쉐이더 모델 3.0 이상 지원하니 굳이 1.1 같은거 쓸필요없잖아요..!ㅋ




신고
이 댓글을 비밀 댓글로
    • ㅎㄹㅎㄹ
    • 2013.06.06 01:03 신고
    이정도 퀼리티로 계속 만드시면 해외 브로니들이 기꺼이 목소리 더빙정도는 해줄꺼에요 모집 하면 ㅋ 진짜 멋있네요 프로그래밍 하시는거
    • 이거 게임완성되면 배포하실꺼에요?
    • 2013.06.09 08:42 신고
    다만들때까지 파이어!
  1. 퀄리티가 대단하네요.. 헠헠
  2. 대화가... 좀 웃기네요 ㅋㅋ