フェードイン/フェードアウト。
NDS は GBA と同様にブレンドという機能がハードウェアに備わってるので
半透明処理やフェードイン/アウトなんかはソフトウェア処理を行う手間がないんです。
手を抜けるところは手を抜いてこうってことで。
akkera102 さんところの「GBA develop Wiki - チュートリアル - Step.16 特殊効果 ブレンド」の解説を参考にしてます。
#define 文も拝借してしまいました(汗)。
・フェードイン/フェードアウト
ttp://page.freett.com/ntr/tech/fade.zip
アーカイブを欲しい方は上記アドレスからどうぞです。
ソースコードだけ見たいって方は下記をどうぞ。
main.c
/*--------------------------------------------------------------------------------- fade in, fade out. version 0.01 Mar 11, 2010 By REGEKATSU ---------------------------------------------------------------------------------*/ #include <nds.h> #include "bootBgTop.h" #include "bootBgBottom.h" #define BLEND_LOW(n) ((n)<<0) #define BLEND_HIGH(n) ((n)<<8) #define BLEND_LEVEL(n) (BLEND_LOW(n) | BLEND_HIGH(n)) #define BLEND_BALANCE(n) (BLEND_LOW(n) | BLEND_HIGH(16-n)) //--------------------------------------------------------------------------------- int main(void) { //--------------------------------------------------------------------------------- int bg_top, bg_bottom; videoSetMode(MODE_5_2D); videoSetModeSub(MODE_5_2D); vramSetBankA(VRAM_A_MAIN_BG); vramSetBankC(VRAM_C_SUB_BG); bg_top = bgInit(3, BgType_Bmp16, BgSize_B16_256x256, 0, 0); bg_bottom = bgInitSub(3, BgType_Bmp16, BgSize_B16_256x256, 0, 0); dmaCopy(bootBgTopBitmap, bgGetGfxPtr(bg_top), bootBgTopBitmapLen); dmaCopy(bootBgBottomBitmap, bgGetGfxPtr(bg_bottom), bootBgBottomBitmapLen); typedef enum{ FADE_IN = 0, FADE_OUT }FADE_MODE; int fade = FADE_IN; int cnt = 16; REG_BLDCNT = BLEND_SRC_BG3 | BLEND_FADE_BLACK; REG_BLDCNT_SUB = BLEND_SRC_BG3 | BLEND_FADE_BLACK; while(1) { scanKeys(); if(keysDown() & KEY_START){ if(fade == FADE_IN){ fade = FADE_OUT; }else{ fade = FADE_IN; } } if(fade == FADE_IN){ cnt--; if(cnt < 0) cnt = 0; }else{ cnt++; if(cnt > 16) cnt = 16; } swiWaitForVBlank(); REG_BLDY = BLEND_BALANCE(cnt); REG_BLDY_SUB = BLEND_BALANCE(cnt); } } //---------------------------------------------------------------------------------