기획자 본인만큼 잡다한 블로그

greentec.egloos.com

포토로그




로그라이크 게임 제작 - 안개와 시야 적용하기 프로그래밍





전장의 안개는 게임에 처음 도입되었을 때부터 무척 매력적인 요소였다. 실제 전투의 불확실성을 심플하게 재현하는 시스템이면서 2D 게임에서의 구현도 그다지 어렵지 않다. 미지의 안개로 가득했던 전장을 걷어내고 미니맵을 밝히고 나면 뭔가 굉장한 일을 한 것 같은 뿌듯함을 느끼곤 했었다.




로그라이크 게임에서의 안개는 보통 던전크롤이나 스톤수프처럼 현재 보이는 곳, 현재 보이지 않지만 가본 곳, 현재 보이지 않고 가보지도 않은 곳으로 구분된다. 이 분류법은 스타크래프트 같은 RTS나 대부분의 RPG 에서도 가장 보편적으로 쓰이는 방식이다.

여기에 조금 더 욕심을 내면 내 캐릭터가 서 있는 곳을 광원(light source)이라고 생각하고, 광원에서 멀어질수록 빛이 조금씩 희미해지는 효과를 낼 수 있다. 그냥 알파를 없애면 심심하니 노이즈 효과를 추가하면 그럴듯한 그림이 만들어진다.





광원 효과(?)를 적용하니 이미지가 좀 더 고급스러워졌다.


안개와 함께 생각해야 할 것이 시야다. 2D 게임이기 때문에 관찰자의 눈에서는 당연히 모든 것이 보이지만, 게임 캐릭터의 눈에는 시선에 벽이 있으면 그 뒤의 것은 보이지 않아야 정상이다. 가장 보편적으로 쓰는 방법 중 하나는 raycasting 기법인데, 여기에 꽤 친절하게 설명되어 있다. 광원에서 모든 방향으로 빛을 쏘다가(== 선을 그리다가) 벽을 만나서 막히면 그 이상 진행하지 않고 다음 각도로 넘어간다. 그리고 시야에 보이는 것만 안개로 처리해주고, 시야에 보이지 않는 것은 '가보지 않고 보이지도 않는' 안개로 덮어주면 다음과 같은 결과물이 만들어진다.



여기까지 작업한 결과물을 wonderfl에 올려놓았다. 방향키나 wasd키로 이동 가능하고, 오른쪽 하단의 Reset 버튼을 누르면 던전이 다시 만들어진다. 프로그램 설명에도 써놓았지만, 조만간 여러 가지를 추가하면서 블로그에 글을 계속 쓸 생각이다.






덧글

  • 트래핑 2015/08/17 20:06 # 답글

    우와 멋집니다. 앞으로가 기대 되네요.
  • 기획자 2015/08/18 22:52 #

    감사합니다! 많이 부족하지만 열심히 하겠습니다.
  • 뉴런티어 2015/08/18 00:40 # 답글

    저런 광원효과에도 레이캐스팅을 이용하는군요...
  • 기획자 2015/08/18 22:51 #

    다른 방법으로 해보려다가 그냥 코드가 가장 간단한 방법으로 했습니다. 프로그래밍이 본업이 아니라 어렵네요 ㅠㅠ
  • 뉴런티어 2015/08/18 23:31 #

    저도 본업은 기획자입니다.
    하지만 시스템 최적화에서 재미가 느껴져서...
  • 잠이오냐 2017/11/09 13:26 # 삭제 답글

    안녕하세요 프로그래밍 공부중인 학생입니다! 로그라이크형 게임에 레이캐스팅을 이용해 시야구현을 할려고 하고있는데 전 퍼포먼스가 엄청나게 떨어지더라구요. ㅜㅜ 다시짜봐야겠네요
  • 기획자 2017/11/12 20:58 #

    안녕하세요. 원래 코드가 올라가 있던 사이트는 문을 닫아서, 이곳에서 코드를 확인해보실 수 있습니다. http://fl.corge.net/c/jLiP 여기서 //judge line of sight 주석으로 시작되는 블록에 시야 처리 부분이 있습니다.
댓글 입력 영역

애드센스