DXライブラリPortable v0.5.7 UTF8版 RPGテスト v0.02
こちらのソースコードは、全角の空白文字も使用しています。
たくさん勉強したい方は、このページを お気に入りに登録しておくといいかもです


main.c
  1. /*****************************************************************************
  2. * main.c DXライブラリPortable v0.5.7 UTF8版                  *
  3. *                   RPG TEST v0.02             *
  4. *                                       *
  5. *  このソースコードは猫山からのプレゼントウェアとします。BSDライセンス      *
  6. *                                      *
  7. *                 製作:猫山猫三郎猫宗 in 2012.01.08(SUN)  *
  8. *****************************************************************************/
  9. /*****************************************************************************
  10. * Q. BSDライセンスってなあに?                        *
  11. * A. PSPSDKのサンプルソースコードもBSDライセンス。商利用(同人ソフトとしての販売  *
  12. *  したい自作ゲームへの利用も可能)で、このソースコードを使用した場合、   *
  13. *  GPLライセンスみたいにソースコードを公開しなくても良い、というライセンスです    *
  14. *                                      *
  15. *****************************************************************************/
  16. /*****************************************************************************
  17. * 気を付けて欲しいこと                            *
  18. *  ファイル名やフォルダ名に、日本語文字を使うとNGですよ          *
  19. *                                      *
  20. * 理由                                    *
  21. * イントラフォントライブラリを使って日本語文字を表示させる際        *
  22. * システムソフトウェア6.00以降に対応させるためにUTF8コードの        *
  23. * 日本語文字列しか使用できないので、ソースコード自体をUTF8コード      *
  24. * でテキスト保存しています                         *
  25. * ゆえに、ファイル名やフォルダ名は半角英数文字で記入してください      *
  26. *                                      *
  27. *****************************************************************************/
  28. #include <dxlibp.h>
  29. #include <stdio.h>
  30. #include <string.h>
  31. //#include "mydef.h"
  32. /*****************************************************************************
  33. * define
  34. *****************************************************************************/
  35. //#define SCRBUF0 (char*)(0)
  36. #define SCREEN_WIDTH  480 // 横幅は 480ピクセル
  37. #define SCREEN_HEIGHT 272 // 縦幅は 272ピクセル
  38. #ifndef PSP_MODULE_KERNEL
  39. #define PSP_MODULE_KERNEL 0x1000
  40. #endif
  41. #ifndef PSP_MODULE_USER
  42. #define PSP_MODULE_USER 0
  43. #endif
  44. #define MP3_EXIST   1 // BGM.mp3 ファイルがある
  45. #define MP3_NOT_EXIST 0 // BGM.mp3 ファイルが無い
  46. #define MUKI_SHITA  0 // 下向き
  47. #define MUKI_HIDARI 1 // 左向き
  48. #define MUKI_MIGI  2 // 右向き
  49. #define MUKI_UE   3 // 上向き
  50. #define Hero_STOP  0 // 勇者 止まる
  51. #define Hero_MOVE  1 // 勇者 歩く
  52. #define XVI_COLOR_DARKGREEN  0xFF008000 // 深緑色
  53. #define XVI_COLOR_YELLOW   0xFF00FFFF // 黄色
  54. #define XVI_COLOR_LIGHTBLUE  0xFFE6D8AD // 水色
  55. #define BGM_FILE       "ms0:/MUSIC/RPG/BGM.mp3"    // BGM
  56. #define GRPH_FILE_NOWLOADING "ms0:/PICTURE/RPG/LOADING.png" // なう・ろーでぃんぐ画像
  57. #define GRPH_FILE_HERO    "ms0:/PICTURE/RPG/HERO.png"  // 勇者のスプライト画像
  58. #define GRPH_FILE_BG     "ms0:/PICTURE/RPG/GRASS.png"  // 背景の芝のスプライト画像
  59. /*****************************************************************************
  60. * groval
  61. *****************************************************************************/
  62. const char *pic_filename[]={
  63.   GRPH_FILE_BG,  // 背景(芝)のスプライトのファイル名
  64.   GRPH_FILE_HERO, // 勇者のスプライトのファイル名
  65.   "おわる"
  66. };
  67. int HANDLE_mp3; // BGM.mp3 のハンドル
  68. int flag_mp3;  // BGM.mp3 ファイルがあれば MP3_EXIST
  69. int HANDLE_Graph_Hero[4][3]; // 勇者の画像ハンドル(4方向×3パターン)
  70. int PIC_Walk_Step[4] = { 1,0,1,2 }; // 歩きのステップ番号に対するパターン絵の指定
  71. int HANDLE_Graph_BG; // 背景の画像ハンドル(とりあえず芝生)
  72. /*****************************************************************************
  73. * 使用するサブルーチンの定義(登録)
  74. *****************************************************************************/
  75. int main(void);
  76. void action(void);
  77. void game_title(void);
  78. int BeginCheck(void);
  79. void games(void);
  80. void games_finish(void);
  81. void Draw_haikei(void);
  82. void ScreenSettings(void);
  83. void mp3checker();
  84. int initton(void);
  85. void Display_NowLoading(void);
  86. int pic_load(void);
  87. int Is_ALL_pic_Exist(void);
  88. int Pic_Mapping(void);
  89. /*****************************************************************************
  90. * もじゅ〜る・いんふぉ / メインコードはユーザモード
  91. *****************************************************************************/
  92. PSP_MODULE_INFO("PSP_RPG", PSP_MODULE_USER, 0, 2);
  93. PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER | THREAD_ATTR_VFPU);
  94. PSP_HEAP_SIZE_KB(16*1024); // 新規追加
  95. PSP_MAIN_THREAD_STACK_SIZE_KB(512); // 新規追加
  96. /*****************************************************************************
  97. * main
  98. *****************************************************************************/
  99. int main(void)
  100. {
  101.   DxLib_Init();
  102.   if(initton() == 0)
  103.     action(); // 初期化成功(正常時)の時だけ action()関数を実行
  104.   DxLib_End();
  105.   return(0);
  106. }
  107. /*****************************************************************************
  108. * ゲームの準備サブルーチン
  109. *****************************************************************************/
  110. int initton(void)
  111. {
  112.   ScreenSettings();
  113.   // mp3音楽チェッカー
  114.   mp3checker();
  115.   // 画像データ読み込み
  116.   return( pic_load() );
  117. }
  118. /*****************************************************************************
  119. * グラフィック画面の設定などの関数
  120. *****************************************************************************/
  121. void ScreenSettings()
  122. {
  123.   SetDisplayFormat(DXP_FMT_8888);      // 画面のピクセルフォーマットを32Bit色モードに
  124.   SetWaitVSyncFlag(TRUE);          // 画面更新の際、垂直同期待ちをしてから行なう様に
  125.   SetDrawArea(0,0,480,272);         // 描画可能領域を全領域に設定
  126.   SetDrawMode(DX_DRAWMODE_NEAREST);     // 描画モードを高速なNEARESTにセットする
  127.   SetDrawBlendMode(DX_BLENDMODE_NOBLEND, 0); // 描画の際のブレンドモードを、標準モードに
  128.   SetDrawBright(255,255,255);        // 描画する色の輝度を最大に
  129.   SetGraphMode(480, 272, DXP_FMT_8888);   // フル画面サイズ & 32Bit色モード
  130.   ClearDrawScreen();             // 描画先のグラフィックスをクリアする
  131.   ChangeFontType(DX_FONTTYPE_NORMAL);    // エッジ無しノーマル文字にする(IntraFont)
  132. }
  133. /*****************************************************************************
  134. * アクション・サブルーチン
  135. *****************************************************************************/
  136. void action(void)
  137. {
  138.   if(BeginCheck() == -1) return; // タイトル画面表示&始めるのかな?
  139.   games(); // ゲームサブルーチン
  140.   games_finish(); // ゲーム終了サブルーチン
  141. }
  142. /*****************************************************************************
  143. * ゲームのタイトル画面を表示
  144. *****************************************************************************/
  145. void game_title(void)
  146. {
  147.   DrawBox(0,0,480,272,DXP_COLOR_BLUE,TRUE); // 青色画面
  148.   DrawFormatString(120, 40,XVI_COLOR_YELLOW,"『RPG TEST v0.02』");
  149.   if(flag_mp3 == MP3_NOT_EXIST)
  150.     DrawFormatString(80, 80,DXP_COLOR_GRAY,"音楽は鳴りません");
  151.   else
  152.     DrawFormatString(80, 80,DXP_COLOR_WHITE,"音楽が鳴ります(ループします)");
  153.   DrawFormatString(80, 120,DXP_COLOR_WHITE,"Lトリガー押しで終了");
  154.   DrawFormatString(80, 180,XVI_COLOR_LIGHTBLUE,"○ボタン押しで始まります");
  155.   ScreenFlip();
  156. }
  157. /*****************************************************************************
  158. * ゲームを開始するのか確認する
  159. *****************************************************************************/
  160. int BeginCheck(void)
  161. {
  162.   do {
  163.     game_title(); // ゲームのタイトル画面表示サブルーチン
  164.     ProcessMessage(); // パッド読み取り本体
  165.     if((GetInputState()) == DXP_INPUT_LTRIGGER) return(-1); // Lトリガー押されたら終了
  166.   }while((GetInputState()) != DXP_INPUT_CIRCLE); // ○ボタン押しでゲーム開始
  167.   return(0);
  168. }
  169. /*****************************************************************************
  170. * ゲームのメイン処理です
  171. *****************************************************************************/
  172. void games(void)
  173. {
  174.   // 勇者の向き( MUKI_***** )
  175.   int Hero_MUKI = MUKI_SHITA; // 最初は下向き
  176.   // 勇者の歩きステップ具合( 0〜3 )
  177.   int Hero_Step = 0; // 足踏みのステップ(最初は0で)
  178.   // 勇者が歩くかどうかのフラグ
  179.   int Hero_MOVE_flag = Hero_STOP; // 最初は止まっている
  180.   // BGM.mp3ファイルあれば再生させる
  181.   if(flag_mp3 == MP3_EXIST)
  182.     PlaySoundMem( HANDLE_mp3, DX_PLAYTYPE_LOOP, TRUE);
  183.   // ここからループします ↓↓
  184.   while(1) {
  185.     ProcessMessage(); // パッド読み取り本体
  186.     switch(GetInputState()) {
  187.       case DXP_INPUT_LTRIGGER: { // Lトリガー押されたら
  188.         if(flag_mp3 == MP3_EXIST) { // mp3再生終了の為の後片付け
  189.           StopSoundMem( HANDLE_mp3 );
  190.           DeleteSoundMem( HANDLE_mp3 );
  191.         }
  192.         return; // Lトリガーで抜ける事になる
  193.       }
  194.       case DXP_INPUT_UP: { // ↑レバー入れたら
  195.         if(Hero_MOVE_flag == Hero_STOP) {
  196.           Hero_MUKI = MUKI_UE;
  197.           Hero_MOVE_flag = Hero_MOVE;
  198.         }
  199.         break;
  200.       }
  201.       case DXP_INPUT_DOWN: { // ↓レバー入れたら
  202.         if(Hero_MOVE_flag == Hero_STOP) {
  203.           Hero_MUKI = MUKI_SHITA;
  204.           Hero_MOVE_flag = Hero_MOVE;
  205.         }
  206.         break;
  207.       }
  208.       case DXP_INPUT_LEFT: { // ←レバー入れたら
  209.         if(Hero_MOVE_flag == Hero_STOP) {
  210.           Hero_MUKI = MUKI_HIDARI;
  211.           Hero_MOVE_flag = Hero_MOVE;
  212.         }
  213.         break;
  214.       }
  215.       case DXP_INPUT_RIGHT: { // →レバー入れたら
  216.         if(Hero_MOVE_flag == Hero_STOP) {
  217.           Hero_MUKI = MUKI_MIGI;
  218.           Hero_MOVE_flag = Hero_MOVE;
  219.         }
  220.         break;
  221.       }
  222.     }
  223.     ++Hero_Step;
  224.     Hero_Step = (Hero_Step & 63); // Hero_Step == 0〜63 / 足踏みで絵が変わるよ
  225.     if(Hero_Step == 0)
  226.       Hero_MOVE_flag = Hero_STOP;
  227.     // 背景を描画
  228.     Draw_haikei();
  229.     // 勇者を表示 足踏みは、16/60秒単位で行なう
  230.     DrawGraph( 224,104,HANDLE_Graph_Hero[Hero_MUKI][ PIC_Walk_Step[(Hero_Step>>4)] ],TRUE );
  231.     // 音声ファイルが無い場合のメッセージ
  232.     if(flag_mp3 != MP3_EXIST)
  233.       DrawFormatString(240, 190,DXP_COLOR_BLUE,"音声ファイル無いよ〜");
  234.     DrawFormatString(240, 220,DXP_COLOR_WHITE,"Lトリガー押しで終了");
  235.     ScreenFlip(); // 垂直同期信号を待つ(1/60秒)1回目
  236.   }
  237. }
  238. /*****************************************************************************
  239. * ゲーム終了サブルーチン
  240. *
  241. * 使用した画像ハンドルと音声ハンドルを削除します
  242. *
  243. *****************************************************************************/
  244. void games_finish(void)
  245. {
  246.   int x,y; // インデックス
  247.   // 音楽ファイルがある場合のみ、カッコ内を実行
  248.   if(flag_mp3 == MP3_EXIST) {
  249.     // 音楽再生を終え、音楽ハンドルの再生を停止します
  250.     StopSoundMem( HANDLE_mp3 );
  251.     // 終わったので、サウンドハンドルを削除します
  252.     DeleteSoundMem( HANDLE_mp3 );
  253.   }
  254.   // 画像ハンドルを全部削除します
  255.   DeleteGraph(HANDLE_Graph_BG); // 背景画像
  256.   for(y=0; y<4; ++y) {
  257.     for(x=0; x<3; ++x) {
  258.       DeleteGraph(HANDLE_Graph_Hero[y][x]); // 勇者画像
  259.     }
  260.   }
  261. }
  262. /*****************************************************************************
  263. * ゲームの背景画面を描画する
  264. *****************************************************************************/
  265. void Draw_haikei()
  266. {
  267.   unsigned int x,y;
  268.   for(x=0; x<12; x++) {
  269.     for(y=0; y<8; y++) {
  270.       DrawGraph( (x<<5)+48,(y<<5)+8,HANDLE_Graph_BG,FALSE ); // 芝生を表示
  271.     }
  272.   }
  273.   DrawBox( 0, 0, 48,272,DXP_COLOR_BLACK,TRUE); // 左側の黒い帯
  274.   DrawBox(432, 0,480,272,DXP_COLOR_BLACK,TRUE); // 右側の黒い帯
  275.   DrawBox( 48, 0,432, 8,DXP_COLOR_BLACK,TRUE); // 上側の黒い帯
  276.   DrawBox( 48,264,432,272,DXP_COLOR_BLACK,TRUE); // 下側の黒い帯
  277. }
  278. /*****************************************************************************
  279. * mp3ファイル・チェッカー関数
  280. *
  281. * フラグ変化:音声ファイルがある場合 flag_mp3 ← MP3_EXIST
  282. * 音声ファイルがない場合 flag_mp3 ← MP3_NOT_EXIST
  283. *****************************************************************************/
  284. void mp3checker()
  285. {
  286.   // まずは 全てのサウンドハンドルを削除します
  287.   InitSoundMem();
  288.   // ストリーミング再生モードに設定します(チョイ読みしながら再生)
  289.   SetCreateSoundDataType(DX_SOUNDDATATYPE_FILE);
  290.   // 再生させる音声ファイルを指定します(mp3ファイルを用意してね)
  291.   if((HANDLE_mp3 = LoadSoundMem(BGM_FILE)) == -1) // もしエラーが発生したら
  292.     flag_mp3 = MP3_NOT_EXIST; // ないよ
  293.   else
  294.     flag_mp3 = MP3_EXIST; // あるよ
  295.   // パンを中央に設定します
  296.   if(flag_mp3 == MP3_EXIST)
  297.     SetPanSoundMem( 0, HANDLE_mp3);
  298. }
  299. /*****************************************************************************
  300. * 画像ファイル・ローダー関数
  301. *
  302. * 返り値: 0 == 成功
  303. * -1 == 失敗
  304. *****************************************************************************/
  305. int pic_load(void)
  306. {
  307.   // なう・ろーでぃんぐを表示
  308.   Display_NowLoading();
  309.   // 画像ファイルがあるのか確認する
  310.   if( Is_ALL_pic_Exist() == -1 ) return(-1);
  311.   // 画像を取り込む
  312.   if( Pic_Mapping() == -1 ) return(-1);
  313.   DrawBox(0,0,480,272,DXP_COLOR_BLACK,TRUE); // 画面を真っ黒にする
  314.   ScreenFlip(); // 画面表示
  315.   Sleep(800); // 800ミリ秒だけ停止(黒い画面でチョイ待ち)
  316.   return(0); // 正常終了
  317. }
  318. /*****************************************************************************
  319. * なう・ろーでぃんぐを表示
  320. * なう・ろーでぃんぐ画像が無くても遊べるようにしておくべき
  321. *****************************************************************************/
  322. void Display_NowLoading(void)
  323. {
  324.   // なう・ろーでぃんぐ画像を表示
  325.   if((LoadGraphScreen(0,0,GRPH_FILE_NOWLOADING, FALSE)) == -1) {
  326.   // ↓↓ なう・ろーでぃんぐ画像が無いなら文字で
  327.     DrawBox(0,0,480,272,XVI_COLOR_DARKGREEN,TRUE);
  328.     DrawFormatString(150, 120,DXP_COLOR_WHITE,"なう・ろーでぃんぐ!!");
  329.   }
  330.   ScreenFlip();
  331. }
  332. /*****************************************************************************
  333. * 画像ファイルがあるのか確認するサブルーチン
  334. *
  335. * ヒント fopenで、ファイルがあるか調べている
  336. *
  337. * 返り値: 0 == 画像ファイル全部ある
  338. *     -1 == 画像ファイル足りない
  339. *****************************************************************************/
  340. int Is_ALL_pic_Exist(void)
  341. {
  342.   FILE *fp;
  343.   int index; // インデックス
  344.   index=0; // スプライト番号=0 から
  345.   while(strcmp(pic_filename[index],(const char *)"おわる") != 0) {
  346.     fp=fopen(pic_filename[index],"r");
  347.     if(fp==NULL) {
  348.       fclose(fp);
  349.       DrawBox(0,0,480,272,DXP_COLOR_RED,TRUE); // 赤色画面
  350.       DrawFormatString(0, 90,DXP_COLOR_WHITE,"ファイル %s が無いよ",pic_filename[index]);
  351.       DrawFormatString(0,140,DXP_COLOR_WHITE,"終了します。何か押して!");
  352.       ScreenFlip();
  353.       do { // 何か押されるまで待つ do 〜 while
  354.         ProcessMessage();
  355.       }while(CheckHitKeyAll() == 0);
  356.       return(-1); // 終了(画像ファイル足りないエラー)
  357.     }
  358.     fclose(fp);
  359.     index++;
  360.   }
  361.   return(0); // 終了(おっけー)
  362. }
  363. /*****************************************************************************
  364. * 画像を取り込むサブルーチン
  365. *
  366. * ヒント fopenで、ファイルがあるか調べている
  367. *
  368. * 返り値: 0 == 画像読み込み成功
  369. *     -1 == 画像読み込み失敗
  370. *****************************************************************************/
  371. int Pic_Mapping(void)
  372. {
  373.   // 画像ファイル全部読み込み
  374.   HANDLE_Graph_BG = LoadGraph(GRPH_FILE_BG);
  375.   if(LoadDivGraph( GRPH_FILE_HERO ,12,3,4,32,48,&HANDLE_Graph_Hero[0][0]) == -1) {
  376.     // 画像データの読み込みがおかしい場合の処理
  377.     DrawBox(0,0,480,272,DXP_COLOR_RED,TRUE); // 画面を真っ赤にする
  378.     DrawFormatString(10,100,DXP_COLOR_WHITE,"%sの読み込みに失敗しました",GRPH_FILE_HERO);
  379.     DrawFormatString(10,180,DXP_COLOR_WHITE,"終了します。何かキーを押して下さい。");
  380.     ScreenFlip();
  381.     // WaitKey(); // キーの入力待ち
  382.     do {
  383.       ProcessMessage();
  384.     }while(CheckHitKeyAll() == 0);
  385.     return(-1); // エラーで抜けます
  386.   }
  387.   return(0); // 終了(おっけー)
  388. }



