/************************************************************
  Ninja Sample
  COPYRIGHT (C) SEGA ENTERPRISES, LTD.

  タイトル ： スプライトをアニメーション表示
              sprite animation
  編集履歴 ： 98-04-20 製作開始
              98-04-23 一枚のテクスチャーを4分割
                       ウェイトを置いて順次表示
              98-06-18 SET5対応
              98-07-13 pause画面、焼付き対策
              98-08-20 頂点バッファサイズを変更
              98-09-16 テクスチャバッファ確保のサイズ変更
              99-04-07 appends the English comments
************************************************************/

#include <shinobi.h>
#include <njdef.h>


#define MAX_MATRIX_DEPTH 10
#define MAX_VERTEXES 1000
#define SPRITE_Z -1500.F


NJS_TEXNAME texname[1] ;
NJS_SPRITE sprite;
NJS_TEXLIST texlist = {texname, 1};
NJS_MATRIX *gMatrix;
NJS_VERTEX_BUF *gVbuf;
NJS_VIEW view;
NJS_LIGHT light;
NJS_TEXANIM anim[] = {
                       {256, 256, 64, 64, 0, 0, 127, 127, 0, 0},
                       {256, 256, 64, 64, 0, 128, 127, 255, 0, 0},
                       {256, 256, 64, 64, 128, 0, 255, 127, 0, 0},
                       {256, 256, 64, 64, 128, 128, 255, 255, 0, 0}
                        };
NJS_TEXMEMLIST  texmemlist[1];
NJS_FOG_TABLE fog;

void main(void)
{
	njSetBorderColor( 0x00000000 );
        njUserInit();
        while (njUserMain() == NJD_USER_CONTINUE) {
                njWaitVSync();
        }
        njUserExit();
}
/*----------------------------------------------------------------------
           初期化
           initialize
----------------------------------------------------------------------*/
void njUserInit(void)
{
    /* システムの初期化 */
    /* Initializes the Dreamcast H/W and readies the SEGA library */
    sbInitSystem(NJD_RESOLUTION_320x240_NTSCNI, NJD_FRAMEBUFFER_MODE_RGB565, 1);

    /*matrixとvertexバッファの確保*/
	/* initialize matrix stack */
    gMatrix = (NJS_MATRIX *)syMalloc(sizeof (NJS_MATRIX) * MAX_MATRIX_DEPTH);

    /* allocates the vertex calculation work */
    gVbuf = (NJS_VERTEX_BUF *)syMalloc(sizeof (NJS_VERTEX_BUF) * MAX_VERTEXES);

    /* 背景色の設定 */
    /* sets the background */
    njSetBackColor(ARGB(0, 0, 0, 0), ARGB(0, 0, 0, 0), ARGB(0, 0, 0, 192));

    /* テクスチャバッファの確保 */
    /* sets necessary memory for work area of a texture */
    njInitTextureBuffer((Sint8 *)gVbuf,0x800*10);

    /* 頂点格納バッファの確保 */
    /* allocates the buffers for registration of vertex data */
    njInitVertexBuffer(MAX_VERTEXES * 64 / 4, 0, MAX_VERTEXES * 64 / 4, 0, 0);

	njInitPrint( NULL, 0, NJD_TEXFMT_ARGB_1555 );

    /* マトリクススタックの初期化 */
	/* initialize matrix stack */
    njInitMatrix(gMatrix, MAX_MATRIX_DEPTH, 1);

    /* 3Dシステムの初期化 */
    /* intialize vertex calculation work */
    njInit3D(gVbuf, MAX_VERTEXES);

    /* 光源の初期化 */
    /* create light */
    njCreateLight(&light, NJD_DIR_LIGHT);

    /* ビューの初期化 */
    /* initialize view */
    njInitView(&view);

    /* ビューの設定 */
    /* set view */
    njSetView(&view);
/*--------------------------------------
         テクスチャー設定
         texture setup
----------------------------------------*/
     njInitTexture( texmemlist, 1 );
    /*一枚のテクスチャーを設定*/
    /* set only one texture */
    njSetTextureName(&texname[0],"sprite.pvr", 0, NJD_TEXATTR_TYPE_FILE|NJD_TEXATTR_GLOBALINDEX);
    /*テクスチャーロード*/
    /* load texture */
    njLoadTexture( &texlist);
    /*テクスチャーの登録*/
    /* set current texture list */
    njSetTexture(&texlist);
    /*使うテクスチャーNo．*/
    /* set current texture */
    njSetTextureNum(0);

/*---------------------------------
    FOG
----------------------------------*/
    njSetFogColor(0xff0000c0);
    njSetFogTable(fog);
}


/*----------------------------------------------------------------------
         メイン
         main
----------------------------------------------------------------------*/
Sint32 njUserMain(void)
{

    static int animCt = 0;/*アニメーションウェイト用カウンター*/
                          /* wait timer for animation */
    static PDS_PERIPHERAL *input;
    static Bool pause = FALSE;  /*flag for pausing*/
    static Uint32 print_col = 0x11c00000;

    input = pdGetPeripheral(PDD_PORT_A0);   /*get key state*/
    /*checking key*/
    if (input->press & PDD_DGT_ST){
        pause = !pause;
    }
    if(pause) {     /*文字色の更新*/
                    /* change text size & color */
        njPrintSize(20);
        njPrintColor(print_col);
        njPrintC(NJM_LOCATION(6, 5), "PAUSE");
        if (print_col < 0xffc0c0c0) {
            print_col += 0x03000000;
        }
        /*pause中はフォグを発生*/
        /* enable fog */
        njGenerateFogTable2(fog, -50.F);
        njSetFogTable(fog);
        njFogEnable();
    } else {        /*文字size/色を戻す*/
                    /* reset text color & size */
        njPrintSize(8);
        njPrintColor(0xffc0c0c0);
        print_col = 0x11c00000;
        /*フォグ効果オフ*/
        /* disable fog */
        njFogDisable();
        /* サンプル名の表示 */
        /* print the sample program name */
        njPrintC(NJM_LOCATION(6, 5), "Ninja Sample SPRITE ANIMATION");

    }
    /* マトリクススタックのクリア */
    /* clear matrix stack */
    njClearMatrix();
    /*スプライト設定*/
    /* set a sprite */
    sprite.tlist = &texlist;
    sprite.sx = 0.5f;
    sprite.sy = 0.5f;
    sprite.p.x = 140.0f;
    sprite.p.y = 100.0f;
    /*アニメパターン*/
    switch (animCt){
    case 0:
        sprite.tanim = &anim[0];
        break;
    case 30:
        sprite.tanim = &anim[1];
        break;
    case 60:
        sprite.tanim = &anim[2];
        break;
    case 90:
        sprite.tanim = &anim[3];
        break;
    case 120:
        sprite.tanim = &anim[0];
        animCt = 0;
        break;
    default:
        break;
    }
    njDrawSprite2D(&sprite, 0, SPRITE_Z, NJD_SPRITE_ANGLE);
    if (!pause) {   /*ポーズ中はアニメーションを更新しない*/
                    /* animation */
        animCt++;
    }
    return NJD_USER_CONTINUE;
}

/*----------------------------------------------------------------------
         終了処理
         exit
----------------------------------------------------------------------*/
void njUserExit(void)
{
	njExitPrint();
    /*テクスチャーの開放*/
    /* free texture memory */
    njExitTexture();
    /*matrixとvbufのクリア*/
    syFree(gMatrix);
    syFree(gVbuf);
    /* システムの終了 */
    /* exit system */
    sbExitSystem();
}











































