그림은 2종류가 있습니다.
배경그림과 같은 것과 스프라이트 그림(케릭터 그림)이 있습니다

보통 배경그림을 뒤에 분위기를 깔아주고
스프라이트 그림들의 움직임 조작으로 게임은 돌아가죠
(슈퍼마리오 경우.. 파이프 배경이 배경그림이고, 마리오 케릭 자체를 스프라이트 그림입니다)

배경 그림은 총 4개를 메모리에 올릴 수 있습니다.
NDS의 그림의 구조가 BMP와 다릅니다
자세한건 http://rosagigantea.tistory.com/77 여기를 봐주시기 바랍니다.

뭐 요약하면
NDS에선 그림의 크기를 줄이기 위해 꽁트를 쓰고
단순한 그림일 수록 이 꽁트가 잘 먹히며,
256색을 사용하는게 좋다는 것 입니다.

그림 크기에 따라선
256x192    :   x축 배경 스크롤만 할 경우....
256x256    :   x,y축 배경 스크롤을 할 경우...
512x512    :   x,y축 좀더 버라이어티한 스크롤 하고 싶은 경우.
로 하는것이 좋습니다.

우선 예제 그림으로
사용자 삽입 이미지
 <bg1>
사용자 삽입 이미지
<bg_charactor>

사용자 삽입 이미지
<bg2>



등을 사용해 봅시다.


위 링크를 다운로드해서 사용하시기 바랍니다.

