ページ 11

14歳からはじめるC言語わくわくゲームプログラミング教室2013について

Posted: 2015年8月08日(土) 20:42
by ruif
こんにちは、るーいふと申します。
「14歳からはじめるC言語わくわくゲームプログラミング教室2013」についての質問です。
今、Zボタンを押せばタイトルからゲーム本編に変わるプログラムを書いているのですが、Zを押してもうんともすんとも言いません。おそらく自分の写し間違いだと思います。なので、どうすれば間違えているところを見つけれるでしょうか?
回答よろしくお願いします。

コード:

#include <DxLib.h>

//グローバル変数
//時間計測用変数
int g_lasttime = 0;		//直前の時間計算
float g_frametime = 0;		//1ループにかかった時間
enum GameState{			//ゲーム状態
	GAME_TITLE, GAME_MAIN,
	GAME_CLEAR, GAME_OVER
};
GameState g_gamestate = GAME_TITLE;
int g_gametitleimg;		//タイトルイメージ
int g_heroimg;			//画像
float g_hx = 0, g_hy = 0;	//座標
//ボタン
BOOL g_akey_prev;		//直前のAボタンの状態

//関数プロトタイプ宣言
void DrawGameTitle();
void DrawGameMain();
void DrawGameClear();
void DrawGameOver();
BOOL IsAKeyTrigger(int key);

int WINAPI WinMain(HINSTANCE h1, HINSTANCE hP, LPSTR lpC, int nC){
	//ウィンドウモードにする
	ChangeWindowMode(TRUE);
	//ウィンドウサイズを変更する
	SetGraphMode(800, 600, 32);
	//DXライブラリ初期化
	if (DxLib_Init() == -1) return -1;

	//画像を読み込み
	g_gametitleimg = LoadGraph("media\\smp1_title.png");
	g_heroimg = LoadGraph("media\\smp1_chara01.png");
	float x = 0, y = 0;

	SetDrawScreen(DX_SCREEN_BACK);
	g_frametime = GetNowCount();
	while (ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0){
		//1ループにかかった時間を計測
		int curtime = GetNowCount();
		g_frametime = (float)(curtime - g_lasttime) / 1000.0f;
		g_lasttime = curtime;

		ClearDrawScreen();
		//画面描画関数に切り替え
		switch (g_gamestate){
		case GAME_TITLE:
			DrawGameTitle();
			break;
		case GAME_MAIN:
			DrawGameMain();
			break;
		case GAME_CLEAR:
			DrawGameClear();
			break;
		case GAME_OVER:
			DrawGameOver();
			break;
		}
		ScreenFlip();
	}

	//待機
	WaitKey();
	return 0;
	//DXライブラリの終了処理
	DxLib_End();
	return 0;
}

//タイトル画面描画
void DrawGameTitle(){
	DrawBox(0, 0, 800, 600, GetColor(255, 255, 255), TRUE);
	DrawGraph(0, 0, g_gametitleimg, TRUE);
	//キーをチェックして画面を切り替え
	int key = GetJoypadInputState(DX_INPUT_KEY_PAD1);
	if (IsAKeyTrigger(key) == TRUE) g_gamestate = GAME_MAIN;
}
//ゲーム本編描画
void DrawGameMain(){
	//自キャラ移動
	int key = GetJoypadInputState(DX_INPUT_KEY_PAD1);
	float mv = 80.0f * g_frametime; //移動量計算
	if (key & PAD_INPUT_UP)    g_hy -= mv;
	if (key & PAD_INPUT_DOWN)  g_hy += mv;
	if (key & PAD_INPUT_LEFT)  g_hy -= mv;
	if (key & PAD_INPUT_RIGHT) g_hy += mv;
	DrawGraph(g_hx, g_hy, g_heroimg, TRUE);

}
//ゲームクリア画面描画
void DrawGameClear(){

}
//ゲームオーバー画面描画
void DrawGameOver(){
}

//キートリガー処理
BOOL IsAKeyTrigger(int key){
	if (key & PAD_INPUT_A){
		if (g_akey_prev == FALSE){
			g_akey_prev = TRUE;
		}
	}
	else{
		g_akey_prev = FALSE;
	}
	return FALSE;
}

Re: 14歳からはじめるC言語わくわくゲームプログラミング教室2013について

Posted: 2015年8月08日(土) 20:53
by Rittai_3D
見た感じ、Zキーの入力処理が書いていないので、Zキーを押してもうんともすんとも言わないのではないでしょうか。
また、main()にreturn が2つあるのが気になります。

Re: 14歳からはじめるC言語わくわくゲームプログラミング教室2013について

Posted: 2015年8月08日(土) 21:03
by ruif
3Dさん、回答ありがとうございます!
Zキーの入力処理について探してきます
return二つもいらなかったです、余計なことしていました。直します。

Re: 14歳からはじめるC言語わくわくゲームプログラミング教室2013について

Posted: 2015年8月08日(土) 21:10
by softya(ソフト屋)
気になるのは、g_akey_prevが初期化されていないことでしょうね。
デバッガでブレークポイントを使ってIsAKeyTriggerの動作を確認してみてください。
PAD_INPUT_AでZきーは検知できたはず(未検証)。

Re: 14歳からはじめるC言語わくわくゲームプログラミング教室2013について

Posted: 2015年8月08日(土) 21:26
by ruif
ソフト屋さん、回答ありがとうございます!
デバッガですね、試してみます
直前のAボタンの状態だそうです

Re: 14歳からはじめるC言語わくわくゲームプログラミング教室2013について

Posted: 2015年8月08日(土) 21:29
by Rittai_3D
softya(ソフト屋) さんが書きました:気になるのは、g_akey_prevが初期化されていないことでしょうね。
デバッガでブレークポイントを使ってIsAKeyTriggerの動作を確認してみてください。
PAD_INPUT_AでZきーは検知できたはず(未検証)。
グローバル変数は0で初期化されるので問題はないのではないでしょうか。
検証結果です→http://ideone.com/Te9u9i

ただ、変数を初期化する関数を用意したほうが良いと思います。

Re: 14歳からはじめるC言語わくわくゲームプログラミング教室2013について

Posted: 2015年8月08日(土) 21:44
by ruif
できました!
初期化関数も用意していこうと思います。
お二人方ありがとうございました!

Re: 14歳からはじめるC言語わくわくゲームプログラミング教室2013について

Posted: 2015年8月08日(土) 22:01
by ruif
原因は106行目に
return TRUE;
を忘れていたのと、returnが多かったことでした。
本当にありがとうございました!

Re: 14歳からはじめるC言語わくわくゲームプログラミング教室2013について

Posted: 2015年8月08日(土) 22:06
by みけCAT
解決でしたら、解決チェックをお願いします。
件名を編集するべきではありません。
返信画面の「送信」ボタンの右にある「解決!」にチェックを入れた状態で返信をしてください。

Re: 14歳からはじめるC言語わくわくゲームプログラミング教室2013について

Posted: 2015年8月08日(土) 22:24
by ruif
すみませんわざわざ教えていただきありがとうございます
お騒がせしました