#.DS Sprite 스펙
각각의 스크린에 128개의 다른 sprite 를 표시할수 있다. 그래서 총 256개가 가능하다. 각각의 sprite는 수평, 수직으로 뒤집을수 있고, 갱신된 이미지를 사용하여 애니메이션도 가능하고, 부분적인 투명도도 줄수 있고 심지어 모자이크도 가능하다. 그 중에서 최고는 회전과 줌이 가능하다는 것이다.
하지만 여기서 한가지 제한이 있다. 각각의 sprite에 대한 회전/줌 파라미터를 설정할수는 없고 단지 rotset이라 불리는 것으로 스크린당 32개를 다르게 설정할 수 있다. 그 후 각각의 sprite를 rotset에 할당한다. 그래서 모든 sprite를 회전과 줌을 할수 있지만 한번에 32가지의 방법만 사용할 수 있다. 몇몇의 sprite는 같은 rotset를 공유할 수 있다.

-.DS 스크린 크기
다음은 Bennyboo 가 만든 화면이다. sprite 뿐만아니라 배경에서도 유용할 것이다.

넓이가 256 픽셀이고 높이가 192 픽셀이다. 추가로 sprite 위치의 제한을 가진다. X 는 0-511 사이이고 Y는 0-255 이다. 이것은 X = 512 이면 X=0 과 같다는 것이다.

-. 색 모드
sprite은 3가지 다른 색모드가 될 수 있다.
1. 스크린당 다른 16개의 팔레트를 가지는 16 색 팔레트로 gba에 많이 사용되었지만 DS에서는 사라지고 있다.
2. 스크린당 다른 16개의 팔레트를 가지는 256 색 팔레트(더 나은 방법이지만 메모리를 두배 사용한다.)로 대부분 이것을 사용할 것이다.
3. 팔레트가 없는 16bit sprite 로 많이 사용되지는 않는다.

-. Sprite 크기
다양한 sprite 크기를 다룰수 있지만 정해진 크기만 허용된다. 단지 8,16,32,64 픽셀의 넓이와 높이를 가진 것만 가능하다.
  8 16 32 64
8 8×8 16×8 32×8  
16 8×16 16×16 32×16  
32 8×32 16×32 32×32 64×32
64     32×64 64×64
만약 허가된 사이즈와 다른 sprite 를 사용하면 어떻게 될까? 볼품없고 알아 볼수 없는 sprite를 얻을 것이다. 만약 48x48 픽셀 sprite를 만들었다면 어떻게 될까 그러면 가장 적당한 64x64 박스에 맞출수 있다. 같은 방법으로 10x64는 32x64가 가장 좋은 크기이다.

-. 투명색
원반같은 둥근 sprite를 사용한다면 테두리가 배경색에 안보이길 원할 것이다. 배경이 제거 되기위해서 투명색을 설정할 수 있는데 sprite당 한가지 색이 가능하다. 일반 black 또는 magenta ( red:255, green:0,  blue:255 )를 많이 사용한다.

#PAGfx 로 변환
sprite 를 바로 사용할 수 없다. DS 포맷에 맞게 변환해줘야 한다. Mollusk 와 Kleevah가 만든 PAGfx 툴이 있는데.. 이건 devkitPro Installer 로 설치했다면 벌써 C:\devkitPro\PAlib\Tools\PAGfx 폴더에 설치되어 있다. 사용법으 두가지가 있는데.. 초보자를 위한 시각적 인터페이스로 구성된 것과 능숙자를 위한 단지 PAGfx.ini 와 작동하는 것이 있다.

-. PAGfx Visual Interface
PAlib/Tools/PAGfx 폴더에서 PAGC Frontend.exe 파일을 연다. 만일 에러가 발생하면 dotnet Frame v2.0 설치해야 한다. Visual Studio 2005 를 세팅했으면 설치할 필요가 없다.
download and install it


Sprite 추가
PAGC Frontend 파일과 같은 디렉토리에 있는 이미지 파일을 추가한다. 색모드는 중요한데 16 color, 256 color, 16bit 에서 선택한다. 팔레트 이름도 중요한데 전에 알아 본 것처럼 sprite 에대해 스크린당 16개의 팔레트를 가질수 있다. 팔레트 실제이름은 PaletteName_Pal 이 될 것이다. sprite 의 넓이/높이는 8의 배수여야 한다.