Makefile
  1. TARGET = PSP_RPG
  2. OBJS = main.o
  3. PSPSDK=$(shell psp-config --pspsdk-path)
  4. INCS = $(PSPSDK)/include $(PSPSDK)/DXP_v0.5.7/include
  5. INCDIR = $(INCS)
  6. CFLAGS = -Wall -G0 -O3 -fomit-frame-pointer -mgp32 -mlong32
  7. CXXFLAGS = $(CFLAGS) -fno-exceptions -fno-rtti
  8. ASFLAGS = $(CFLAGS)
  9. LIBDIR = $(PSPSDK)/DXP_v0.5.7/lib
  10. LDFLAGS =
  11. LIBS = $(PSPSDK)/DXP_v0.5.7/lib/dxlibp_UTF8.a
  12. LIBS += -lpspgu -lz -lm -lpsprtc -lpspaudio -lpspaudiocodec\
  13. -lpsputility -lpspvalloc -lpsppower
  14. BUILD_PRX = 1
  15. EXTRA_TARGETS = EBOOT.PBP
  16. PSP_EBOOT_TITLE = PSP_RPG TEST v0.02
  17. PSP_EBOOT_ICON = ICON0.png
  18. PSP_EBOOT_ICON1 = NULL
  19. PSP_EBOOT_UNKPNG= NULL
  20. PSP_EBOOT_PIC1 = NULL
  21. PSP_EBOOT_SND0 = NULL
  22. PSPSDK=$(shell psp-config --pspsdk-path)
  23. include $(PSPSDK)/lib/build.mak
  24. # 以下、任意で(開発しているソースに依存)
  25. main.o : main.c