posted by pflower 2014. 7. 13. 11:32

  무한 루프 스크롤 만들기, 옛날 횡, 종 스크롤링 게임들에서 많이 사용되었던 스롤링링 방식중에 하나이다. 항성계를 시뮬레이트 하고 싶은 내 게임에서는 빠질수가 없는 기능이다.


무한 루프 스크롤링을 하려면 일단 내가 맵을 어떻게 그리는지를 확실히 해둘 필요가 있다.


타일맵을 그려넣는 방식은 여기저기 넘치지만, SFML에서 내가 쓰는 방식은 다음과 같다.


1) 전체 타일맵 정보를 메모리에 모두 저장 (메모리 공간을 아끼기 위해 일부만 저장해야할 필요가 있어 보인다. 다만, 디스크 IO에 의해서 느려지지 않아야한다.)

2) 캐릭터 위치에 따라 필요한(보이는) 타일맵을 렌더 타겟에 블리팅 (성능 저하를 막기 위해서이다.)

3) 뷰포트를 캐릭터 시점 및 확대축소에 따라 따라가면서 이동


  이전에 SDL에서는 뷰 포트를 사용하지 않았기 때문에, 화면에서의 캐릭터의 위치는 고정하고 모든 맵 스프라이트들을 순회하면서 블리팅하여 뿌려주는 방식으로,  지금와서 생각해보면 상당이 무식한 방식이라고 생각한다.

  뷰포트가 캐릭터를 따라서 가므로 매번 스프라이트 좌표를 캐릭터 위치에 따라 갱신해줄 필요 없이, 그 자리에 그리면 된다.


  그러나 뷰포트로 그리는 경우에는 무한 스크롤링시에 각 분할된 스크롤들의 경계선에 대한 문제가 생긴다.




  하늘색이 화면, 까만색이 무한 루프를 하지 않는 경우에 표시되지 않는 루프 영역 주황색이 원래 표시되던 본 병역이다. 초록색이 월드맵이다.


  경계선 문제를 해결하기 위해서, 뷰포트가 랜더 타겟의 한계 영역을 벗어났을때의 무한 루프를 지원하는가 살펴 봤더니 그런것은 없었다. openGL 영역으로 가면 있을지도 모른다는 생각이 들었지만, 모듈을 수정할 생각을 하니 이내 관두었다.

  그래서 간단하게 생각해 봤다.  렌더링 함수의 길이가 길어지는 것은 정말 사양하지만, 개발의 편의를 위해서 랜더링 함수 중간에 랜더링 영역 체크 부분을 음수 혹은 월드맵 바깥 영역까지 확장하고, 확장된 경우에 모듈러 연산을 통해서 그 부분에 그려져야할 타일을 얻어낸다.

  그런후 렌더링 직전에 바깥 렌더링 영역의 좌표 공간으로 타일을 치환한 뒤에, 원상복구 시켜놓는다.

무지막지하게 무식한 방법이지만, 다른수가 마땅히 떠오르지 않아 일단 이렇게 해두었다.


그런데 이렇게 해두고 나니 여러가지 문제가 발생했다.

1) 좌우영역의 루프는 정상적으로 동작하지만, 상하 영역의 루프는 캐릭터 좌표에 따라 루프후 빈 공간이 생기는 문제가 생겼다.

2) 뷰 포트는 피직스 엔티티 위치를 기준으로 동작하는데, 엔티티가 루프에 들어갈경우 월드맵 입장에서는 반대 영역에서 나오기 때문에, 한순간 빠르게 월드맵 반대편으로 이동해버린다. (뷰 이동이 자연스럽지 않다.)

3) 루프용으로 추가 연산되는 영역에 엔티티가 존재할 경우에 표시되지 않는다. 루프영역에 엔티티가 존재하는지를 확인하는 추가 연산이 필요할지도 모른다.




'개발 > SFML' 카테고리의 다른 글

[openGL] glDrawElements가 안될때  (0) 2016.09.30