2009年サンプルゲーム

出典: ソフメWiki

  1. //ゲーム制作講座の最後に全体に見せたサンプルゲームのソース・コードです
  2. //講座で話した基本部分(移動・攻撃・判定等)は全て含まれています。
  3. //その他ダメージの表示やHPゲージの表示等の処理を行っています。
  4. //ダメージは時間の経過とともに上がるようになっており、時間とともに難易度が上がります。
  5. #include"DxLib.h"
  6.  
  7. #define STATUS_X 200  //座標やHP表示文字列のx座標
  8. #define MOVE_DIST 3  //通常移動速度
  9. #define DASH_DIST 6		//高速移動速度
  10. #define LOGO_MODE 0
  11. #define TITLE_MODE 1
  12. #define GAME_MODE 2
  13. #define OWATA_MODE 3
  14. #define PLAYER_R 12		//プレイヤーの当たり判定
  15. #define PLAYER_HP_MAX 240//最大HP
  16. #define ENEMY_MAX 32   //画面上の敵の最大数
  17. #define ENEMY_INT 20 //敵の出現間隔
  18. #define ENEMY_R 16	//敵の当たり判定
  19. #define SHOT_MAX 5  //弾の最大数
  20. #define SHOT_SPEED 6    //弾の速度
  21. #define SHOT_R 4	//弾の当たり判定
  22. #define DAMAGE_MAX 32//ダメージ表示の最大数
  23. #define DAMAGE_PATTERN_D 0//ダメージパターン
  24. #define DAMAGE_PATTERN_C 1//回復パターン
  25. #define ITEM_INT 1000	//アイテムの出現間隔(若干鬼畜)
  26. #define ITEM_MAX 8	//メシの最大数
  27.  
  28.  
  29. typedef struct PLAYER
  30. {
  31.         int x,y;        //x,y座標
  32.         int hp;         //ヒットポイント
  33. 	int r;			//当たり判定
  34. 	int count;		//敵の倒した数
  35.         int graph,graph2,graph3;      //画像,吹き出し二つ
  36.         int speed;      //移動速度
  37.         bool z_flag;    //zキーのフラグ
  38. } Player;
  39.  
  40. typedef struct SHOT //弾の構造体
  41. {
  42.         int x , y; //x,y座標
  43. 	int r;		//当たり判定
  44.         bool flag; //弾が画面上に存在するか
  45.         int graph; //画像
  46. } Shot;
  47.  
  48.  
  49. typedef struct ENEMY
  50. {
  51.         int x,y;        //x,y座標
  52. 	int vx,vy;		//加速度
  53.         bool flag;       //生きているか否か
  54. 	int r;			//当たり判定
  55.         int graph;      //画像
  56. } Enemy;
  57. typedef struct ITEM
  58. {
  59.         int x,y;        //x,y座標
  60. 	int vx,vy;		//加速度
  61.         bool flag;       //フラグ
  62. 	int r;			//当たり判定
  63.         int graph;      //画像
  64. } Item;
  65. typedef struct DAMAGE
  66. {
  67. 	int pattern;	//種類
  68. 	int num;		//数値が入る
  69.         int x,y;        //x,y座標
  70. 	int vx,vy;		//加速度
  71.         bool flag;       //フラグが立っているか否か
  72.         int count;      //表示制限
  73. } Damage;
  74.  
  75. void Init(Player *player,Enemy *enemy,Shot *p_shot,Damage *damage,Item *item);
  76. int Logo();
  77. int title(Player *player);
  78. int gameover(Player *player);
  79. void Move(Player *player);
  80. void PShotMove(Player *player,Shot *p_shot);
  81. void EMove(Enemy *enemy);
  82. void IMove(Item *item);
  83. void Collision(Player *player,Enemy *enemy,Shot *p_shot,Damage *damage,Item *item);
  84. int Damage_enter(int x,int y,Damage *damage,int pattern);
  85. void Draw(Player *player,Enemy *enemy,Shot *p_shot,Damage *damage,Item *item);
  86.  
  87. int count;      //開始から何フレーム経過したか
  88. int logo_g; //ロゴの画像
  89. int title_g; //タイトルの画像
  90. int gameover_g;	//ゲームオーバーの画像
  91. int back;		//背景
  92. int se[8];	//効果音
  93.  
  94.  
  95.  
  96. int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance , LPSTR lmCmdLine , int nShowCmd)
  97. {
  98.  
  99.         SetMainWindowText("さんぷるですよ"); //アプリケーションの名前
  100.         ChangeWindowMode(TRUE); //起動モード設定
  101.  
  102.         if(DxLib_Init() == -1) return -1;
  103.  
  104.         SetDrawScreen(DX_SCREEN_BACK);  //画像描画の画面(表or裏)の設定
  105.         SetTransColor(0,255,0);
  106.  
  107.  
  108.         Player player;
  109.         Enemy enemy[ENEMY_MAX];
  110. 	Item item[ITEM_MAX];
  111. 	Shot shot[SHOT_MAX];
  112. 	Damage damage[DAMAGE_MAX];
  113.  
  114.         Init(&player,enemy,shot,damage,item);
  115.  
  116. 	//タイトル・ロゴ画像読み込み
  117.         title_g = LoadGraph("title.png");
  118.         logo_g = LoadGraph("sf_title.png");
  119. 	gameover_g = LoadGraph("gameover.png");
  120. 	back = LoadGraph("back.png");
  121. 	se[0] = LoadSoundMem("hit79.wav");
  122. 	se[1] = LoadSoundMem("hit80.wav");
  123. 	se[2] = LoadSoundMem("hit81.wav");
  124. 	se[3] = LoadSoundMem("hit_p02_b.wav");
  125. 	se[4] = LoadSoundMem("shoot21.wav");
  126. 	se[5] = LoadSoundMem("power22.wav");
  127. 	se[6] = LoadSoundMem("bell12.wav");
  128.  
  129.  
  130.  
  131. 	int mode = LOGO_MODE;
  132. 	while(ProcessMessage() == 0)
  133.         {
  134.             count++;
  135.             switch(mode){
  136.                 case LOGO_MODE: //ロゴの表示パート
  137.                     mode = Logo(); //logoの戻り値がmode
  138.                     break;
  139.                 case TITLE_MODE: //タイトル画面
  140.                     mode = title(&player); //titleの戻り値がmode
  141.                     break;
  142.                 case GAME_MODE: //ゲーム本編
  143.                     Move(&player); //プレイヤーの移動
  144. 		    PShotMove(&player,shot);//プレイヤーの弾の制御
  145. 		    EMove(enemy);  //敵キャラの出現・移動
  146. 		    IMove(item);	//アイテムの出現・移動
  147. 		    Collision(&player,enemy,shot,damage,item);//当たり判定
  148. 		    //画像描画処理をここに書く
  149. 		    Draw(&player,enemy,shot,damage,item);
  150. 		    //ゲームオーバー条件
  151. 		    if(player.hp<=0)
  152. 		    mode = OWATA_MODE;
  153.                     break;
  154. 		case OWATA_MODE: //タイトル画面
  155. 		    if((mode = gameover(&player))==GAME_MODE){//gameoverの戻り値がmode
  156. 		    Init(&player,enemy,shot,damage,item);//もう一度初期化
  157. 		    player.z_flag = true;	//暴発防止
  158. 				}
  159.                     break;
  160.                 default:
  161.                     return -1;
  162.             }
  163.             ScreenFlip();
  164.             ClearDrawScreen();
  165. 	}
  166.         DxLib_End();
  167.         return 0;
  168. }
  169.  
  170. void Init(Player *player,Enemy *enemy,Shot *p_shot,Damage *damage,Item *item)
  171. {
  172. 	player->x = 160,player->y = 300,player->hp = PLAYER_HP_MAX,player->speed = MOVE_DIST,player->count = 0;
  173.         player->z_flag = false;
  174. 	player->r = PLAYER_R;//当たり判定
  175.         player->graph = LoadGraph("player.png");
  176. 	player->graph2 = LoadGraph("itai.png");
  177. 	player->graph3 = LoadGraph("umai.png");
  178.         for(int i=0;i<ENEMY_MAX;i++){
  179.                 enemy[i].flag = false; //フラグを初期化
  180.                 enemy[i].graph = LoadGraph("enemy.png"); //画像読み込み
  181.         }
  182. 		for(int i=0;i<ITEM_MAX;i++){
  183.                 item[i].flag = false; //フラグを初期化
  184.                 item[i].graph = LoadGraph("potion.png"); //画像読み込み
  185.         }
  186. 		for(int i=0;i<SHOT_MAX;i++){
  187.                 p_shot[i].flag = false; //弾のフラグを初期化
  188.                 p_shot[i].graph = LoadGraph("shot.png"); //画像読み込み
  189.         }
  190. 		for(int i=0;i<DAMAGE_MAX;i++){
  191.                 damage[i].flag = false; //フラグを初期化
  192.         }
  193.  
  194. }
  195.  
  196. int Logo()
  197. {
  198.         //フェードインの処理
  199.         if(count < 128) SetDrawBlendMode(DX_BLENDMODE_ALPHA , count * 2);
  200.         //少しの間そのまま表示する
  201.         else if(count < 256) SetDrawBlendMode(DX_BLENDMODE_NOBLEND , 0);
  202.         //フェードアウトさせる
  203.         else if(count < 383) SetDrawBlendMode(DX_BLENDMODE_ALPHA , 765 - count * 2);
  204.         else  //フェードアウトしたらタイトルへ移動
  205.         {
  206.                 //特殊描画をせずに描画
  207.                 SetDrawBlendMode(DX_BLENDMODE_NOBLEND , 0);
  208.                 return TITLE_MODE; //タイトルへ
  209.         }
  210.         DrawGraph(0,0,logo_g,TRUE);//タイトルに移動するまではロゴ描画
  211.         return LOGO_MODE; //モードはロゴのままにする
  212. }
  213.  
  214. int title(Player *player)
  215. {
  216.         //Zキーが押されたらゲームを開始
  217. 	if(CheckHitKey(KEY_INPUT_Z) == 1){
  218. 		count = 0;//ここでカウントを0に戻す
  219. 		player->z_flag = TRUE;//ここでフラグを立たせてショットの暴発防止
  220. 		return GAME_MODE;
  221. 	}
  222.         DrawGraph(0,0,title_g,TRUE);
  223. 	DrawString(280,150,"zキーで開始",GetColor(255,255,+GetRand(255)));
  224.         //押されていなければタイトルのまま
  225. 	return TITLE_MODE;
  226. }
  227.  
  228. int gameover(Player *player)
  229. {
  230.         //Zキーが押されたらゲームを開始
  231. 	if(CheckHitKey(KEY_INPUT_Z) == 1 && count>=60){	//暴発防止
  232. 		count = 0;//ここでカウントを0に戻す
  233. 		//player->z_flag = TRUE;//ここでフラグを立たせてショットの暴発防止
  234. 		return GAME_MODE;
  235. 	}
  236.         DrawGraph(0,0,gameover_g,TRUE);
  237. 	DrawFormatString(250,220,GetColor(255,0,255),"敵を倒した数:%d",player->count);
  238. 	DrawString(280,240,"zキーで復活",GetColor(255,255,128+GetRand(127)));
  239.         //押されていなければゲームオーバーのまま
  240. 	return OWATA_MODE;
  241. }
  242.  
  243. void EMove(Enemy *enemy)
  244. {
  245.         //敵の出現
  246.         if(count % ENEMY_INT == 0){ //現在のcountが敵の出現間隔で割り切れるなら
  247.                 for(int i=0;i<ENEMY_MAX;i++){ //すべての敵をループ
  248.                         if(!enemy[i].flag){             //未出現の敵ならば
  249.                                 enemy[i].flag = true;   //フラグを立てる
  250.                                 enemy[i].x = 650;       //x座標は画面の少し右
  251.                                 enemy[i].y = GetRand(440) + 20; //0~440 + 20をy座標に
  252. 				enemy[i].vx = GetRand(3+(count/600))+1;//x軸の加速度1~4(10秒ごとにランダム+1)
  253. 				if((count/600) >= 10) enemy[i].vx = GetRand(13)+1;//x軸の加速度1~14
  254. 				enemy[i].vy = GetRand(2)-1;//y軸の加速度-1~1
  255. 				enemy[i].r = ENEMY_R;//敵の当たり判定
  256. 				if(count % 600 !=0)//10秒区切り以外では1匹出現で終了。10秒ごとにMAXまで出現わらわら
  257. 					break;  //キャラ出現させたら終了
  258.                         }
  259.                 }
  260.         }
  261.         //敵の移動
  262.         for(int i=0;i<ENEMY_MAX;i++){
  263.                 if(enemy[i].flag){              //出現している敵ならば移動
  264. 			enemy[i].x -= enemy[i].vx;	//敵の加速度分値を変化
  265. 			enemy[i].y -= enemy[i].vy;
  266.                         if(enemy[i].x < -10 || enemy[i].y<-10 || enemy[i].y>490){   //画面外に出たら消去
  267.                                 enemy[i].flag = false;
  268.                         }
  269.                 }
  270.         }
  271. }
  272.  
  273. void IMove(Item *item)	//アイテム
  274. {
  275.         //アイテムの出現
  276.         if(count % ITEM_INT == 0){ //現在のcountがアイテムの出現間隔で割り切れるなら
  277.                 for(int i=0;i<ENEMY_MAX;i++){ //すべてのアイテムをループ
  278.                         if(!item[i].flag){             //未出現の敵ならば
  279.                                 item[i].flag = true;   //フラグを立てる
  280.                                 item[i].x = 650;       //x座標は画面の少し右
  281.                                 item[i].y = GetRand(440) + 20; //0~440 + 20をy座標に
  282. 				item[i].vx = GetRand(2)+1;//x軸の加速度1~3
  283. 				item[i].vy = 0;
  284. 				item[i].r = ENEMY_R;//敵の当たり判定と同じ扱い
  285. 				break;  //出現させたら終了
  286.                         }
  287.                 }
  288.         }
  289.         //アイテムの移動
  290.         for(int i=0;i<ITEM_MAX;i++){
  291.                 if(item[i].flag){              //出現しているアイテムならば移動
  292. 		        item[i].x -= item[i].vx;	//アイテムの加速度分値を変化
  293. 			item[i].y -= item[i].vy;
  294.                         if(item[i].x < -10 || item[i].y<-10 || item[i].y>490){   //画面外に出たら消去
  295.                                 item[i].flag = false;
  296.                         }
  297.                 }
  298.         }
  299. }
  300. void Move(Player *player)
  301. {
  302.         //速度変更処理
  303.         if(CheckHitKey(KEY_INPUT_D) == 1){
  304.                 player->speed = DASH_DIST; //Dキーが押されていれば速度を上げる
  305.         } 
  306.         else {
  307.                 player->speed = MOVE_DIST;
  308.         }
  309.         //自キャラの移動処理(キーボード)
  310.         if(CheckHitKey(KEY_INPUT_UP) == 1){
  311.                 player->y -= player->speed;     //上移動
  312.         }
  313.         if(CheckHitKey(KEY_INPUT_DOWN) == 1){
  314.                 player->y += player->speed;    //下移動
  315.         }
  316.         if(CheckHitKey(KEY_INPUT_LEFT) == 1){
  317.                 player->x -= player->speed;    //左移動
  318.         }
  319.         if(CheckHitKey(KEY_INPUT_RIGHT) == 1){
  320.                 player->x += player->speed;    //右移動
  321.         }
  322.  
  323.         //移動の制限処理
  324.         if(player->x < 35){
  325.                 player->x = 35;
  326.         }
  327.         if(player->x > 604){
  328.                 player->x = 604;
  329.         }
  330.         if(player->y < 35){
  331.                 player->y = 35;
  332.         }
  333.         if(player->y > 444){
  334.                 player->y = 444;
  335.         }
  336. }
  337.  
  338. void PShotMove(Player *player,Shot *p_shot)
  339. {
  340.         //弾の発射処理(zキーが押されていてplayerのz_flagがfalseなら発射)
  341.         if(CheckHitKey(KEY_INPUT_Z) == 1 && !player->z_flag) 
  342.         {
  343.                 player->z_flag = true; //zキーが押されていることを示すフラグ立て
  344.                 for(int i = 0 ; i < SHOT_MAX ; i++)
  345.                 {
  346.                         if(!p_shot[i].flag) //i番目の弾のフラグがfalse(未発射)なら
  347.                         {
  348.                                 p_shot[i].x = player->x; //未発射の弾をプレイヤーの位置に配置
  349.                                 p_shot[i].y = player->y;
  350. 								p_shot[i].r = SHOT_R;//当たり判定
  351.                                 p_shot[i].flag = true; //弾のフラグを立てる
  352. 								PlaySoundMem(se[4],DX_PLAYTYPE_BACK);
  353.                                 break;  //1発撃ったら、ループを抜ける
  354.                         }
  355.                 }
  356.         }
  357.  
  358.         //zキーを離すと、z_flagがfalseとなり弾が撃てるようになる
  359.         if(CheckHitKey(KEY_INPUT_Z) == 0){
  360.                 player->z_flag = false;
  361.         }
  362.  
  363.         //弾の移動処理
  364.         for(int i = 0 ; i < SHOT_MAX ; i++)
  365.         {   //全ての弾をチェック
  366.                 if(p_shot[i].flag) //弾が発射されている(flagがtrue)なら
  367.                 {
  368.                         p_shot[i].x += SHOT_SPEED; //弾を移動させる
  369.                         if(p_shot[i].x > 650) p_shot[i].flag = false; //画面外へ弾が出たら弾を消す
  370.                 }
  371.         }
  372. }
  373. void Collision(Player *player,Enemy *enemy,Shot *p_shot,Damage *damage,Item *item)
  374. {
  375.     //敵と弾の当たり判定
  376.     for(int i = 0 ; i < ENEMY_MAX ; i++)
  377.     {
  378.             for(int j = 0 ; j < SHOT_MAX ; j++)
  379.             {       //敵も弾も表示されていれば
  380.                 if(enemy[i].flag && p_shot[j].flag)
  381.                 {
  382.                     //(敵と弾の距離)の2乗 <=(敵の半径+弾の半径)の2乗
  383.                     if((enemy[i].x - p_shot[j].x) * (enemy[i].x - p_shot[j].x)
  384.                         + (enemy[i].y - p_shot[j].y) * (enemy[i].y - p_shot[j].y)
  385.                         <= (enemy[i].r + p_shot[j].r) * (enemy[i].r + p_shot[j].r))
  386.                     {
  387.                         enemy[i].flag = false;
  388.                         p_shot[j].flag = false;
  389. 			player->count++;	//得点UP
  390. 			PlaySoundMem(se[GetRand(2)],DX_PLAYTYPE_BACK);
  391.  
  392.                     }
  393.                 }
  394.  
  395. 			}
  396. 			//敵とプレイヤーの当たり判定
  397. 			if(enemy[i].flag == true &&
  398. 			((enemy[i].x - player->x) * (enemy[i].x - player->x)
  399. 			+ (enemy[i].y - player->y) * (enemy[i].y - player->y)
  400. 			<= (enemy[i].r + player->r) * (enemy[i].r + player->r)))
  401. 			{
  402. 				enemy[i].flag = false;
  403. 				player->hp -= Damage_enter(player->x,player->y,damage,DAMAGE_PATTERN_D);
  404. 				//PlaySoundMem(se[3],DX_PLAYTYPE_BACK);
  405. 				if(player->hp < 0){
  406. 					player->hp = 0;
  407. 					count = 0;	//死亡したらカウントを元に戻す
  408. 					PlaySoundMem(se[6],DX_PLAYTYPE_BACK);
  409. 				}
  410. 				else
  411. 					PlaySoundMem(se[3],DX_PLAYTYPE_BACK);
  412.  
  413. 			}
  414. 	}
  415. 	//アイテムとプレイヤーの当たり判定
  416. 	for(int i = 0 ; i < ITEM_MAX ; i++)
  417. 	{
  418. 		if(item[i].flag == true &&
  419. 		((item[i].x - player->x) * (item[i].x - player->x)
  420. 		+ (item[i].y - player->y) * (item[i].y - player->y)
  421. 		<= (item[i].r + player->r) * (item[i].r + player->r)))
  422. 		{
  423. 			item[i].flag = false;
  424. 			player->hp += Damage_enter(player->x,player->y,damage,DAMAGE_PATTERN_C);
  425. 			PlaySoundMem(se[5],DX_PLAYTYPE_BACK);
  426. 			if(player->hp > PLAYER_HP_MAX){
  427. 				player->hp = PLAYER_HP_MAX;
  428. 			}
  429. 		}
  430. 	}
  431. }
  432. //ダメージの登録(回復も含まれる)
  433. int Damage_enter(int x,int y,Damage *damage,int pattern)
  434. {
  435.  
  436. 	int i;
  437. 	for(i = 0 ; i < DAMAGE_MAX ; i++)
  438. 	{
  439. 	    if(!damage[i].flag) //i番目のフラグがfalseなら
  440.             {
  441.                         //10~30(10秒ごとに1上昇)ダメージ。5分経過で10~60ダメージ
  442. 			if(pattern == DAMAGE_PATTERN_D) damage[i].num = 10+GetRand(20+count/600);
  443. 			else if(pattern == DAMAGE_PATTERN_C) damage[i].num = 10+GetRand(110);//10~120回復
  444. 			else damage[i].num = 0;
  445. 			damage[i].x = x+GetRand(40)-20-5;
  446. 			damage[i].y = y-15;
  447. 			damage[i].vx = 0;
  448. 			damage[i].vy = 1;
  449. 			damage[i].count = 60;	//カウンター
  450. 			damage[i].pattern = pattern;//ダメージの種類(ダメージ、回復)
  451. 			damage[i].flag = true; //フラグを立てる
  452. 			break;  //1発撃ったら、ループを抜ける
  453. 		}
  454. 	}
  455. 	return damage[i].num;
  456. }
  457.  
  458.  
  459. void Draw(Player *player,Enemy *enemy,Shot *p_shot,Damage *damage,Item *item)
  460. {
  461.         int color = GetColor(255,255,255);
  462. 		bool dame_flag = false;	//ダメージを食らったかの判定
  463. 		bool cure_flag = false;	//回復したかの判定
  464.  
  465. 		DrawGraph(0-(count%640),0,back,TRUE);
  466. 		DrawGraph(640-(count%640),0,back,TRUE);
  467.         //敵の描画
  468.         for(int i=0;i<ENEMY_MAX;i++){
  469.                 if(enemy[i].flag){
  470.                         DrawRotaGraph(enemy[i].x,enemy[i].y,1.0,0.0,enemy[i].graph,TRUE);
  471.                 }
  472.         }
  473. 		//アイテムの描画
  474. 		for(int i=0;i<ITEM_MAX;i++){
  475.                 if(item[i].flag){
  476.                         DrawRotaGraph(item[i].x,item[i].y,1.0,0.0,item[i].graph,TRUE);
  477.                 }
  478.         }
  479. 		//弾の描画
  480. 		for(int i=0;i<SHOT_MAX;i++){
  481.                 if(p_shot[i].flag){ //flagの立っている弾のみ描画する
  482.                         DrawRotaGraph(p_shot[i].x,p_shot[i].y,1.0,0.0,p_shot[i].graph,TRUE);
  483.                 }
  484.         }
  485.  
  486. 		DrawRotaGraph(player->x,player->y,1.0,0.0,player->graph,TRUE);  //自キャラ描画
  487.  
  488. 		//ダメージの描画(関数を作るのがめんどくさかったのでここで制御もする)
  489.         for(int i=0;i<DAMAGE_MAX;i++){
  490.                 if(damage[i].flag == true){ //flagの立っているもののみ描画する
  491.                        	//吹き出しを表示させるかのフラグ(喰らってから30フレーム以内)
  492. 			if(damage[i].count>30 && damage[i].pattern==DAMAGE_PATTERN_D) dame_flag = true;
  493. 	                //吹き出しを表示させるかのフラグ(メシ食ってから30フレーム以内)
  494. 			else if(damage[i].count>30 && damage[i].pattern==DAMAGE_PATTERN_C) cure_flag = true;
  495.                         //カウンターが残っているほど濃く描画
  496. 			SetDrawBlendMode( DX_BLENDMODE_ALPHA , damage[i].count*4 ) ;
  497.  
  498. 			if(damage[i].pattern==DAMAGE_PATTERN_D)
  499.                                 DrawFormatString(damage[i].x,damage[i].y,GetColor(255,0,0),"%d",damage[i].num);
  500. 			else if(damage[i].pattern==DAMAGE_PATTERN_C)
  501.                                 DrawFormatString(damage[i].x,damage[i].y,GetColor(0,255,0),"%d",damage[i].num);
  502. 			SetDrawBlendMode( DX_BLENDMODE_NOBLEND , 0 ) ;//元に戻す
  503. 			damage[i].y -= damage[i].vy;
  504. 			damage[i].count--;
  505. 			if(damage[i].count<0)
  506. 				damage[i].flag = false;
  507.                 }
  508.         }
  509. 		if(dame_flag == true)
  510. 			DrawRotaGraph(player->x+30,player->y-22,1.0,0.0,player->graph2,TRUE);  //吹き出し描画
  511. 		else if(cure_flag == true)
  512. 			DrawRotaGraph(player->x+30,player->y-22,1.0,0.0,player->graph3,TRUE);  //吹き出し描画
  513.  
  514. 		DrawFormatString(20,20,GetColor(255,0,255),"敵を倒した数:%d",player->count);
  515.                 DrawString(230,420,"プレイヤーのステータス",color);
  516.                 DrawFormatString(STATUS_X,440,GetColor(255,0,0),"プレイヤーのx座標:%d,y座標:%d",player->x,player->y);
  517.                 DrawFormatString(STATUS_X,460,color,"プレイヤーのHP:%4d/%4d",player->hp,PLAYER_HP_MAX);
  518. 		DrawBox   ( STATUS_X+250 , 460 , STATUS_X+351 , 475 , GetColor(255,255,0) , FALSE);   // 四角形を描画。HPバーの枠
  519.                  // 四角形を描画(塗りつぶし)。HPバーの中身
  520. 		DrawBox   ( STATUS_X+251 , 461 , (int)(STATUS_X+250+(player->hp/(double)PLAYER_HP_MAX)*100), 474 , 
  521.                             GetColor(255,    (int)((player->hp/(double)PLAYER_HP_MAX)*255),0) , TRUE );
  522. }
個人用ツール