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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ruif
記事: 9
登録日時: 8年前

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

#1

投稿記事 by ruif » 8年前

こんにちは、るーいふと申します。
「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;
}

Rittai_3D
記事: 525
登録日時: 11年前

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

#2

投稿記事 by Rittai_3D » 8年前

見た感じ、Zキーの入力処理が書いていないので、Zキーを押してもうんともすんとも言わないのではないでしょうか。
また、main()にreturn が2つあるのが気になります。
初心者です

ruif
記事: 9
登録日時: 8年前

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

#3

投稿記事 by ruif » 8年前

3Dさん、回答ありがとうございます!
Zキーの入力処理について探してきます
return二つもいらなかったです、余計なことしていました。直します。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

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

#4

投稿記事 by softya(ソフト屋) » 8年前

気になるのは、g_akey_prevが初期化されていないことでしょうね。
デバッガでブレークポイントを使ってIsAKeyTriggerの動作を確認してみてください。
PAD_INPUT_AでZきーは検知できたはず(未検証)。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ruif
記事: 9
登録日時: 8年前

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

#5

投稿記事 by ruif » 8年前

ソフト屋さん、回答ありがとうございます!
デバッガですね、試してみます
直前のAボタンの状態だそうです

Rittai_3D
記事: 525
登録日時: 11年前

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

#6

投稿記事 by Rittai_3D » 8年前

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

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

ruif
記事: 9
登録日時: 8年前

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

#7

投稿記事 by ruif » 8年前

できました!
初期化関数も用意していこうと思います。
お二人方ありがとうございました!

ruif
記事: 9
登録日時: 8年前

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

#8

投稿記事 by ruif » 8年前

原因は106行目に
return TRUE;
を忘れていたのと、returnが多かったことでした。
本当にありがとうございました!

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

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

#9

投稿記事 by みけCAT » 8年前

解決でしたら、解決チェックをお願いします。
件名を編集するべきではありません。
返信画面の「送信」ボタンの右にある「解決!」にチェックを入れた状態で返信をしてください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ruif
記事: 9
登録日時: 8年前

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

#10

投稿記事 by ruif » 8年前

すみませんわざわざ教えていただきありがとうございます
お騒がせしました

閉鎖

“C言語何でも質問掲示板” へ戻る