본문 바로가기

NDS

Palib 한글 구현 - Alpha blending

원본 출처 : http://www.scgyong.net/wiki/index.php/GFN_Maker New window

GfnPalibTest Snapshot

randon color! 저런 오타가...


invalid-file

폰트 변경 프로그램 포함


GyonG님 꼐서 만드신 Nds_lib용 GFN 형식 및 Alpha blending 처리 Palib용으로 수정했습니다. 기본적인 저작권은 GyonG님께 있습니다. 감사!

사실 Palib도 Ndslib기반이기 때문에 거의 그대로 적용해도 가능하긴합니다만 메모리처리나 버퍼 관련때문에 약간 수정이 필요합니다.
공부해가면서 하는거라 남들보다 더 오래걸리는것같네요. 엉뚱한거 바꿔놨을지도 모르겠네요..;

아... 하다보니 느낀건데 제가 메모리 처리 쪽에 대해 거의 아는게없어서 조금만 BG큰게 들어가도 메모리부족 에러가 뜨곤합니다. 제 메모리 관리 능력이 허술한건지 좀더 연구가 필요할듯하네요.


Graphics.cpp 내의 수정이 제일 많고 그외 파일은 거의수정이 없습니다.
buffer관련 부분은 다 주석처리하거나 Palib함수들로 바꿔놓았고 우선 동작에 필요없는부분도 주석처리 했습니다.

수정/추가된 부분...

원본 버전에서는 BG를 따로 처리하지않고 16bit BG한곳에서 처리하게 되있습니다.
BG를 따로 사용하지않기때문에 그런것인데 BG가 있는 경우에도 적용할 수 있도록 처리부분을 추가했습니다.

위 추가사항으로 수정된 부분은 clearScreen함수가 이전은 색을 지정하여 다 채움으로 지우는 방식에서 bg 자체를 지워버리는(PA_Clear16bitBg)방법으로 바꾸었습니다.

sprite 부분도 같이 처리하려고 했는데 픽셀을 읽어오는부분에서 문제가 있어서 현재는 보류로 주석처리 해놓았습니다.

------------- 추가 ---------------------

위 부분 때문에 현재는 15x12크기의 한글자라면 15x12 모든부분을 16bit BG에 그리게 됩니다.(이때문에 16bit BG를 제일위로 올리는 부분이 있습니다)
만약 배경이 바뀌거나 / 16bit BG아래있는 sprite(sprite도 밑으로 내렸을시에/현재는 sprite는 최상위입니다.)가 있다면 정상적으로 보이지않습니다.
이때는 다시 Load해야 바뀐 BG에서 alpha blending처리를 할수있습니다.(sprite는 현재 안됩니다.)

하지만 보통은 글이 위에있는 상태에선 BG를 바꾸는 일이 자주없을거라 수정 필요는 못느끼고있습니다.
대안으로 밑에 고정으로 BG를 두거나 포함되어있는 Graphics::fillRectangle 함수를 이용해서 미리 배경을 깔아두는 방법도 있습니다.

예제의 우선순위는
sprite > 16bit bg > Test용 sprite(sprite.png) > bg 1(없음) > bg 2


소스는 체크 부분만 확인하겠습니다.

..................
// check color(ix, iy) - white-65535 / black-32768 / transparent - 0 / MAGENTA -- 64543
				
// check bg
tempTop[3] = PA_EasyBgGetPixelCol(target_Screen, 2, x + ix, y + iy);
//tempTop[2] = PA_EasyBgGetPixelCol(target_Screen, 1, x + ix, y + iy);
			
/* check sprite
// If in sprite zone, check pixel color for both sprites
for(s16 cs=100;cs<104;cs++) {
	if((x + ix > PA_GetSpriteX(target_Screen,cs)) && \
		(y + iy > PA_GetSpriteY(target_Screen,cs)) && \
		(x + ix < PA_GetSpriteX(target_Screen,cs) + PA_GetSpriteLx(target_Screen,cs)) && \
		(y + iy < PA_GetSpriteY(target_Screen,cs) + PA_GetSpriteLy(target_Screen,cs)))
	{
		tempTop[1] = PA_GetSpritePixel(target_Screen, cs, x + ix, y + iy)<<8;
	}
} */

// check 16bitbg
tempTop[0] = PA_Get16bitPixel(target_Screen, x + ix, y + iy);
				
// 최상위 순서 찾아내 그 픽셀을 배경으로 저장
for(si=0;si<4;si++) {
	if(!(tempTop[si]==0 || tempTop[si]==64543)) {
		top=tempTop[si];
		break;
	}
	else top = 0;
}
................