본문 바로가기

NDS

스트라이프 선택시 자연스러운 순위(priority) 변경

2008/07/23 - [NDS] - Sprite 처리에 관해 잠깐 든 생각...

위 글의 2번을 해결 한것이다.
뭐가 문제 였을까.

스프라이트를 클릭하면 PA_SpriteTouched(sprite) 함수로 처리하는데 스프라이트가 겹쳐져 있다면 모든 스프라이트에서 값을 반환 한다.카운트를 해보면
사용자 삽입 이미지
스타일러스 가 지정한 픽셀 아래에 있는 스프라이트마다 다 값을 반환하고있다. 그걸 모르고 하나가 걸리면 그게 다인줄알고 그것만 처리했으니 생성시 들어간 priority 순서따라서 선택될수 밖에.

2008/07/24 - [NDS] - SpriteExtPrio 함수 추가
설명전에 위 글에서 함수를 하나 추가하자.

대략 내용만 간추려서 설명한다면...
--- header ---

int main()
{ 
	PA_Init();    // Initializes PA_Lib
	PA_InitVBL(); // Initializes a standard VBL
	PA_InitRand();
	PA_InitSound();  // Init the sound system
	PA_InitSpriteExtPrio(1);

--- 중략 ---

	while (1)
	{
		if (Stylus.Newpress) {
			
			// 변수를 제일 큰수로 초기화 한다. 실제 스프라이트는 아니다.
			touch_sprite=99;
			touch_prio=99;
			
			for(i=0;i<15;i++) { //스프라이트 수만큼 다 돌린다.
				
				// i 스프라이트위를 터치했고 순위는 비교대상보다 상위면
if (PA_SpriteTouched(i) && touch_prio>PA_GetSpriteExtPrio(0, i))
				{
					// 비교대상에 담아둔다.
					touch_sprite=i;
					touch_prio=PA_GetSpriteExtPrio(0, i);
				}
			}
			// 상위 순위(숫자는 0에 가깝다)인 스프라이트를 담고있다
			
			if (touch_sprite!=99) {
				
				// 스프라이트 순위를 밀어낸다.
				for(j=0;j<15;j++) {
					tempPrio = PA_GetSpriteExtPrio(0, j);
					// 상위 스프라이트 순위 3번을 터치
					// 비교에 따라 순위가 3보다 작다면(0, 1, 2)
					// 하나씩 +1 시켜 밀어낸다.
					// 결국 (1, 2, 3)이 된다.
					if(touch_prio>tempPrio) PA_SetSpriteExtPrio(0, j, tempPrio + 1);
				}
				// 3번 스프라이트를 0번으로 올린다.
				PA_SetSpriteExtPrio(0, touch_sprite, 0);
			}
		}
		
		if(PA_SpriteTouched(touch_sprite)) // Held 상태
		{
			PA_SetSpriteXY(0,touch_sprite,Stylus.X-32,Stylus.Y-32);
		}
		PA_WaitForVBL();
	}
	return 0;
}

이런 함수는 아마 어디서 검색해보면 더 나은 코딩이 있을지도 모른다.
그래도 굳이 해보는건 찾아야하는 귀차니즘과 코딩 공부때문이라 하고싶다.

스프라이트와 스트라이프가 왜 헷갈리는건지...;;

'NDS' 카테고리의 다른 글

Palib 한글구현 처리 진행상황...  (0) 2008.07.26
EunHye DS v1.0 수정본  (0) 2008.07.24
SpriteExtPrio 함수 추가  (0) 2008.07.24
이미지 Fade In/Out  (0) 2008.07.24
Sprite 처리에 관해 잠깐 든 생각...  (0) 2008.07.23