변환
Save and Convert 버튼을 클릭하면 PAGfx.ini 파일이 갱신되면서 PAGfx.exe 파일이 호출되어 변환 작업이 진행됩니다.
컨버터가 생성한 파일들을 보면 SpriteName.c 파일은 모든 sprite 데이타를 담고 있으며 sprite를 로드할때 사용될 것이다. PaletteName.pal.c 파일은 팔레트를 담는다. all_gfx.c 파일은 모든 sprite, 배경, palette 파일을 링크한다. 이유는 각각 image.c 파일들을 추가하는 대신에  이것 하나만 추가해 주면 된다. all_gfx.h 는 .c 파일과 매우 비슷하다. sprite 의 데이타 이름들 담고 있다.

PAGfx.ini
Frontend 을 사용하면 이 파일을 생성해주므로 알 필요는 없다.
#TranspColor Magenta
 
#Sprites :
C:\test.png 256colors test
 
#Backgrounds :
 
#Textures :

#TranspColor Magenta 는 sprite와 배경에 사용할 투명색이다.
#Sprites 는 변환하려는 모든 sprite 목록이다. 256colors 는 색모드이고 test 는 팔레트 이름이다.

-. PAlib Sprite
그리기
C:\devkitPro\PAlibExamples/Sprites/Basics/CreateSprite/source/main.c 코드를 보자.

// PAGfxConverter Include
#include "gfx/all_gfx.c"
#include "gfx/all_gfx.h"
변환한 모든 그림들을 source/gfx 에 넣는다.
PA_LoadSpritePal(0, // Bottom Screen
  0, // Palette number
  (void*)sprite0_Pal); // Palette name
팔레트를 로딩하는 부분이다. sprite 가 보이지 않는 제일 큰 원인은 팔레트를 로딩하는 걸 잊는 것이다. 올바른 숫자로 로딩한다. sprite에 대해 16개의 다른 팔레트를 가지기 때문이다.
PA_CreateSprite(0, //Bottom Screen, 1 : Top Screen
  0, // Sprite number (0-127)
  (void*)vaisseau_Sprite, // Sprite name
  OBJ_SIZE_32X32, // Sprite size
  1, // 256 color mode
  0, // Sprite palette number
  50, 50); // X and Y position on the screen
위에 스크린에 Sprite를 로딩한다면 보이지 않을 것이다. 팔레트는 아래 스크린에 로딩되었기 때문이다. Sprite 숫자가 낮을 수록 우선 순위가 높다. obj size는 2개의 변수로 구성되어 있다. 사용하기 쉽지 않은데 그래서 OBJ_SIZE 라는 매크로를 이용한다. 색 모드는 단 2가지 인데. 0 은 16색, 1은 256 색이다. 주로 256색을 사용한다. 다음은 팔레트 숫자이다. 만일 잘못된 숫자를 넣으면 이상한 색의 Sprite를 보게 될 것이다. 주의를 기울여서 사용해야 한다. 다음에 sprite의 픽셀에서의 X, Y 좌표이다. 이 좌표는 sprite의 중앙이 아니라 좌상귀 쪽이다.

이동
PA_MoveSprite
C:\devkitPro\PAlibExamples\Sprites\Movement\MoveSprites 에서 코드를 보자.
for (i = 0; i < 16; i++) PA_CreateSprite(0, i,(void*)vaisseau_Bitmap, OBJ_SIZE_32X32,1, 0, i << 4, i << 3);
// This loads sprites a bit everywhere
CreateSprite 함수전에 for문이 있다 이유는 16개의 sprite를 생성하기 위해서다. i<<4, i<<3 은 i*16, i*8 과 같다.
while(1)
{

// Use the MoveSprite function on all sprites...
for (i = 0; i < 16; i++) PA_MoveSprite(i);
// The MoveSprite function checks if you are touching a sprite, and moves it around if*   
        // *you are... Pretty nice if you have multiple sprites around
 
PA_WaitForVBL();
}
PA_MoveSprite 함수는 주어진 sprite 숫자를 확인하고 스타일러스에 의해 움직인다. 스타일러스로 위치를  옮길수 있다.

