LoadDivGraphとそれに関連した関数です。 安全策はとってません;
//指定したテクスチャの任意座標から色情報を取得
//32bitアルファ有りフォーマット固定
u32 TextureGetColor(int TextureNo,int Sx,int Sy)
{
u32* TEXRAM = texarray[TextureNo].pmemory;
return TEXRAM[texarray[TextureNo].width * Sy + Sx];
}
//指定したテクスチャの任意座標へ指定した色情報をセット
//32bitアルファ有りフォーマット固定
void TextureSetColor(int TextureNo,int Sx,int Sy,u32 color)
{
u32* TEXRAM = texarray[TextureNo].pmemory;
TEXRAM[texarray[TextureNo].width * Sy + Sx] = color;
return;
}
//範囲コピー用
int TextureCopy(int TextureNo1,int TextureNo2,int No1Sx,int No1Sy,int No2Sx,int No2Sy, int width, int height)
{
//if (texarray[TextureNo1].flags != TEXTUREFLAGS_XXXX ) return -1;
//if (texarray[TextureNo2].flags != TEXTUREFLAGS_XXXX ) return -2;
int i;
int j;
for(i=0;i<height;i++) {
for(j=0;j<width;j++) {
TextureSetColor(TextureNo1,No1Sx + j,No1Sy + i,TextureGetColor(TextureNo2,No2Sx + j,No2Sy + i));
}
}
return 0;
}
int LoadDivGraph(const char *FileName , int AllNum , int XNum , int YNum , int XSize , int YSize , int *HandleBuf )
{
int res = -1;
if(res == -1)res = LoadPngImage(FileName);
if(res == -1)res = LoadJpegImage(FileName);
//PSPのメモリの少なさから考えると先にDiv後の領域(XSizexYSizexカラーフォーマットxAllNum)
//を確保したほうが歯抜けになりにくい
//でもとりあえずは読み込まないと画像のフォーマットがわからない
//妥協案としては
//(速度が速い方)
//LoadPngImageもしくはLoadJpegImageロードしたあと
//Div後の領域を確保してDivした後元の画像を破棄
//(速度が遅い方)
//LoadPngImageもしくはLoadJpegImageロードしたあと
//カラーフォーマットだけ取得した後一旦画像を破棄
//Div後の領域を確保して再度画像を読み込みdivしてから破棄
if(res != -1)
{
//int Wpsm = texarray[res].psm;
int i;
int j;
//for(i=0;i<AllNum;i++)
//{
// HandleBuf[i] = MakeGraph(XSize,YSize,GU_PSM_8888);
//この関数でべき乗に確保してるようなので縦横サイズをそのまま渡してる
//}
//安全策はとりあえず省略(メモリ取れなかったら・・・
//まあPSP上でPC用素材をそのまま使うというのがそもそもだし
int k;
int wres;
for(i=0;i<YNum;i++)
{
for(j=0;j<XNum;j++)
{
k = i*XNum + j;
wres = MakeGraph(XSize,YSize,GU_PSM_8888);
TextureCopy(wres,res,0,0,j*XSize,i*YSize,XSize,YSize);
if(gusettings.flags[0] & GPUSETTINGFLAGS_0_CREATESWIZZLEDGRAPH)
SwizzleGraph(wres);
if(gusettings.flags[0] & GPUSETTINGFLAGS_0_CREATEVRAMGRAPH)
MoveGraphToVRAM(wres);
texarray[wres].flags |= TEXTUREFLAGS_RELOAD;
HandleBuf[k] = wres;
}
}
DeleteGraph(res);
}
if (res != -1) res = 0;
return res;
}
dxpinput.c関連の追加コードです dxpinput.c本体 DXライブラリ本家がマイクロソフトサイドワインダー ゲームパッドに 合わせたボタンを返すようなので同じ仕様に配置してみました。 なお、PSPにはマイクロソフトサイドワインダー ゲームパッドで 言うところのCとZのボタンがありませんのでコメントにしてあります
int GetJoypadInputState( int InputType )
{
int ret = 0;
if(CtrlData.Buttons & PSP_CTRL_UP) ret |= PAD_INPUT_UP;
if(CtrlData.Buttons & PSP_CTRL_DOWN) ret |= PAD_INPUT_DOWN;
if(CtrlData.Buttons & PSP_CTRL_LEFT) ret |= PAD_INPUT_LEFT;
if(CtrlData.Buttons & PSP_CTRL_RIGHT) ret |= PAD_INPUT_RIGHT;
if(CtrlData.Buttons & PSP_CTRL_CROSS) ret |= PAD_INPUT_A;
if(CtrlData.Buttons & PSP_CTRL_CIRCLE) ret |= PAD_INPUT_B;
//if(CtrlData.Buttons & PSP_CTRL_) ret |= PAD_INPUT_C;
if(CtrlData.Buttons & PSP_CTRL_SQUARE) ret |= PAD_INPUT_X;
if(CtrlData.Buttons & PSP_CTRL_TRIANGLE) ret |= PAD_INPUT_Y;
//if(CtrlData.Buttons & PSP_CTRL_) ret |= PAD_INPUT_Z;
if(CtrlData.Buttons & PSP_CTRL_LTRIGGER) ret |= PAD_INPUT_L;
if(CtrlData.Buttons & PSP_CTRL_RTRIGGER) ret |= PAD_INPUT_R;
if(CtrlData.Buttons & PSP_CTRL_START) ret |= PAD_INPUT_START;
if(CtrlData.Buttons & PSP_CTRL_SELECT) ret |= PAD_INPUT_M;
return ret;
}
とりあえずダミー実装 DXライブラリを使ったPCゲームの多くはパッド以外にキーボードからの入力チェックをしている 可能性がありすんなり移植できるように実装しました。 PSPにはキーボードがありませんので当関数を呼んでもキーが押されていない(0x00)を返すだけです。
int GetHitKeyStateAll( char *KeyStateBuf )
{
memset(KeyStateBuf,0x00,256);
return 0;
}
あとdxlibp.hに上記関数のプロトタイプ宣言と下記defineを追加してください
//20090405 //DXライブラリ本家よりコピー #define PAD_INPUT_DOWN (0x00000001) // ↓チェックマスク #define PAD_INPUT_LEFT (0x00000002) // ←チェックマスク #define PAD_INPUT_RIGHT (0x00000004) // →チェックマスク #define PAD_INPUT_UP (0x00000008) // ↑チェックマスク #define PAD_INPUT_A (0x00000010) // Aボタンチェックマスク #define PAD_INPUT_B (0x00000020) // Bボタンチェックマスク #define PAD_INPUT_C (0x00000040) // Cボタンチェックマスク #define PAD_INPUT_X (0x00000080) // Xボタンチェックマスク #define PAD_INPUT_Y (0x00000100) // Yボタンチェックマスク #define PAD_INPUT_Z (0x00000200) // Zボタンチェックマスク #define PAD_INPUT_L (0x00000400) // Lボタンチェックマスク #define PAD_INPUT_R (0x00000800) // Rボタンチェックマスク #define PAD_INPUT_START (0x00001000) // STARTボタンチェックマスク #define PAD_INPUT_M (0x00002000) // Mボタンチェックマスク //20090405 #define KEY_INPUT_ESCAPE 0x0E #define KEY_INPUT_LEFT 0xCB #define KEY_INPUT_UP 0xC8 #define KEY_INPUT_RIGHT 0xCD #define KEY_INPUT_DOWN 0xD0 #define KEY_INPUT_LSHIFT 0x2A #define KEY_INPUT_LCONTROL 0x1D #define KEY_INPUT_Z 0x2C #define KEY_INPUT_X 0x2D //20090405 // パッド入力取得パラメータ #define DX_INPUT_KEY_PAD1 (0x1001) // キー入力とパッド1入力 #define DX_INPUT_PAD1 (0x0001) // パッド1入力 #define DX_INPUT_PAD2 (0x0002) // パッド2入力 #define DX_INPUT_PAD3 (0x0003) // パッド3入力 #define DX_INPUT_PAD4 (0x0004) // パッド4入力 #define DX_INPUT_PAD5 (0x0005) // パッド5入力 #define DX_INPUT_PAD6 (0x0006) // パッド6入力 #define DX_INPUT_PAD7 (0x0007) // パッド7入力 #define DX_INPUT_PAD8 (0x0008) // パッド8入力 #define DX_INPUT_KEY (0x1000) // キー入力
こんな感じで記述してください。
{{{ code c
#include <stdio.h>
int main()
{
puts("poe!\n");
return 0;
}
}}}
すると、こうなります。
#include <stdio.h>
int main()
{
puts("poe!\n");
return 0;
}