깃허브 링크 - https://github.com/seokmin/2d_map/tree/v0.1

*사실 아무도 안봤으면 좋겠다. 더럽고 더럽고 더럽고 더럽고 더럽고 더러운 코드들... 더러운 코드들... 더티 코드 베리베리 더티 코드즈...



맵을 n*m칸으로 쪼개어 저장해놓으면, 바둑판 모양으로 그래프를 쭈욱 그려서 메모리상에는 항상 캐릭터가 위치한 zone을 중심으로 한 9개의 맵만 띄워놓는다.

일단은 캐릭터가 속해있는 맵의 경계선을 지날 때 가려는 방향의 맵을 새로 메모리에 올리고, 지나온 방향의 맵을 메모리에서 내린다.

만약에 전체 맵(n*m개의 zone을 전부 붙여놓은)의 경계선을 지난다면, 전체 맵을 순환하게 해놓았다.(지구는 둥그니까)

아직 타일 이미지만 화면에 띄우는 것이라 엄청 간단한 일이고, 맵에 딸린 이벤트, NPC, 각종 오브젝트들까지 이 방법으로 구현하려면 멀고도 험한 길이 될 것 같다.

하지만 일단 목표로 했던 "타일 이미지라도 오픈월드로 돌아다닐 수 있게 만들자!"는 달성했다.


그런데... 만들다보니 엄청난 벽에 느닷없이 부딪혀 버렸는데..

영상에서 보다시피 로딩할 때 걸리는 시간때문에 zone을 넘어다닐 때 게임이 멈춰버린다.

이러면 눈으로 보기에만 seamless이지 사실은 게임에 전혀 써먹을 수도 없고, 일랜시아, 바람의나라같은 흔한 맵 시스템과 다를 것이 없다.

따라서 맵을 메모리에 올리고 내리는 과정을 백그라운드에서 진행해야 매끄럽게 돌아갈텐데, cocos2d-x가 백그라운드 리소스 로딩을 지원하지 않는 것으로 알고 있어서 엄청난 멘붕에 빠져버렸다.

어찌어찌 해서 MapManager 로직을 따로 빼서 멀티스레드로 돌린다고 하더라도, 로직을 분리해봤자 리소스를 로드하고 그려주는 cocos2d-x가 싱글스레드로 동작하는 이상 해결 방도가 없다는 것..

방법은

1. cocos2d-x를 뜯는다.

2. 엔진을 만든다.

3. 포기한다.


3번은 절대 싫다.

1번은 내 실력이 미천해서 어렵고 힘들고 엄청난 시간과 노력을 요하는 과정일 것 같다.

2번은 내 실력이 미천해서 어렵고 힘들고 어렵고 힘들고 어렵고 힘들고 불가능한 과정일 것 같다.


일단 구글링(...)을 비롯해 여러 곳에서 해결 가능한 방법이 있는지를 알아보고, 정 해결 방법이 없다고 한다면 고민을 많이 해봐야 할 것 같다.

Posted by RPG만들기XP
,