PA_SetSpriteXY
sprite과 관련해서 가장 중요한 함수이다.
PA_SetSpriteXY(screen, sprite, x, y);
x, y 는 sprite을 이동하려는 새로운 위치이다. sprite의 중앙이 아니고 좌상귀 값과 일치한다. 그래서 sprite이 32x32 라면 x,y 위치를 중앙으로 바뀌기 위해 x-16, y-16으로 조정해야 한다.

X, Y 제한
PA_GetSpriteX(screen, sprite), PA_GetSpriteY(screen, sprite) 함수는 sprite 의 좌표를 반환한다. 먼저 주의할 것은 항상 X는 0~511, Y는 0~255 사이의 값이다는 것이다. 이것은 하드웨어의 제약때문이다. 만약 이 값을 넘거나 적다면 sprite는 반복될 것이다. sprite의 x=512 위치는 x=0 위치와 같다.

중요점
먼저 DS 에서 sprite를 움직이는 방법을 알아보자. C:\devkitPro\PAlibExamples\Sprites\ Movement\MoveSpritewithKeys 의 코드를 살펴보자.
s32 x = 0;    s32 y = 0; // sprite position...
2개의 변수는 sprite의 위치를 저장할 것이다.
x += Pad.Held.Right - Pad.Held.Left;
y += Pad.Held.Down - Pad.Held.Up;
sprite를 움직이기 위해서 그리 중요하지 않다. 아주 쉬운 방법은 다음과 같다.
if (Pad.Held.Right) x = x + 1;
if문을 사용하지 않으면 느리게 X 방향으로 계속 움직일 것이다.
PA_SetSpriteXY(0, // screen
  0, // sprite
  x, // x position
  y); // y...
x, y 위치는 패드에 따라 갱신된다.
움직이는 속도를 어떻게 변경할수 있을까요?
x += (Pad.Held.Right - Pad.Held.Left) * speed;
y += (Pad.Held.Down - Pad.Held.Up) * speed;
위와같이 변경해서 speed 변수를 변경하면 됩니다.

스타일러스
C:\devkitPro\PAlibExamples\Sprites\Movement\MoveSpritewithStylus 의 코드를 확인해 보자. 이건 앞에서 본 것보다 더 간단하다.
PA_SetSpriteXY(0,0,Stylus.X,Stylus.Y);

-. 스타일러스 터치
PAlib는 sprite에 스타일러스를 사용할때 알아야 할 2가지 함수를 제공한다.
u8 i = 0;
for (i = 0; i < 8; i++) PA_CreateSprite(0, i,(void*)mollusk_Sprite, OBJ_SIZE_32X32,1, 0, i << 5, i << 4);
 
PA_OutputSimpleText(1, 0, 10, "Please touch a sprite");
 
while(1)
{
// Now we'll test every sprite to see if we touch it...
for (i = 0; i < 8; i++) {
if (PA_SpriteTouched(i)) PA_OutputText(1, 0, 15, "Sprite %d  ", i);
// If we touch the sprite, returns 1...
}
 
PA_WaitForVBL();
}

PA_SpriteTouched(sprite) 함수는 sprite가 스타일러스에 터치되지 않으면 0을 반환한다. 터치되면 1 이다.

-. 회전과 줌
또 하나의 중요한 부분이다. sprite는 회전과 줌을 할수 있는데 약간의 제한이 있다. 모든 sprite가 회전할수 있지만, 회전하는 sprite는 rotset 이란 속성이 필요하다. 그리고 한 스크린당 32개의 rotset만 가능하다. 여러개의 sprite가 같은 rotset을 가질수 있다. 이 경우에 이러한 sprite는 정확히 같은 방법으로 회전과 확대가 될것이다.
PAlib 에는 회전과 줌에대한 3가지의 다른 예제가 있다.

회전
// Activate rotations for that sprite
PA_SetSpriteRotEnable(0,// screen
      0,// sprite number
      0);// rotset number. You have 32 rotsets (0-31) per screen. 2 sprites with*
                         // *the same rotset will be zoomed/rotated the same way...
 
