http://blogs.msdn.com/b/ericlippert/archive/2011/12/29/shadowcasting-in-c-part-six.aspx
그걸 번역해주신 선천성귀차니즘님이 계신다.
http://blog.naver.com/dunkydonk/220216784332
그걸 읽다가 포기한 내가 있다. =ㅁ=
그래서 소스를 보고, 구현방법에 대해서만 설명을 하겠다. (기본이론, 원리 등은 위 블로그를 참고)
1. 일단 기본적으로 맵이 있을 것이다. #: 벽, . :바닥, ★ :플레이어
########################################################### ########################################################### ########################################################### ###★...#...........##....##........#####...####........### ###.....#............##...#..........##.....##.....##...### ###.....#.............##......#.......##....##....##....### #######................##.....##.......##...###...#.....### ####....................############...##..##$..###.....### ###...........#...#...#................##...#####.......### ###.......#...............#.............##.....##.......### ###...........#...#...#.........................#.......### #####.....#...............#................#....#.......### ###.###.......#...#...#.....................#...#.......### ###...###..................................##..##.......### ###...###..................................###.##.......### ###...###..................................###.##.......### ####....####........##.............#########..#........#### #####..............#####...##......................######## ########################################################### ########################################################### ###########################################################
2. 이것을 2차원 형태의 배열로 저장해놓는다.
ex) map[x,y]
3. 가시거리(시야)를 설정한다
ex) _sight = 10;
4. 계산한후 결과값을 저장할 bool 배열을 만든다.
ex) bool[,] lit = new bool[width,height]; (가로세로 사이즈는 맵의 크기)
5. 이 링크에서 소스를 받아서 아래 부분만 있으면 된다.
http://unitycoder.com/blog/2013/04/06/roguelike-shadowcasting/
아래 부분이 핵심 알고리즘 내용인데.. 솔직히 C# 5년차지만 저딴문법 처음본다.
개인적으로 신입도 수정가능한 소스코드로 프로그램 작성하는것이 나의 신념이기에. 이런코드는 정말 싫어한다.
ShadowCaster.ComputeFieldOfViewWithShadowCasting(posX, posY, _sight,
(x1, y1) =>; map[x1, y1] == "#", (x2, y2) =>; { lit[x2, y2] = true; });
posX = 플레이어 X좌표
posY = 플레이어 Y좌표
_Sight = 시야
6.저 부분을 수행하고나면 lit 배열안에 현재 플레이어 시야에 보여지는 부분은 true로 값이 설정된다.
7.결과값이 나왔으니 루프를 돌면서 false 값이 있는곳 시야를 없애 주면된다.
나의경우 3D로 진행하기 때문에
1).플레인 오브젝트 만들고,
2).오브젝트의 텍스쳐를 투명받을수 있는것 선택하고.
3).오브젝트사이즈를 맵사이즈와 맞쳐주고,
4).맵위 허공에다가 올렸다.
그래서 시야가 있는곳은 투명이고, 시야가 없는곳은 검은색으로 텍스쳐를 변경시켰다.)
8. 로그라이크 기준으로 본다면, 방인지, 복도인지, 입구인지, 벽인지에따라서 텍스쳐색을 변경시키는 것으로 시야를 조절한다.
위 로직을 플레이어가 움직일때마다 수행해주면 기본적인 Fog Of War가 된다.
한번 지났던길을 불투명 처리하는거야.
7번에서 따로 배열하나 저장해두고. 갔는지 안갔는지 체크해두면 간단할거라 생각된다.
번역본 : http://blog.naver.com/dunkydonk/220216784332
원글 : http://blogs.msdn.com/b/ericlippert/archive/2011/12/29/shadowcasting-in-c-part-six.aspx
코드 : http://blogs.msdn.com/b/ericlippert/archive/2011/12/29/shadowcasting-in-c-part-six.aspx
최종 소스 : http://unitycoder.com/blog/2013/04/06/roguelike-shadowcasting/
1 댓글
안녕하세요
답글삭제글을 너무 잘 보았습니다.
예제 소스에서는 2D로 선명하고 딱딱한 전장의 안개가 구현이 되어있는데,
가장 아래 스샷처럼 가장자리는 뿌옇게효과를 주는것을 어떻게 구현하셨는지 궁금합니다.
실례가 안된다면 3D로 저렇게 구현하신 예제 유니티 패키지나 혹은 블로그 글을 작성 해 주실있습니까?
이 블로그 보고 많은거 배웠습니다 ^^
감사합니다.