diff --git a/build/systemMenu_RED/Launcher/ARM9/src/launcher.c b/build/systemMenu_RED/Launcher/ARM9/src/launcher.c index a7b8292b..273c0207 100644 --- a/build/systemMenu_RED/Launcher/ARM9/src/launcher.c +++ b/build/systemMenu_RED/Launcher/ARM9/src/launcher.c @@ -22,8 +22,8 @@ // define data------------------------------------------ -#define LAUNCHER_ELEMENT_NUM 4 // ロゴメニューの項目数 +// バックライトボタン関係 #define B_LIGHT_DW_BUTTON_TOP_X ( 0 ) #define B_LIGHT_DW_BUTTON_TOP_Y ( 22 * 8 ) #define B_LIGHT_DW_BUTTON_BOTTOM_X ( B_LIGHT_DW_BUTTON_TOP_X + 11 ) @@ -33,7 +33,24 @@ #define B_LIGHT_UP_BUTTON_BOTTOM_X ( B_LIGHT_UP_BUTTON_TOP_X + 22 ) #define B_LIGHT_UP_BUTTON_BOTTOM_Y ( B_LIGHT_UP_BUTTON_TOP_Y + 16 ) -#define CURSOR_PER_SELECT 14 +// バナー表示関係 +#define DOT_PER_FRAME ((BANNER_WIDTH + BANNER_INTERVAL) / FRAME_PER_SELECT) // 割り切れないと動きがカクカクするはず +#define FRAME_PER_SELECT 14 // バナーからバナーへの移動にかかるフレーム数 +#define BANNER_FAR_LEFT_POS (WINDOW_WIDTH/2 - BANNER_WIDTH*5/2 - BANNER_INTERVAL * 2) +#define BANNER_TOP (WINDOW_HEIGHT/2) +#define WINDOW_WIDTH 256 +#define WINDOW_HEIGHT 192 +#define BANNER_WIDTH 32 +#define BANNER_HEIGHT 32 +#define BANNER_INTERVAL 24 +#define TITLE_V_CENTER 56 + +#define MAX_SHOW_BANNER 6 + +// フェードアウト関係 +#define FADE_COUNT_PER_ALPHA (FADE_COUNT_MAX / ALPHA_MAX) +#define FADE_COUNT_MAX 124 +#define ALPHA_MAX 31 // extern data------------------------------------------ @@ -42,8 +59,17 @@ extern u16 bg_scr_data[32 * 32]; extern u16 bg_scr_data2[32 * 32]; // function's prototype declaration--------------------- +static void LoadBannerFiles( void ); +static void BannerInit( void ); +static void SetDefaultBanner( TitleProperty *titleprop ); +static void LoadBannerToVRAM( TitleProperty *titleprop ); +static void SetAffineAnimation( int cursor ); +static void BannerDraw(int cursor, int selected, TitleProperty *titleprop); +static BOOL SelectCenterFunc( u16 *csr, TPData *tgt ); +static BOOL SelectFunc( u16 *csr, TPData *tgt ); +static void ProcessBackLightPads( void ); +static TitleProperty *ProcessPads( TitleProperty *pTitleList ); static void DrawBackLightSwitch(void); -static void DrawLauncher(u16 nowCsr, const MenuParam *pMenu); // global variable ------------------------------------- RTCDrawProperty g_rtcDraw = { @@ -51,11 +77,22 @@ RTCDrawProperty g_rtcDraw = { }; // static variable ------------------------------------- -static int s_csr = 0; // メニューのカーソル位置 +static int s_csr = 0; // 画面中央座標と、リストの一番最初にあるバナーの中央座標との距離を + // 移動するのに必要なフレーム数で表すための変数 static u64 old_titleIdArray[ LAUNCHER_TITLE_LIST_NUM ]; +static TWLBannerFile *empty_banner; +static TWLBannerFile *nobanner_banner; +static TWLBannerFile *no_card_banner; +static u8 image_index_list[ LAUNCHER_TITLE_LIST_NUM ]; +static GXOamAttr banner_oam_attr[MAX_SHOW_BANNER+10];// アフィンパラメータ埋める関係で少し大きめ +static u8 *pbanner_image_list[ LAUNCHER_TITLE_LIST_NUM ]; +static int banner_count = 0; +static int selected = 0; + // const data ----------------------------------------- + //=============================================== // Launcher.c //=============================================== @@ -68,19 +105,10 @@ static u64 old_titleIdArray[ LAUNCHER_TITLE_LIST_NUM ]; #define DBGBNR #ifdef DBGBNR -static TWLBannerFile *empty_banner; -static TWLBannerFile *nobanner_banner; -static TWLBannerFile *no_card_banner; -static u8 image_index_list[ LAUNCHER_TITLE_LIST_NUM ]; -static const int MAX_SHOW_BANNER = 6; -static GXOamAttr banner_oam_attr[MAX_SHOW_BANNER+10];// アフィンパラメータ埋める関係で少し大きめ -static u8 *pbanner_image_list[ LAUNCHER_TITLE_LIST_NUM ]; -static int banner_count = 0; -static void LoadBannerFiles() +static void LoadBannerFiles( void ) { - // ファイル読み込み部分。多分emptyバナーだけ読み込む事になる。本来、アプリ系は外部から取得 - // 最後に解放しないと駄目。だが、どこで解放すればいいのやら…… + // デフォルトバナーファイルの読み込み。最終的にリブートしてしまうので、解放処理は無し u32 size = CMN_LoadFile( (void **)&empty_banner, "data/EmptyBanner.bnr", &g_allocator); NNS_G2D_ASSERT( size > 0 ); size = CMN_LoadFile( (void **)&nobanner_banner, "data/NoBanner.bnr", &g_allocator); @@ -90,7 +118,7 @@ static void LoadBannerFiles() } // パレットの読み込みやOBJ関係の初期化 -static void BannerInit() +static void BannerInit( void ) { int l; LoadBannerFiles(); @@ -98,20 +126,19 @@ static void BannerInit() MI_CpuClearFast(old_titleIdArray, sizeof(old_titleIdArray) ); MI_DmaFill32(3, banner_oam_attr, 192, sizeof(banner_oam_attr)); // let out of the screen if not display - // ここでやるべきじゃない気がするOBJの設定 + // OBJModeの設定 GX_SetOBJVRamModeChar(GX_OBJVRAMMODE_CHAR_1D_128K); // 2D mapping mode - // パレット読み込み - // 本来は、読み込んだバナーによってパレットも変更する必要があるのかもしれないが、どの道最大256色 - // 17個以上のバナーをそれぞれ違うパレットで同時に表示はできないはず。 + // パレットのロード + // どのバナーもdata/EmptyBanner.bnrのパレットと同じものを使う事前提 GX_LoadOBJPltt( empty_banner->v1.pltt, 0, BNR_PLTT_SIZE ); - //OBJATTRの初期化……後で値を弄って場所やらキャラクターを変えたりする + //OBJATTRの初期化……表示前には値を弄る for(l=0;lv1.comment[ TSD_GetLanguage() ]; - int width = NNS_G2dTextCanvasGetStringWidth(&gTextCanvas, str, NULL); - PutStringUTF16( (256-width)/2, 48, TXT_COLOR_BLACK, str ); + NNSG2dTextRect rect = NNS_G2dTextCanvasGetTextRect( &gTextCanvas, str ); + PutStringUTF16( (WINDOW_WIDTH-rect.width)/2, TITLE_V_CENTER - rect.height/2, TXT_COLOR_BLACK, str ); } } @@ -293,9 +340,6 @@ void LauncherInit( TitleProperty *pTitleList ) #endif } - -static int selected = 0; - // ROMのローディング中のランチャーフェードアウト BOOL LauncherFadeout( TitleProperty *pTitleList ) { @@ -313,12 +357,12 @@ BOOL LauncherFadeout( TitleProperty *pTitleList ) BannerDraw( s_csr, selected, pTitleList ); #endif - // 描画少し上書き追加 + // 描画少し追加 { MtxFx22 mtx; static double wa; double s = cos(wa); - if( s!=0 ) mtx._00 = (double)FX32_HALF/s; + if( s!=0 ) mtx._00 = (fx32)(FX32_HALF/s); else mtx._00 = 0x8fff; mtx._01 = 0; mtx._10 = 0; @@ -329,13 +373,16 @@ BOOL LauncherFadeout( TitleProperty *pTitleList ) DC_FlushRange(&banner_oam_attr, sizeof(banner_oam_attr)); GX_LoadOAM(&banner_oam_attr, 0, sizeof(banner_oam_attr)); - - // これだと124フレームでフェードアウト終わる - G2_ChangeBlendAlpha( fadecount/4, 31-(fadecount/4) ); - if(fadecount < 124) { + + // フェードアウトのカウント処理 + G2_ChangeBlendAlpha( fadecount/FADE_COUNT_PER_ALPHA, ALPHA_MAX-(fadecount/FADE_COUNT_PER_ALPHA) ); + if(fadecount < FADE_COUNT_MAX) { fadecount++; return FALSE; }else { + // ディスプレイOFFにしないと起動時にノイズが表示される + GX_DispOff(); + GXS_DispOff(); return TRUE; } } @@ -344,9 +391,9 @@ BOOL LauncherFadeout( TitleProperty *pTitleList ) static BOOL SelectCenterFunc( u16 *csr, TPData *tgt ) { // 単純な実装例 - int x = 128-32-64-48+2*56; - int y = 96-16; - if(WithinRangeTP( x, y, x+64, y+64, tgt )) + int x = WINDOW_WIDTH/2 - BANNER_WIDTH; + int y = BANNER_TOP - BANNER_HEIGHT/2; + if(WithinRangeTP( x, y, x+BANNER_WIDTH*2, y+BANNER_HEIGHT*2, tgt )) { *csr = (u16)1; return TRUE; @@ -372,27 +419,14 @@ static BOOL SelectFunc( u16 *csr, TPData *tgt ) return FALSE; } -// ランチャーメイン -TitleProperty *LauncherMain( TitleProperty *pTitleList ) +static void ProcessBackLightPads( void ) { - SelectSomethingFunc func[1]={SelectCenterFunc}; static BOOL up_bl_bak = FALSE; static BOOL dw_bl_bak = FALSE; BOOL up_bl_trg = FALSE; BOOL dw_bl_trg = FALSE; - static int csr_v = 0; - BOOL tp_select = FALSE; - TitleProperty *ret = NULL; int brightness; - u16 dummy; - u16 tp_lr = 3; - // RTC情報の取得&表示 - GetAndDrawRTCData( &g_rtcDraw, FALSE ); - - //-------------------------------------- - // バックライトON,OFF制御 - //-------------------------------------- if(tpd.disp.touch) { BOOL up_bl = WithinRangeTP( B_LIGHT_UP_BUTTON_TOP_X, B_LIGHT_UP_BUTTON_TOP_Y, B_LIGHT_UP_BUTTON_BOTTOM_X, B_LIGHT_UP_BUTTON_BOTTOM_Y, &tpd.disp ); @@ -421,11 +455,21 @@ TitleProperty *LauncherMain( TitleProperty *pTitleList ) } SYSM_SetBackLightBrightness( (u8)brightness ); } +} + +static TitleProperty *ProcessPads( TitleProperty *pTitleList ) +{ + SelectSomethingFunc func[1]={SelectCenterFunc}; + static int csr_v = 0; + BOOL tp_select = FALSE; + u16 dummy; + u16 tp_lr = 3; + TitleProperty *ret = NULL; - //-------------------------------------- - // タッチパッド・キー入力処理 - //-------------------------------------- + // バックライト関係のキー処理 + ProcessBackLightPads(); + // その他のキー処理 if( tpd.disp.touch ) { (void) SelectFunc( &tp_lr, &tpd.disp ); @@ -438,13 +482,13 @@ TitleProperty *LauncherMain( TitleProperty *pTitleList ) if(csr_v == 0) csr_v = -1; } s_csr += csr_v; - if((LAUNCHER_TITLE_LIST_NUM-1)*CURSOR_PER_SELECT < s_csr) s_csr = (LAUNCHER_TITLE_LIST_NUM-1)*CURSOR_PER_SELECT; + if((LAUNCHER_TITLE_LIST_NUM-1)*FRAME_PER_SELECT < s_csr) s_csr = (LAUNCHER_TITLE_LIST_NUM-1)*FRAME_PER_SELECT; if( s_csr < 0 ) s_csr = 0; - if(s_csr%CURSOR_PER_SELECT == 0){ + if(s_csr%FRAME_PER_SELECT == 0){ csr_v = 0; - selected = s_csr/CURSOR_PER_SELECT; + selected = s_csr/FRAME_PER_SELECT; - // このときだけ決定可能 + // バナーが中央にあるときだけ決定可能 tp_select = SelectSomethingByTP(&dummy, func, 1 ); if( ( pad.trg & PAD_BUTTON_A ) || ( tp_select ) ) { // メニュー項目への分岐 @@ -455,6 +499,20 @@ TitleProperty *LauncherMain( TitleProperty *pTitleList ) } } + return ret; +} + +// ランチャーメイン +TitleProperty *LauncherMain( TitleProperty *pTitleList ) +{ + TitleProperty *ret = NULL; + + // RTC情報の取得&表示 + GetAndDrawRTCData( &g_rtcDraw, FALSE ); + + // キー及びタッチ制御 + ret = ProcessPads( pTitleList ); + // 描画関係 NNS_G2dCharCanvasClear( &gCanvas, TXT_COLOR_NULL ); PrintfSJIS( 0, 0, TXT_COLOR_BLUE, "TWL-SYSTEM MENU ver.%06x", SYSMENU_VER ); @@ -467,28 +525,6 @@ TitleProperty *LauncherMain( TitleProperty *pTitleList ) return ret; } -#if 0 -// ランチャー描画 -static void DrawLauncher(u16 nowCsr, const MenuParam *pMenu) -{ - int i; - int color; - - for( i = 0; i < pMenu->num; i++ ) { - if(i == nowCsr) { - if( !pMenu->pos[ i ].enable ) { - color = pMenu->disable_color; - }else { - color = pMenu->select_color; - } - }else { - color = pMenu->normal_color; - } - PutStringUTF16( pMenu->pos[ i ].x, pMenu->pos[ i ].y, color, (pMenu->str_elem)[ i ] ); - } -} -#endif - // バックライトスイッチの表示 static void DrawBackLightSwitch(void) {