LoadDivGraphとそれに関連した関数です。 安全策はとってません;

  1. //指定したテクスチャの任意座標から色情報を取得
  2. //32bitアルファ有りフォーマット固定
  3. u32 TextureGetColor(int TextureNo,int Sx,int Sy)
  4. {
  5. u32* TEXRAM = texarray[TextureNo].pmemory;
  6. return TEXRAM[texarray[TextureNo].width * Sy + Sx];
  7. }
  8. //指定したテクスチャの任意座標へ指定した色情報をセット
  9. //32bitアルファ有りフォーマット固定
  10. void TextureSetColor(int TextureNo,int Sx,int Sy,u32 color)
  11. {
  12. u32* TEXRAM = texarray[TextureNo].pmemory;
  13. TEXRAM[texarray[TextureNo].width * Sy + Sx] = color;
  14. return;
  15. }
  16. //範囲コピー用
  17. int TextureCopy(int TextureNo1,int TextureNo2,int No1Sx,int No1Sy,int No2Sx,int No2Sy, int width, int height)
  18. {
  19. //if (texarray[TextureNo1].flags != TEXTUREFLAGS_XXXX ) return -1;
  20. //if (texarray[TextureNo2].flags != TEXTUREFLAGS_XXXX ) return -2;
  21. int i;
  22. int j;
  23. for(i=0;i<height;i++) {
  24. for(j=0;j<width;j++) {
  25. TextureSetColor(TextureNo1,No1Sx + j,No1Sy + i,TextureGetColor(TextureNo2,No2Sx + j,No2Sy + i));
  26. }
  27. }
  28. return 0;
  29. }
  30. int LoadDivGraph(const char *FileName , int AllNum , int XNum , int YNum , int XSize , int YSize , int *HandleBuf )
  31. {
  32. int res = -1;
  33. if(res == -1)res = LoadPngImage(FileName);
  34. if(res == -1)res = LoadJpegImage(FileName);
  35. //PSPのメモリの少なさから考えると先にDiv後の領域(XSizexYSizexカラーフォーマットxAllNum)
  36. //を確保したほうが歯抜けになりにくい
  37. //でもとりあえずは読み込まないと画像のフォーマットがわからない
  38. //妥協案としては
  39. //(速度が速い方)
  40. //LoadPngImageもしくはLoadJpegImageロードしたあと
  41. //Div後の領域を確保してDivした後元の画像を破棄
  42. //(速度が遅い方)
  43. //LoadPngImageもしくはLoadJpegImageロードしたあと
  44. //カラーフォーマットだけ取得した後一旦画像を破棄
  45. //Div後の領域を確保して再度画像を読み込みdivしてから破棄
  46. if(res != -1)
  47. {
  48. //int Wpsm = texarray[res].psm;
  49. int i;
  50. int j;
  51. //for(i=0;i<AllNum;i++)
  52. //{
  53. // HandleBuf[i] = MakeGraph(XSize,YSize,GU_PSM_8888);
  54. //この関数でべき乗に確保してるようなので縦横サイズをそのまま渡してる
  55. //}
  56. //安全策はとりあえず省略(メモリ取れなかったら・・・
  57. //まあPSP上でPC用素材をそのまま使うというのがそもそもだし
  58. int k;
  59. int wres;
  60. for(i=0;i<YNum;i++)
  61. {
  62. for(j=0;j<XNum;j++)
  63. {
  64. k = i*XNum + j;
  65. wres = MakeGraph(XSize,YSize,GU_PSM_8888);
  66. TextureCopy(wres,res,0,0,j*XSize,i*YSize,XSize,YSize);
  67. if(gusettings.flags[0] & GPUSETTINGFLAGS_0_CREATESWIZZLEDGRAPH)
  68. SwizzleGraph(wres);
  69. if(gusettings.flags[0] & GPUSETTINGFLAGS_0_CREATEVRAMGRAPH)
  70. MoveGraphToVRAM(wres);
  71. texarray[wres].flags |= TEXTUREFLAGS_RELOAD;
  72. HandleBuf[k] = wres;
  73. }
  74. }
  75. DeleteGraph(res);
  76. }
  77. if (res != -1) res = 0;
  78. return res;
  79. }


dxpinput.c関連の追加コードです dxpinput.c本体 DXライブラリ本家がマイクロソフトサイドワインダー ゲームパッドに 合わせたボタンを返すようなので同じ仕様に配置してみました。 なお、PSPにはマイクロソフトサイドワインダー ゲームパッドで 言うところのCとZのボタンがありませんのでコメントにしてあります

