

|
11.見やすく整形しよう グローバル定数(変数)を使った関数 |
|
だんだんプログラムの全体像がわかりにくくなってきました。
こうなってくると、この先プログラムを組むことが嫌になってきます。
私は、HTML上でリアルタイムで書いて、
エディタで動作確認してますので、もっと見づらいです。
プログラム全体をわかりやすくしましょう。
前のプログラムと内容はまったく同じです。
|
//シューティングゲーム サンプルプログラム 11 見やすくしよう
//ライブラリ宣言
#include "DxLib.h"
//定数の宣言---------------------------------------------------------
#define PLAYER_SIZE 50
#define PLAYER_SIZE_HALF PLAYER_SIZE/2
#define PLAYER_MOVE_SPEED 5
#define MINI_MOVE_PLAYER_RANGE_X 160
#define MINI_MOVE_PLAYER_RANGE_Y 0
#define MAX_MOVE_PLAYER_RANGE_X 480
#define MAX_MOVE_PLAYER_RANGE_Y 480
#define GUN_MOVE_SPEED 20
#define GUN_SIZE 12
//-------------------------------------------------------------------
//自作関数 プロトタイプ宣言---------------------------------------------
int UpdatePlayerPosition(int& player_position_x,int& player_position_y,
int MOVE_SPEED);
int UpdatePlayerGunPosition( int* p_player_gun_position_x, int* p_player_gun_position_y,
int player_position_x,int player_position_y,int GUN_SPEED,int f_player_gun_flag);
//--------------------------------------------------------------------
//WinMain関数
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
// DXライブラリの設定
// SetOutApplicationLogValidFlag(TRUE);
//SetGraphMode(640,480,16);
ChangeWindowMode( TRUE ) ;
if( DxLib_Init()==-1) return-1;
// SetMouseDispFlag( TRUE ) ;
SetDrawScreen(DX_SCREEN_BACK);
//変数の宣言と初期化---------------------------------------------------
int player_position_x=320;
int player_position_y=240;
int player_graph=LoadGraph("Player.png");
int background_graph=LoadGraph("BackGroundGraph.png");
int f_player_gun_flag=FALSE; //弾が発射されているか フラグ
int player_gun_position_x=player_position_x;// 弾の位置 X座標
int player_gun_position_y=player_position_y;// 弾の位置 Y座標
int player_gun_graph=LoadGraph("Gun.png"); // 弾画像のハンドル(コード)
//-------------------------------------------------------------------
//メインループ---------------------------------------------------------
while(ProcessMessage()==0)
{
//ジョイスティック&キー入力
UpdatePlayerPosition(player_position_x,player_position_y,PLAYER_MOVE_SPEED);
//弾の発射 移動
f_player_gun_flag=UpdatePlayerGunPosition (&player_gun_position_x,
&player_gun_position_y,player_position_x,player_position_y,
GUN_MOVE_SPEED,f_player_gun_flag);
//プレイヤー移動範囲補正
if(player_position_x>MAX_MOVE_PLAYER_RANGE_X-PLAYER_SIZE_HALF)
player_position_x=MAX_MOVE_PLAYER_RANGE_X-PLAYER_SIZE_HALF;
if(player_position_x<MINI_MOVE_PLAYER_RANGE_X+PLAYER_SIZE_HALF)
player_position_x=MINI_MOVE_PLAYER_RANGE_X+PLAYER_SIZE_HALF;
if(player_position_y>MAX_MOVE_PLAYER_RANGE_Y-PLAYER_SIZE_HALF)
player_position_y=MAX_MOVE_PLAYER_RANGE_Y-PLAYER_SIZE_HALF;
if(player_position_y<MINI_MOVE_PLAYER_RANGE_Y+PLAYER_SIZE_HALF)
player_position_y=MINI_MOVE_PLAYER_RANGE_Y+PLAYER_SIZE_HALF;
//キャラの描画
ClsDrawScreen() ;
DrawGraph(MINI_MOVE_PLAYER_RANGE_X,
MINI_MOVE_PLAYER_RANGE_Y, background_graph,TRUE);
if(f_player_gun_flag==TRUE)DrawGraph(player_gun_position_x-GUN_SIZE/2,
player_gun_position_y-GUN_SIZE/2,player_gun_graph,TRUE);
DrawGraph(player_position_x-PLAYER_SIZE_HALF,
player_position_y-PLAYER_SIZE_HALF, player_graph,TRUE);
ScreenFlip();
// ESCキーが押されたらループから抜ける
if(CheckHitKey(KEY_INPUT_ESCAPE)==TRUE)break;
}
//メインループ-----------------------------------------------------
//終了処理
DxLib_End();
return 0;
}
//自作関数---------------------------------------------------------
//ジョイスティック&キー入力
//int UpdatePlayerPosition(int& PositionX,int& PositionY,int MOVE_SPEED);
//[ライブラリ] #include "DxLib.h"
//[引数] X座標(参照) ,Y座標(参照) ,1ターンで動くドット
//[戻り値] なし
//[解説] ジョイスティック入力によってX座標Y座標を更新する
int UpdatePlayerPosition(int& player_position_x,int& player_position_y,
int MOVE_SPEED)
{
int joypad_state=GetJoypadInputState(DX_INPUT_KEY_PAD1);
if((joypad_state&PAD_INPUT_UP)!=0) player_position_y-=MOVE_SPEED;
if((joypad_state&PAD_INPUT_DOWN)!=0) player_position_y+=MOVE_SPEED;
if((joypad_state&PAD_INPUT_LEFT)!=0) player_position_x-=MOVE_SPEED;
if((joypad_state&PAD_INPUT_RIGHT)!=0) player_position_x+=MOVE_SPEED;
return 0;
}
//-----------------------------------------------------------------
//[ライブラリ] #include "DxLib.h"
//[引数] X座標(アドレス),Y座標(アドレス),発射場所X,発射場所Y,動くドット数,発射フラグ
//[戻り値] 発射フラグ
//]解説] ジョイスティック入力によって発射。弾の移動処理(X座標Y座標を更新する)
int UpdatePlayerGunPosition( int* p_player_gun_position_x, int* p_player_gun_position_y,
int player_position_x,int player_position_y,int GUN_SPEED,int f_player_gun_flag)
{
int joypad_state=GetJoypadInputState(DX_INPUT_KEY_PAD1);
if(((joypad_state& PAD_INPUT_A) !=0)&&(f_player_gun_flag==FALSE))
{
f_player_gun_flag=TRUE;
*p_player_gun_position_x= player_position_x ;
*p_player_gun_position_y= player_position_y ;
}
if(f_player_gun_flag==TRUE) *p_player_gun_position_y-=GUN_SPEED;
if(*p_player_gun_position_y<1) f_player_gun_flag=FALSE;
return f_player_gun_flag;
} |
メインループの整理(C++サンプルプログラムソース) |
メインループが、まだ大きいですね。
じゃまで変更予定のない、//プレイヤー移動範囲補正を見えなくしましょう。
参照関数とグローバル定数を使って、ひとまとまりにしましょう。
|
//シューティングゲーム サンプルプログラム 11 見やすくしよう
//ライブラリ宣言
#include "DxLib.h"
//定数の宣言---------------------------------------------------------
#define PLAYER_SIZE 50
#define PLAYER_SIZE_HALF PLAYER_SIZE/2
#define PLAYER_MOVE_SPEED 5
#define MINI_MOVE_PLAYER_RANGE_X 160
#define MINI_MOVE_PLAYER_RANGE_Y 0
#define MAX_MOVE_PLAYER_RANGE_X 480
#define MAX_MOVE_PLAYER_RANGE_Y 480
#define GUN_MOVE_SPEED 20
#define GUN_SIZE 12
//-------------------------------------------------------------------
//自作関数 プロトタイプ宣言---------------------------------------------
int UpdatePlayerPosition(int& player_position_x,int& player_position_y,
int MOVE_SPEED);
int UpdatePlayerGunPosition( int* p_player_gun_position_x, int* p_player_gun_position_y,
int player_position_x,int player_position_y,int GUN_SPEED,int f_player_gun_flag);
int PlayerRange(int& player_position_x,int& player_position_y);
//--------------------------------------------------------------------
//WinMain関数
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
// DXライブラリの設定
// SetOutApplicationLogValidFlag(TRUE);
//SetGraphMode(640,480,16);
ChangeWindowMode( TRUE ) ;
if( DxLib_Init()==-1) return-1;
// SetMouseDispFlag( TRUE ) ;
SetDrawScreen(DX_SCREEN_BACK);
//変数の宣言と初期化---------------------------------------------------
int player_position_x=320;
int player_position_y=240;
int f_player_gun_flag=FALSE;//弾が発射されているか フラグ
int player_gun_position_x=player_position_x;// 弾の位置 X座標
int player_gun_position_y=player_position_y;// 弾の位置 Y座標
int player_graph=LoadGraph("Player.png"); //自機
int background_graph=LoadGraph("BackGroundGraph.png"); //背景
int player_gun_graph=LoadGraph("Gun.png"); // 弾画像
//-------------------------------------------------------------------
while(ProcessMessage()==0)
{
//**メインループ ********************************************************
//ジョイスティック&キー入力 キャラクターの移動
UpdatePlayerPosition(player_position_x,player_position_y,PLAYER_MOVE_SPEED);
//プレイヤー移動範囲補正
PlayerRange(player_position_x,player_position_y);
//弾の発射 移動
f_player_gun_flag=UpdatePlayerGunPosition (&player_gun_position_x,
&player_gun_position_y,player_position_x,player_position_y,
GUN_MOVE_SPEED,f_player_gun_flag);
//画像描画
ClsDrawScreen() ;
DrawGraph(MINI_MOVE_PLAYER_RANGE_X,
MINI_MOVE_PLAYER_RANGE_Y, background_graph,TRUE);
if(f_player_gun_flag==TRUE)DrawGraph(player_gun_position_x-GUN_SIZE/2,
player_gun_position_y-GUN_SIZE/2,player_gun_graph,TRUE);
DrawGraph(player_position_x-PLAYER_SIZE_HALF,
player_position_y-PLAYER_SIZE_HALF, player_graph,TRUE);
ScreenFlip();
//**メインループ **************************************************
// ESCキーが押されたらループから抜ける
if(CheckHitKey(KEY_INPUT_ESCAPE)==TRUE)break;
}
//終了処理
DxLib_End();
return 0;
}
//自作関数---------------------------------------------------------
//----------------------------------------------------------------
//ジョイスティック&キー 移動入力
//int UpdatePlayerPosition(int& PositionX,int& PositionY,int MOVE_SPEED);
//[ライブラリ] #include "DxLib.h"
//[引数] X座標(参照) ,Y座標(参照) ,1ターンで動くドット
//[戻り値] なし
//[解説] ジョイスティック入力によってX座標Y座標を更新する
int UpdatePlayerPosition(int& player_position_x,int& player_position_y,
int MOVE_SPEED)
{
int joypad_state=GetJoypadInputState(DX_INPUT_KEY_PAD1);
if((joypad_state&PAD_INPUT_UP)!=0) player_position_y-=MOVE_SPEED;
if((joypad_state&PAD_INPUT_DOWN)!=0) player_position_y+=MOVE_SPEED;
if((joypad_state&PAD_INPUT_LEFT)!=0) player_position_x-=MOVE_SPEED;
if((joypad_state&PAD_INPUT_RIGHT)!=0) player_position_x+=MOVE_SPEED;
return 0;
}
//-----------------------------------------------------------------
//[ライブラリ] #include "DxLib.h"
//[引数] X座標(アドレス),Y座標(アドレス),発射場所X,発射場所Y,動くドット数,発射フラグ
//[戻り値] 発射フラグ
//]解説] ジョイスティック入力によって発射。弾の移動処理(X座標Y座標を更新する)
int UpdatePlayerGunPosition( int* p_player_gun_position_x, int* p_player_gun_position_y,
int player_position_x,int player_position_y,int GUN_SPEED,int f_player_gun_flag)
{
int joypad_state=GetJoypadInputState(DX_INPUT_KEY_PAD1);
if(((joypad_state& PAD_INPUT_A) !=0)&&(f_player_gun_flag==FALSE))
{
f_player_gun_flag=TRUE;
*p_player_gun_position_x= player_position_x ;
*p_player_gun_position_y= player_position_y ;
}
if(f_player_gun_flag==TRUE) *p_player_gun_position_y-=GUN_SPEED;
if(*p_player_gun_position_y<1) f_player_gun_flag=FALSE;
return f_player_gun_flag;
}
//-----------------------------------------------------------------
//[ライブラリ] なし
//[引数] X座標(参照),Y座標(参照)
//[戻り値] なし
//]解説] 移動範囲補正処理(範囲外にX座標Y座標を更新しない)
int PlayerRange(int& player_position_x,int& player_position_y)
{
if(player_position_x>MAX_MOVE_PLAYER_RANGE_X-PLAYER_SIZE_HALF)
player_position_x=MAX_MOVE_PLAYER_RANGE_X-PLAYER_SIZE_HALF;
if(player_position_x<MINI_MOVE_PLAYER_RANGE_X+PLAYER_SIZE_HALF)
player_position_x=MINI_MOVE_PLAYER_RANGE_X+PLAYER_SIZE_HALF;
if(player_position_y>MAX_MOVE_PLAYER_RANGE_Y-PLAYER_SIZE_HALF)
player_position_y=MAX_MOVE_PLAYER_RANGE_Y-PLAYER_SIZE_HALF;
if(player_position_y<MINI_MOVE_PLAYER_RANGE_Y+PLAYER_SIZE_HALF)
player_position_y=MINI_MOVE_PLAYER_RANGE_Y+PLAYER_SIZE_HALF;
return 0;
}
|
追記(グローバル定数(変数)について) |
グローバル定数(変数)は、どこからでもアクセスできるので、
わざわざ引数にする必要もありません。
参照関数を使うと、本文をコピーする作業+αで関数が出来上がります。
メインループが5行になりました。これですっきりしましたね。
メインループがすっきりすると、またプログラムを追加する気になります。
プログラムに行き詰ったときは、整理しましょう。
エディタの関数一覧で、見たい場所がすぐ探せます。
関数にしてもポインタにしても、必要に迫られたとき使えばいいのです。
今、ポインタを使った変な関数があるのがめざわりですが、めんどうなのでそのままにします。
これからポインタは出てこないかもしれません。
もし、スピードで行き詰ったら出てきます。
次は、敵が現れます。 |
|