음.. 대충 읽지 않으셨다면, 뭔짓으로 변환을 한뒤에 그걸 사용함을 느끼셨을 껍니다.
그러므로... 툴을 사용합니다. (시간이 되시면 만드셔도 됩니다 http://rosagigantea.tistory.com/79 식으로요)

PAlib 안에는 변환툴이 있으니 이것을 사용합니다.
C:\devkitPro\PAlib\Tools\PAGfx 경로로 들어가시면 PAGC Frontend 프로그램이 있습니다. 이걸 실행 시킵니다  (참고로 .net framework 2.0 이 설치가 안되어 있으면 실행이 안됩니다.  c#으로 짜여진건지;;;)

1. 아래 경로의 프로그램을 실행합니다.
사용자 삽입 이미지

2. 화살표 순서대로.. 변환할 Background 에서, Add file로 그림을 넣은뒤, Save and Convert 로 컨버팅 합니다.
사용자 삽입 이미지
옆에 RGB(255,0,255) 색을 투명색으로 지정되었음을 알 수 있습니다. 다른 색으로도 변경가능합니다.

3. 성공하면 아래와 같이 C언어로 변환된 파일이 보입니다. 만약 안된다면 .net framework 2.0을 다시 설치 하셔야 합니다.
사용자 삽입 이미지

4. 변환된 파일을, 작업디렉토리의 gfx 방을 만들어서 그 안에 넣어 줍니다.
사용자 삽입 이미지

이렇게 하고..
소스는 아래와 같이 추가 합니다
//////////////////////////////////////////////////////
// Includes
#include <PA9.h>       // Include for PA_Lib
#include "gfx/all_gfx.c"
#include "gfx/all_gfx.h"

#define UP_SCREEN 1
#define DOWN_SCREEN 0

#define BG0   0
#define BG1   1
#define BG2   2
#define BG3   3

// Video ram 의 모든 그림을 제거 하는 함수
void UnLoad_Screen()
{
 int i;
 
 for(i=0; i<2; ++i)
 {
  PA_ResetBgSysScreen(i);
  PA_ResetSpriteSysScreen(i);
 }
}

int main()
{
 PA_Init();    // Initializes PA_Lib
 PA_InitVBL(); // Initializes a standard VBL

 PA_InitText(UP_SCREEN, BG2);
 PA_OutputSimpleText(UP_SCREEN, 1, 2, "Hello World!");

 PA_EasyBgLoad(UP_SCREEN, BG3, bg2);
 PA_EasyBgLoad(DOWN_SCREEN, BG2, bg_charactor);
 PA_EasyBgLoad(DOWN_SCREEN, BG3, bg1);

 s16 x =0, y = 0;
 // Infinite loop to keep the program running
 while (1)
 {
  PA_EasyBgScrollXY(UP_SCREEN, BG3, --x, ++y);
  PA_EasyBgScrollX(DOWN_SCREEN, BG3, x);
  PA_WaitForVBL();
 }
 
 UnLoad_Screen();  // 리소스 정리
 return 0;
}
//////////////////////////////////////////////////////
이걸 컴파일 하면 아래와 같습니다.

사용자 삽입 이미지
윗 스크린은 x,y 스크롤 되어가고
아래 스크린은 x축 방향만 스크롤 됩니다.
그리고 케릭터 스크린도 옆에 표시 됩니다.
투명색을 255,0,255 색으로 해서 투명색이 아닌 부분만 나온걸 확인 할 수 있습니다.

소스를 분석해 봅니다.
#include "gfx/all_gfx.c"
#include "gfx/all_gfx.h"

을 선언해야, 변환된 그림을 제대로 사용할 수 있습니다.
// Video ram 의 모든 그림을 제거 하는 함수
void UnLoad_Screen()
{
 int i;
 
 for(i=0; i<2; ++i)
 {
  PA_ResetBgSysScreen(i);
  PA_ResetSpriteSysScreen(i);
 }
}

의 경우 일단 리소스 정리 차원에서 만들었습니다.
나중에 게임 장면 변환 할때,(배경, 스프라이트 완전히 다른걸로 뿌릴때)
이런 함수를 사용해야 메모리 충돌이 일어나지 않습니다.

 PA_EasyBgLoad(UP_SCREEN, BG3, bg2);
 PA_EasyBgLoad(DOWN_SCREEN, BG2, bg_charactor);
 PA_EasyBgLoad(DOWN_SCREEN, BG3, bg1);

각각 배경그림을 띄우는 함수 입니다.
다른 함수도 있지만.. 일단 간단하게 저 함수를 주로 사용해도 상관없을꺼 같습니다.
각각... 윗 스크린에 BG3부분에 bg2 그림을 띄우고
         아랫스크린에 BG2 부분에 bg케릭터 그림을 띄우고
         아랫스크린에 BG3 부분에 bg1 그림을 띄우는 것 입니다..
그림의 출력은
       
---------------------- LCD 표면 ----------------------------
스프라이트 0 ~ 127  (숫자가 작을수록 위)
----
BG0
----
BG1
----
BG2
----
BG3         (가장 아래)

식으로 보이게 됩니다.
즉, 케릭터 그림을 BG2로 하고 배경그림을 BG3으로 하는 이유도 다 저런 이유 때문이죠. 반대로 바꿔서 컴파일 해보시면 더 이해가 빠를실겁니다..

s16 x =0, y = 0;
 // Infinite loop to keep the program running
 while (1)
 {
  PA_EasyBgScrollXY(UP_SCREEN, BG3, --x, ++y);
  PA_EasyBgScrollX(DOWN_SCREEN, BG3, x);
  PA_WaitForVBL();
 }

배경 스크롤 하는 함수 입니다.    PA_EasyBgScrollX , Y, XY.. 식의 함수가 있으며, 위의 방법처럼 사용합니다.

이정도면 대부분 배경은 다룰수 있으실꺼 같습니다. 더욱 다양한 배경 효과를 원하시면
C:\devkitPro\PAlibExamples\Backgrounds 에 다양한 효과의 소스가 있습니다
각각 해보시면서 원하는 효과를 적용하시는것이 낳으실 껍니다.

다음은 스프라이트에 대해 얘기해 보겠습니다.

신고
블로그 이미지

프로그래머 지향자 RosaGigantea

바쁜 일상 생활중의 기억 장소

티스토리 툴바