u16 angle = 0; // Rotation angle...
 
while(1)
{
++angle; // change the angle
angle &= 511; // limit the range to 0-511. works only with 1, 3, 7, 15, 31, etc... (2^n  - 1)

// Fast function for rotations without zoom...
PA_SetRotsetNoZoom(0, //screen
   0, // rotset
   angle); // angle, from 0 to 511

PA_WaitForVBL(); // Synch
}
PA_SetSpriteRotEnable(screen, sprite, rotset) 함수를 설정하는 것으로 sprite는 회전할 준비가 되었다. 회전을 멈추고 싶을때 PA_SetSpriteRotDisable(screen, sprite) 를 사용하면 된다.

각도에서 중요한 것은 360 도가 아니라 0~511 범위라는 것이다. 이것은 반시계 방향이다. 이유는 DS에 최적이기 때문이다.보통 각도보다 더 빠는 방법이다. & 연산자는 math 강좌 부분에서 알아 볼것인데 2^n -1 을 뜻한다. (1,3,7,15,31,63,127,255,511,등등)  511이 넘으면 어떻게 될까? 0 으로 돌아 간다. 512는 0 이되고, 513 은 -1 이 된다. 음수 값으로 -1 은 511이 된다.
다음으로 중요한 함수는 PA_SetRotsetNoZoom(screen, rotset, angle) 이다. 여기서 잊지말아야 할것이 rotset(0-31)로 조정된다. sprite가 아니다. 마지막으로 sprite은 중앙 점을 기준으로 회전한다.


C:\devkitPro\PAlibExamples\Sprites\RotationZoom\Sprite_Zoom 예제를 보자
u16 zoom = 256; // Zoom. 256 means no zoom, 512 is twice as small, 128 is twice as big....

