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

  タイトル ： スプライトを動かす
  編集履歴 ： 98-04-24 製作開始
              98-06-19 SET5対応
              98-09-16 テクスチャバッファ確保のサイズ変更
************************************************************/

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

void main(void)
{
	njSetBorderColor( 0x00000000 );
    njUserInit();
    while (njUserMain() == NJD_USER_CONTINUE) {
        njWaitVSync();
    }
    njUserExit();
}

#define MAX_MATRIX_DEPTH 1
#define MAX_VERTEXES 1000

#define CENTER_X 160.0F /* スプライトのX座標 */
#define CENTER_Y 120.0F /* スプライトのY座標 */
#define RADIUS 50.0F   /* スプライトの半径  */

#define SCREEN_SAVE_TIME 30

static NJS_SPRITE Sprite;
static NJS_POINT3 SpritePoint;

static NJS_TEXNAME SpriteTexName[1];
static NJS_TEXLIST SpriteTexList={SpriteTexName, 1};
static NJS_TEXMEMLIST SpriteTexMem[1];
static NJS_TEXANIM SpriteAnim[] = {{64, 64, 32, 32, 0, 0, 255, 255, 0, 0}};

static NJS_VERTEX_BUF	*g_VBuf;

/*-----------------------------------------------
    初期化
-----------------------------------------------*/
void njUserInit(void)
{
    /* システムの初期化 */
    sbInitSystem(NJD_RESOLUTION_320x240_NTSCNI, NJD_FRAMEBUFFER_MODE_RGB565, 1);
    /* メモリの割り当て */
    g_VBuf = (NJS_VERTEX_BUF *)syMalloc(sizeof(NJS_VERTEX_BUF) * MAX_VERTEXES);
    /* 背景色の設定 */
    njSetBackColor(0x00000000, 0x00000000, 0x00000000);
    /* テクスチャバッファの確保 */
    njInitTextureBuffer((Sint8 *)g_VBuf,0x800*10);
    /* 頂点格納バッファの確保 */
    njInitVertexBuffer(MAX_VERTEXES * 64 / 4, 0, MAX_VERTEXES * 64 / 4, 0, 0);
	njInitPrint( NULL, 0, NJD_TEXFMT_ARGB_1555 );
    /* テクスチャの初期化 */
    njInitTexture(&SpriteTexMem[0], 1);
    /* テクスチャの読み込み */
    njSetTextureName(&SpriteTexName[0],"sprite.pvr",0,NJD_TEXATTR_TYPE_FILE|NJD_TEXATTR_GLOBALINDEX);
    njLoadTexture(&SpriteTexList);
    njSetTexture(&SpriteTexList);
    njSetTextureNum(0);
	/* 文字色の設定 */
	njPrintColor(0xFFC0C0C0);
}

Sint32 njUserMain(void)
{
    static Angle counter = NJM_DEG_ANG(0.0F);/* 回転用のカウンタ */
	static PDS_PERIPHERAL *key;/* ボタン入力 */
	static Bool pause = FALSE;/* ポーズがかかっているかどうか */
	static int pause_counter = 0;
	/* ポーズの判定 */
	key = (PDS_PERIPHERAL *) pdGetPeripheral(PDD_PORT_A0);

	if (key->press & PDD_DGT_ST) {
	    if (pause == FALSE) {
		    pause = TRUE;
		} else {
		    pause = FALSE;
		}
	}

    /* タイトル表示 */
    njPrintC(NJM_LOCATION(6, 5), "Ninja Sample SPRITE MOVEMENT");
	if (pause == TRUE) {
	    njPrintC(NJM_LOCATION(16, 7), "PAUSE");
	}
    /* 頂点座標の設定 */
    SpritePoint.x = CENTER_X + njCos(counter) * RADIUS;
    SpritePoint.y = CENTER_Y + njSin(counter) * RADIUS;
    /* スプライトの設定 */
    Sprite.sx = 1.0F;
    Sprite.sy = 1.0F;
    Sprite.p = SpritePoint;
    Sprite.tlist = &SpriteTexList;
    Sprite.tanim = SpriteAnim;
    /* スプライトの表示 */
	if (pause == FALSE) {
	    njDrawSprite2D(&Sprite, 0, -1.0F, NJD_SPRITE_ANGLE);
		counter += NJM_DEG_ANG(1.0F);
	} else {
	    pause_counter++;
		if (pause_counter > SCREEN_SAVE_TIME) {
		    njDrawSprite2D(&Sprite, 0, -1.0F, NJD_SPRITE_ANGLE);
		}
		if (pause_counter == SCREEN_SAVE_TIME * 2) {
		    pause_counter = 0;
		}
	}
    return NJD_USER_CONTINUE;
}
/*-----------------------------------
    終了
-----------------------------------*/
void njUserExit(void)
{
	njExitPrint();
	njExitTexture();
    syFree(g_VBuf);
    sbExitSystem();
}
