cursor.c 2.81 KB
/*
 *  NINTENDO64 SAMPLE PROGRAM
 *
 *  FILE : cursor.c
 *
 *  Copyright (C) 1997, NINTENDO Co,Ltd.
 */


#include  <ultra64.h>
#include  <PR/gs2dex.h>
#include  "system.h"
#include  "action.h"
#include  "cursor.h"


/*
 *  3D スティックによるカーソルの移動量
 */
static  f32  MoveFactor[] = { -6.0, -6.0, -3.0, -1.5, -0.5, 0.0,
			       0.0,  0.5,  1.5,  3.0,  6.0, 6.0 };


/*
 *  カーソル構造体の初期化
 */
void  cursorInit(CURSOR_STATE  *curStat, uObjSprite  *sprite, uObjTxtr  *txtr)
{

  /* カーソルはスクリーンの中心に */
  curStat->cursor_x = SCREEN_WD >> 1;
  curStat->cursor_y = SCREEN_HT >> 1;

  curStat->curMtx[0].m.X = ((s16)curStat->cursor_x) << 2;
  curStat->curMtx[0].m.Y = ((s16)curStat->cursor_y) << 2;
  curStat->curMtx[1].m.X = ((s16)curStat->cursor_x) << 2;
  curStat->curMtx[1].m.Y = ((s16)curStat->cursor_y) << 2;

  /* カーソルのスケーリングは無し */ 
  curStat->curMtx[0].m.BaseScaleX = 1 << 10;
  curStat->curMtx[0].m.BaseScaleY = 1 << 10;
  curStat->curMtx[1].m.BaseScaleX = 1 << 10;
  curStat->curMtx[1].m.BaseScaleY = 1 << 10;

  /* z トリガーをクリックしていない */
  curStat->cursor_z = 0;

  /* スプライト及びテクスチャの登録 */
  curStat->curSprite = sprite;
  curStat->curTxtr   = txtr;
}


/*
 *  カーソル構造体の更新
 */
void  cursorUpdate(CURSOR_STATE  *curStat, Action  *Ac, u8 frame)
{

  /* only controller 1 is used */

  s16  nx, ny;

  
  /* 3D スティックでカーソル移動 */
  nx = (Ac->pad[0].c->stick_x + 96) >> 4;
  ny = (Ac->pad[0].c->stick_y + 96) >> 4;

  curStat->cursor_x += MoveFactor[nx];
  curStat->cursor_y -= MoveFactor[ny];

  /* カーソルの画面端処理 */
  if(curStat->cursor_x > SCREEN_WD)
    curStat->cursor_x = SCREEN_WD;
  else if(curStat->cursor_x < 0.0)
    curStat->cursor_x = 0.0;

  if(curStat->cursor_y > SCREEN_HT)
    curStat->cursor_y = SCREEN_HT;
  else if(curStat->cursor_y < 0.0)
    curStat->cursor_y = 0.0;
  
  /* カーソル用マトリクス構造体の設定 */
  curStat->curMtx[frame].m.X = ((s16)curStat->cursor_x) << 2;
  curStat->curMtx[frame].m.Y = ((s16)curStat->cursor_y) << 2;

  /* Z ボタンでクリック */
  if(Ac->pad[0].push & Z_TRIG)
    curStat->cursor_z = 1;
  else
    curStat->cursor_z = 0;
}


/*
 *  カーソルの描画
 */
Gfx  *cursorDraw(Gfx  *gp, CURSOR_STATE  *curStat, u8 frame)
{

  /* カーソル描画用 RSP 設定 */
  gSPObjRenderMode(gp ++, 0);
  
  /* カーソル描画用 RDP 設定 */
  gDPPipeSync(gp ++);
  /* Global */
  gDPSetCycleType(gp ++, G_CYC_1CYCLE);
  /* TX */
  gDPSetTextureLUT(gp ++, G_TT_NONE);
  /* TF */
  gDPSetTextureFilter(gp ++, G_TF_POINT);
  /* CC */
  gDPSetCombineMode(gp ++, G_CC_DECALRGBA, G_CC_DECALRGBA);
  /* BL */
  gDPSetRenderMode(gp ++, G_RM_OPA_SURF, G_RM_OPA_SURF2);

  /* カーソルの描画 */
  gSPObjLoadTxtr  (gp ++,  curStat->curTxtr);
  gSPObjSubMatrix (gp ++, &curStat->curMtx[frame]);
  gSPObjRectangleR(gp ++,  curStat->curSprite);

  return gp;
}