while(1)
{
zoom -= Pad.Held.Up - Pad.Held.Down; // Change the zoom according to the keys...
 
// Fast function for zoom without rotations...
PA_SetRotsetNoAngle(0, //screen
    0, // rotset
    zoom, zoom); // Horizontal and vertical zoom. You can have a sprite*
                            // *streched out if you want, with the zoom only for x or y axis....

256 은 기본 배율이고 값이 작을수록 sprite는 커지고, 값이 커질수록 sprite는 작아진다.
중요한 줌함수를 보자. PA_SetRotsetNoAngle(screen, rotset, zoomx, zoomy); 왜 2개의 zoom 변수를 가지냐면 sprite를 독립적으로 X, Y 축으로 확대할 수 있다. 줌도 회전처럼 중앙점에서 확대된다.

sprite 프레임이 32x32인데 너무 확대하면 짤린다. 이것은 제한이지만 PA_SetSpriteDblsize(screen, sprite, enable/disable) 를 사용하면 sprite 를 실제로 200% 줌하는 것은 아니지만 프레임 사이즈가 두배가 된다. 32x32는 64x64 가 된다.(중앙에 32x32 이미지를 가지고) 64x64는 128x128이 된다.

마지막으로 고려해야 할 사항은 캔바스 크기를 두배로 하면 sprite의 위치가 좌상귀에서 sprite의 중앙으로 바뀐다. 그래서 정확히 같은 좌표에서 2개의 sprite가 놓이더라도 두배크기와 정상크기가 같은 방법으로 다른 곳에 놓일 것이다. 결코 잊지 말기 바란다.

동시에 회전과 줌
C:\devkitPro\PAlibExamples\Sprites\RotationZoom\Sprite_RotZoom 예제를 보면 된다. 다른 것과 비슷하다. 단지 각도와 줌 변수를 동시에 받는다.
PA_SetRotset(screen, rotset, angle, zoomx, zoomy);

-. Sprite 뒤집기
DS 상에서는 간단하다.

PA_SetSpriteHflip(screen, sprite, 1/0 for yes/no), for horizontal flips (left/right)PA_SetSpriteVflip(screen, sprite, 1/0 for yes/no), for verticalflips (up/down)
1 은 뒤집기 설정이고 0 은 해제이다. 수평, 수직 동시에 할수도 있다. 이 기능은 이미지 작업을 간소화 시키고 공간을 절약할수 있다.

-. 모자이크 효과
이 기능은 잘 사용되지는 않는다. 예를들어 1x1 블럭이 15x15 픽셀 블럭으로 바뀐 것처럼 sprite를 보이게 한다. 흐림 효과 같은 sprite가 변화되는 효과로 사용될수 있다.
PA_SetSpriteMosaic(Screen, Sprite, Mosaic on/off (1/0));
다음 함수를 사용하여 쉽게 수평, 수직으로 모자이크 값을 바꿀수 있다.
PA_SetSpriteMosaicXY(screen, horizontal block size, vertical size...);
모자이크 블럭 레벨은 다른 모든 활성화된 sprite와 같다.

-. 투명도
PAlib는 DS 하드웨어를 이용한다. 그래서 한가지 중요한 제약이 있다. 모든 sprite를 알파블렌딩 할 수 있어도, 모든 알파 블렌딩된 sprite는 같은 투명도 레벨을 가진다. 그래서 반투명 sprite나 거의 투명하게 만들수가 없다.
PA_SetSpriteMode(0, // Screen
  0, // Sprite
  1); // Alphablending 

s16 alpha = 7; // Transparency level
 
// Enable the alpha-blending
PA_EnableSpecialFx(0, // Screen
   SFX_ALPHA, // Alpha blending mode
   0, // Nothing
   SFX_BG0 | SFX_BG1 | SFX_BG2 | SFX_BG3 | SFX_BD); // Everything normal
 
while(1) // Infinite loops
{
alpha += Pad.Newpress.Up - Pad.Newpress.Down;
PA_SetSFXAlpha(0, // Screen
  alpha, // Alpha level, 0-15
  15); // Leave this to 15
 
PA_WaitForVBL();
 
}
sprite는 일반 sprite로 만들고 PA_SetSpriteMode(screen, sprite, mode); 로 알파블렌딩 옵션을 활성화 시킨다. 다른 모드는 문서에서 확인할 수 있다. 하지만 지금은 0 은 보통이고 1 은 알파블렌딩이라는 것을 기억하라.
활성화 시켰다고 sprite가 알파 블렌딩이 되지 않는다. 먼저 DS 특수 효과 시스템을 알파블렌딩모드로 활성화 해야 한다. PA_EnableSpecialFx(Screen, SFX_ALPHA (Alpha blending mode), 0 (leave to 0 for now), SFX_BG0 | SFX_BG1 | SFX_BG2 | SFX_BG3 | SFX_BD);

PA_SetSFXAlpha(screen, alpha level (0-15), normal level(leave to 15)); 투명도 레벨을 설정한다.

-. 프레임
복잡한 방법으로 sprite를 움직이게 할수 있다. 프레임은 더 쉽게 사용할수 있고 유연하다.
먼저 변환할때 단일 이미지에 모든 sprite 프레임을 넣어야한다. 이런 프레임은 다른 것들 중에서 상위에 있어야 한다.
PA_CreateSprite(0, 0,(void*)frames_Sprite, OBJ_SIZE_16X32,1, 0, 128-16, 64);
 
while(1)
{
if (Pad.Held.Up) PA_SetSpriteAnim(0, 0, 0); // screen, sprite, frame
if (Pad.Held.Down) PA_SetSpriteAnim(0, 0, 2); // screen, sprite, frame
if (Pad.Held.Left) PA_SetSpriteAnim(0, 0, 3); // screen, sprite, frame
if (Pad.Held.Right) PA_SetSpriteAnim(0, 0, 1); // screen, sprite, frame
 
PA_WaitForVBL();
}
이 sprite는 일반 정상 sprite 처럼 생성된다. PA_SetSpriteAnim(screen, sprite, frame number); 프레임을 바꾸기위한 코드이다.

-.애니메이션
간단한 애니메이션
C:\devkitPro\PAlibExamples\Sprites\Animations\SpriteAnim2 예제를 보자
// Load the sprite palette,
PA_LoadSpritePal(0, // Screen
0, // Palette number
(void*)explosion_Pal); // Palette name

// Here, we'll load a few similar sprites sprite to animate... at different speed
PA_CreateSprite(0, 0,(void*)explosion_Sprite, OBJ_SIZE_64X64,1, 0, 0, 64);
PA_CreateSprite(0, 1,(void*)explosion_Sprite, OBJ_SIZE_64X64,1, 0, 64, 64);
PA_CreateSprite(0, 2,(void*)explosion_Sprite, OBJ_SIZE_64X64,1, 0, 128, 64);
PA_CreateSprite(0, 3,(void*)explosion_Sprite, OBJ_SIZE_64X64,1, 0, 196, 64);

// Start the animation. Once started, it works on its own !
PA_StartSpriteAnim(0, // screen
0, // sprite number
0, // first frame is 0
6, // last frame is 6, since we have 7 frames...
5); // Speed, set to 5 frames per second
PA_StartSpriteAnim(0, 1, 0, 6, 15); // for the second one, speed of 15 fps...
PA_StartSpriteAnim(0, 2, 0, 6, 30); // for the third one, speed of 30 fps...
PA_StartSpriteAnim(0, 3, 0, 6, 60); // for the last one, speed of 60 fps...
PA_StartSpriteAnim(screen, sprite, first frame, last frame (included !), speed (in fps)) 이  함수는 한번 로딩해서 주어진 속도로 호출되면 sprite는 계속해서 움직인다. PA_StopSpriteAnim(screen, sprite) 를 사용해서 멈출수 있다. PA_PauseSpriteAnim(screen, sprite, pause (1 to pause, 0 to unpause)) 는 일시정지 또는 진행할 수 있다.

복잡한 애니메이션
C:\devkitPro\PAlibExamples\Sprites\Animations\SpriteAnim 예제를 보자. 이 sprite는 위, 아래 오른쪽으로 움직이는 애니메이션이 있다. 왼쪽은 없다 왜냐면 오른쪽의 뒤집기가 되기 때문이다.
25% 의 공간을 절약할 수 있다. DS 롬의 중요 부분이 그래픽이라는 것을 고려할때 크다.
while(1)
{
// Animation code...
if(Pad.Newpress.Up) PA_StartSpriteAnim(0, 0, 0, 3, 6);
if(Pad.Newpress.Down) PA_StartSpriteAnim(0, 0, 8, 11, 6);

if(Pad.Newpress.Right) { PA_StartSpriteAnim(0, 0, 4, 7, 6); PA_SetSpriteHflip(0, 0, 0);
}
if(Pad.Newpress.Left) {
PA_StartSpriteAnim(0, 0, 4, 7, 6);
PA_SetSpriteHflip(0, 0, 1);
}

if(!((Pad.Held.Left)||(Pad.Held.Up)||(Pad.Held.Down)||(Pad.Held.Right))) PA_SpriteAnimPause(0, 0, 1);
 
 
// Moving Code
y += Pad.Held.Down - Pad.Held.Up;
x += Pad.Held.Right - Pad.Held.Left;
PA_SetSpriteXY(0, 0, x, y);

PA_WaitForVBL();
}
if(Pad.Newpress.Up) PA_StartSpriteAnim(0, 0, 0, 3, 6);  이것은 위쪽 화살표키가 눌렸을때 프레임 0 에서 3까지의 애니메이션을 시작한다는 것이다.
if(Pad.Newpress.Right) {
  PA_StartSpriteAnim(0, 0, 4, 7, 6);  
  PA_SetSpriteHflip(0, 0, 0);
}
패드가 왼쪽 또는 오른쪽 눌린 것에 따라 sprite를 수평으로 뒤집는다.

확장된 애니메이션
PAlib 애니메이션 시스템에 최근에 추가되어 움직임을 쉽게 제어할수 있는 것으로 2개의 특별한 2개의 옵션을 제공한다.
애니메이션 타입이 ANIM_LOOP (0) 는 정상이고 ANIM_UPDOWN (1) 이면 앞 뒤로 애니메이션이 움직인다. 반복 횟수가 -1 이면 무한대로 재생되고, ANIM_UPDOWN 일때 완전한 앞 뒤 재생은 2번 반복으로 계산된다.
// First animation will be normal
PA_StartSpriteAnim(0, // screen
  0, // sprite number
  0, // first frame is 0
  6, // last frame is 6, since we have 7 frames...
  5); // Speed, set to 5 frames per second

// Extended animations for the rest
PA_StartSpriteAnimEx(0, 1, 0, 6, 5, ANIM_ONESHOT); // just play it once...
PA_StartSpriteAnimEx(0, 2, 0, 6, 5, ANIM_UPDOWN, -1); // back and forth, infinite number of times
PA_StartSpriteAnimEx(0, 3, 0, 6, 5, ANIM_LOOP, 5); // Play it 5 times
ANIM_ONESHOT 매크로는 단 한번만 재생한다. 종료될때 첫 프레임을 리턴한다. 마지막 프레임에서 멈추고 싶을때는 ANIM_UPDOWN 타입을 사용하고 한번만 반복한다.

깊이
3D 같은 게임에서 자주 sprite가 겹칠 필요가 있다. 다른 사람앞에 다른 사람이 가야 한다. 이것을 위해서 우선순위 설정이 필요한데 DS에서는 2종류의 우선 순위가 있다.
sprite 우선순위 : 낮은 sprite 숫자는 더 높은 sprite 숫자의 앞에 오게 된다.
배경 우선순위 : sprite 우선순위를 무시하기 위해 배경 우선순위를 변경할 수 있다. 기본적으로 모든 sprite는 배경 0의 앞에 있다. 다른 배경 1,2,3 의 앞에 sprite를 놓을수 있다. 배경 2의 sprite는 배경 우선순위 0,1 을 가진 모든 sprite의 뒤에 놓이고, 우선순위 3을 가진 모든 sprite의 앞에 놓인다. sprite의 숫자에 상관없이 말이다.
PA_SetSpritePrio(screen, sprite, priority );

이중의 sprite
최근에 추가된 함수이다. 이것은 동시에 위 아래 스크린에 sprite를 표시하는 것이 아니다. 하지만 하나로 두개의 화면을 사용하여 수직 범위가 0-191 에서 0-383으로 되었다.
y=0 의 위치는 위에 화면의 좌상 위치이다. PA_DualCreateSprite(...), PA_DualSetSpriteXY(sprite, x, y), 등과 같이 이미 본 함수에 Dual 접두사만 추가 되었다. 단지 다른 것은 이 함수들은 스크린 숫자를 더이상 필요로 하지 않는다. 논리적으로는 한 화면처럼 고려 되기 때문이다.
마지막으로 중요한 것은 Dual 함수에서 화면사이의 터치안되는 공간를 관리하기 위해  다음 함수를 추가했다. PA_SetScreenSpace(space in pixels). 기본값은 48픽셀이다. 가장 편안하게 느끼는 값이다. 화면에서 다른 화면으로 움직일때의 그 사이를 얘기하는 것이다. 경우에 따라 적게 또는 더 많이 지정할 수도 있다.
Posted by 버들피리불며

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

  1. 라피
    2007.10.20 20:13
    댓글 주소 수정/삭제 댓글
    PAGC Frontend로 Save and Converting 할때 계속 에러가 나네요;;;

    지정된 파일을 찾을 수 없습니다 라고 나오는데 어떻게 하면 좋을까요-_-;;

    이리저리 혼자 궁리해보다가 질문 하게 되네요 ;;;

    혹시 png 파일만 되나요?
    • 2007.10.21 00:23
      댓글 주소 수정/삭제
      Add File 메뉴로 추가했는데 그렇다는 말씀이죠?
      그렇다면 mode 설정이 잘못된듯 합니다.
      다시 확인해 보시기 바랍니다.
      gif, png 관계없습니다.
      같은 폴더에 생성된 log 파일을 확인해 보세요.


BLOG main image
닌텐도 DS 관련해서 Palib를 소개하고 제가 개발한 홈브류와 다른 개발자의 홈브류를 소개하고자 합니다. NDS 자체 제작(Homebrew)에 관심있는 다른 분들의 길잡이가 되고 싶습니다. by 버들피리불며

공지사항

카테고리

분류 전체보기 (39)
따라하기 (5)
PA_lib 소개 (10)
Homebrew 소개 (7)
나의 Homebrew (15)
기부하기(Donate) (1)
Wii (1)
Total : 117,269
Today : 0 Yesterday : 1