ボタンイメージ図

  1. int GetJoypadInputState( int InputType )
  2. {
  3. int ret = 0;
  4. if(CtrlData.Buttons & PSP_CTRL_UP) ret |= PAD_INPUT_UP;
  5. if(CtrlData.Buttons & PSP_CTRL_DOWN) ret |= PAD_INPUT_DOWN;
  6. if(CtrlData.Buttons & PSP_CTRL_LEFT) ret |= PAD_INPUT_LEFT;
  7. if(CtrlData.Buttons & PSP_CTRL_RIGHT) ret |= PAD_INPUT_RIGHT;
  8. if(CtrlData.Buttons & PSP_CTRL_CROSS) ret |= PAD_INPUT_A;
  9. if(CtrlData.Buttons & PSP_CTRL_CIRCLE) ret |= PAD_INPUT_B;
  10. //if(CtrlData.Buttons & PSP_CTRL_) ret |= PAD_INPUT_C;
  11. if(CtrlData.Buttons & PSP_CTRL_SQUARE) ret |= PAD_INPUT_X;
  12. if(CtrlData.Buttons & PSP_CTRL_TRIANGLE) ret |= PAD_INPUT_Y;
  13. //if(CtrlData.Buttons & PSP_CTRL_) ret |= PAD_INPUT_Z;
  14. if(CtrlData.Buttons & PSP_CTRL_LTRIGGER) ret |= PAD_INPUT_L;
  15. if(CtrlData.Buttons & PSP_CTRL_RTRIGGER) ret |= PAD_INPUT_R;
  16. if(CtrlData.Buttons & PSP_CTRL_START) ret |= PAD_INPUT_START;
  17. if(CtrlData.Buttons & PSP_CTRL_SELECT) ret |= PAD_INPUT_M;
  18. return ret;
  19. }

とりあえずダミー実装 DXライブラリを使ったPCゲームの多くはパッド以外にキーボードからの入力チェックをしている 可能性がありすんなり移植できるように実装しました。 PSPにはキーボードがありませんので当関数を呼んでもキーが押されていない(0x00)を返すだけです。

  1. int GetHitKeyStateAll( char *KeyStateBuf )
  2. {
  3. memset(KeyStateBuf,0x00,256);
  4. return 0;
  5. }

あとdxlibp.hに上記関数のプロトタイプ宣言と下記defineを追加してください

  1. //20090405
  2. //DXライブラリ本家よりコピー
  3. #define PAD_INPUT_DOWN (0x00000001) // ↓チェックマスク
  4. #define PAD_INPUT_LEFT (0x00000002) // ←チェックマスク
  5. #define PAD_INPUT_RIGHT (0x00000004) // →チェックマスク
  6. #define PAD_INPUT_UP (0x00000008) // ↑チェックマスク
  7. #define PAD_INPUT_A (0x00000010) // Aボタンチェックマスク
  8. #define PAD_INPUT_B (0x00000020) // Bボタンチェックマスク
  9. #define PAD_INPUT_C (0x00000040) // Cボタンチェックマスク
  10. #define PAD_INPUT_X (0x00000080) // Xボタンチェックマスク
  11. #define PAD_INPUT_Y (0x00000100) // Yボタンチェックマスク
  12. #define PAD_INPUT_Z (0x00000200) // Zボタンチェックマスク
  13. #define PAD_INPUT_L (0x00000400) // Lボタンチェックマスク
  14. #define PAD_INPUT_R (0x00000800) // Rボタンチェックマスク
  15. #define PAD_INPUT_START (0x00001000) // STARTボタンチェックマスク
  16. #define PAD_INPUT_M (0x00002000) // Mボタンチェックマスク
  17. //20090405
  18. #define KEY_INPUT_ESCAPE 0x0E
  19. #define KEY_INPUT_LEFT 0xCB
  20. #define KEY_INPUT_UP 0xC8
  21. #define KEY_INPUT_RIGHT 0xCD
  22. #define KEY_INPUT_DOWN 0xD0
  23. #define KEY_INPUT_LSHIFT 0x2A
  24. #define KEY_INPUT_LCONTROL 0x1D
  25. #define KEY_INPUT_Z 0x2C
  26. #define KEY_INPUT_X 0x2D
  27. //20090405
  28. // パッド入力取得パラメータ
  29. #define DX_INPUT_KEY_PAD1 (0x1001) // キー入力とパッド1入力
  30. #define DX_INPUT_PAD1 (0x0001) // パッド1入力
  31. #define DX_INPUT_PAD2 (0x0002) // パッド2入力
  32. #define DX_INPUT_PAD3 (0x0003) // パッド3入力
  33. #define DX_INPUT_PAD4 (0x0004) // パッド4入力
  34. #define DX_INPUT_PAD5 (0x0005) // パッド5入力
  35. #define DX_INPUT_PAD6 (0x0006) // パッド6入力
  36. #define DX_INPUT_PAD7 (0x0007) // パッド7入力
  37. #define DX_INPUT_PAD8 (0x0008) // パッド8入力
  38. #define DX_INPUT_KEY (0x1000) // キー入力


書き方

こんな感じで記述してください。

 {{{ code c
 #include <stdio.h>
 int main()
 {
   puts("poe!\n");
   return 0;
 }
 }}}
すると、こうなります。
  1. #include <stdio.h>
  2. int main()
  3. {
  4. puts("poe!\n");
  5. return 0;
  6. }