adsense



[JAVA/slick2d] 2D 슈팅게임 위치즈 스크램블 제작강좌 -step 2-


step 2. 화면 표시의 우선 순위

※현재의 src 폴더를 적당한 것으로 리네임하고 src_step2 폴더를 src로 리네임한 후, 이클립스의 패키지 익스플로러에서 F5로 새로고침 해 주면 쉽게 소스를 교체할 수 있습니다. 다음 스텝으로 넘어갈 때는 현재의 폴더를 다시 src_step2로 바꿔주고요.

현재의 구조에서는, 대체로 나중에 추가된 오브젝트일수록 위에 그려집니다.

하지만 실제로는 캐릭터는 배경보다 위에, 이펙트는 캐릭터보다 위에, UI는 모든 오브젝트보다 위에. 이런 우선 순위가 필요해집니다.

슈팅게임이 아닌 액션게임이라면, y좌표에 따라(화면에 가까울수록) 더 앞으로 표시되어야 하는 경우도 있겠고요.


새롭게 GameObject를 상속하는 Player 클래스를 만들겠습니다.


내용은 Cloud와 비슷하게 요시카의 그림을 그려주는 부분 뿐입니다. Cloud에서도 편의상 구름을 이동시키는 부분을 막아둡니다.

클릭해서 새 Cloud 객체를 생성하는 부분에, 랜덤하게 구름 아니면 요시카를 생성하도록 합니다.



표시 우선 순위를 위해 GameObject에서는 zorder, 그리고 _zorder라는 변수를 준비합니다.
zorder는 프로그래머가 지정할 수 있고, _zorder는 내부적으로 사용하는 감춰진 변수입니다.

setZOrder와 getZOrder 함수도 추가합니다.

zorder 숫자가 더 큰 오브젝트가 위에 올라오도록 할 것입니다. (즉, 나중에 그려집니다)
이제 요시카의 zorder는 0, 구름은 1로 하여 요시카는 생성 순서에 관계없이 항상 구름 뒤에 나타나도록 할 것입니다.


다음 BasicScene의 render에서 node를 그려주는 부분을 다음과 같이 수정합니다.



순서를 정하는 방법은 간단합니다.
자신보다 zorder가 작은 오브젝트가 몇 개나 있는지 세어서 _zorder에 격납합니다. 이 _zorder 숫자가 자신이 출력될 실제 순번입니다.
그러니까 숫자가 클 수록 나중에 출력되게 됩니다.



실제 출력 루프는 이렇게 되는데, _zorder 값이 i 값과 같을 때 출력됩니다.
이 방법대로 하면 i값과 같은 _zorder가 없어 j 루프는 헛도는 경우도 있는데, 어쩔 수 없는게 zorder가 같은 값을 갖는 오브젝트가 여럿 있을 수 있기 때문입니다.



이제 실행하고 화면을 클릭하면 구름은 먼저 생성되었어도 요시카보다는 항상 앞에 그려집니다.

이전에 프레임 애니메이션 샘플로 소개했던 Ranger Quest 같이 횡화면 2D 액션게임이라면, y좌표를 zorder로 사용하면 자연스럽게 캐릭터의 위치가 앞뒤로 바뀌도록 할 수 있습니다.


※여기서 사용하는 z-order는, 실제 3D 좌표계의 그것과는 전혀 다른, 화면 표시의 우선순위를 부여하기 위한 임의의 개념입니다.


핑백

덧글

댓글 입력 영역


Books

Geek라이프

메가 드라이브 퍼펙트 카탈로그
마에다 히로유키 저/조기현 역

미소녀 일러스트 테크닉
B-은하, pen스케, 카와이 저/정유진 역

핵심강좌! Cocos2d-x
이재환 저

피규어의 교과서 레진 키트 & 도색 입문 편
후지타 시게토시 저/김정규 역
예스24 | 애드온2
일본서적 전문사이트 NEPIC