#include #include #include "pad.h" #include "action.h" #include "actinit.h" /* 範囲チェックマクロ */ #define limitRange(x, l, h) ((x)=((x)<(l)?(l):(x)>(h)?(h):(x))) extern short activeBuff; extern GsOT WorldOT[2]; extern long padinfo; GsSPRITE spPlayer[1]; void PlayerMain( action * ); void GoFire( action * ); void Jump( action * ); /*---------------------------------------------------------------------- プレイヤー色々 ----------------------------------------------------------------------*/ void PlayerMain( action *cw ){ if (padinfo&PADRleft){ cw->count0 = 15; /* 15/VSync */ cw->fnAction = GoFire; InitFire( cw ); } switch (padinfo){ case PADLup: cw->vectY = -2; cw->count1++; cw->count1 &= 0x3F; cw->sp->u = ((cw->count1>>2)&0x03)*64; cw->sp->v = ((cw->count1>>2)&0x04)*16+64; break; case PADLdown: cw->vectY = 2; cw->count1++; cw->count1 &= 0x3F; cw->sp->u = 192-(((cw->count1>>2)&0x03)*64); cw->sp->v = 128-(((cw->count1>>2)&0x04)*16); break; case PADLright: cw->vectX = 2; cw->count1++; cw->count1 &= 0x3F; cw->sp->u = ((cw->count1>>2)&0x03)*64; cw->sp->v = ((cw->count1>>2)&0x04)*16+64; break; case PADLleft: cw->vectX = -2; cw->count1++; cw->count1 &= 0x3F; cw->sp->u = 192-(((cw->count1>>2)&0x03)*64); cw->sp->v = 128-(((cw->count1>>2)&0x04)*16); break; default: cw->vectX = 0; cw->vectY = 0; cw->sp->u = 0; cw->sp->v = 0; } limitRange(cw->posX, 0, 320-64); limitRange(cw->posY, 0, 240-64); // FntPrint( "u = %d\n",cw->sp->u ); // FntPrint( "v = %d\n",cw->sp->v ); cw->posX += cw->vectX; cw->posY += cw->vectY; cw->sp->x = cw->posX; cw->sp->y = cw->posY; GsSortFastSprite(cw->sp, &WorldOT[activeBuff], 1); } /*---------------------------------------------------------------------- 火を吐く ----------------------------------------------------------------------*/ void GoFire( action *cw ){ if ( cw->count0-- == 0){ cw->fnAction = PlayerMain; } cw->sp->u = 192; cw->sp->v = 0; cw->sp->x = cw->posX; cw->sp->y = cw->posY; GsSortFastSprite(cw->sp, &WorldOT[activeBuff], 1); } /*---------------------------------------------------------------------- プレイヤー初期化 ----------------------------------------------------------------------*/ void InitPlayer(void){ short tpage; action *ap; GsSPRITE *sp; sp = spPlayer; tpage = GetTPage( 0, 0, 320, 0); sp->attribute = 0x00000000; /* 属性 */ sp->w = 64; /* 横幅 */ sp->h = 64; /* 高さ */ sp->tpage = tpage; /* テクスチャページ番号 */ sp->u = 0; /* ページ内オフセット */ sp->v = 0; sp->cx = 0; /* CLUT位置 */ sp->cy = 480; sp->r = sp->g = sp->b = 0x80; /* 輝度 */ sp->mx = sp->my = 0; /* 回転拡大時中心座標 */ sp->scalex = sp->scaley = ONE; /* スケール値 */ sp->rotate = 0; /* 回転角 */ ap = GetEmptyActPtr(); ap->ID = PLAYER; ap->fnAction = PlayerMain; /* 処理ルーチン */ ap->WorkSize = sizeof(*ap); /* ワークサイズ */ ap->message = 0; /* メッセージ */ ap->count0 = 0; /* カウンタ */ ap->count1 = 0; ap->posX = 0; ap->posY = 176; ap->vectX = 2; ap->vectY = 0; ap->speed = 0; ap->work0 = 2; ap->sp->x = ap->posX; ap->sp->y = ap->posY; ap->sp = sp; }