ページ 11

横スクロールアクションでのショットの向き

Posted: 2014年10月20日(月) 12:17
by megaman
こんにちは、初めて利用させていただきます。ただ今、ロックマンのような横スクロールアクションを作りたいを思っています。
「14歳からはじめるc言語わくわくゲームプログラミング教室」を購入し、その中にあるソースを元にしながら作成しているのですが、
ショットの向きがプレイヤーの向きと同期していて、ショットの向きが途中で変わってしまいます。・・・修正しようにもいまいち考えがまとまりません。
下記の「向きによってナイフの向きを変える」の部分が原因だとわかってはいるのですが・・・
どうかよろしくお願いします。

コード:

void DrawKnife(int key){

	//発射処理
	if (IsBKeyTrigger(key) == TRUE){
		//空きを探す
		int i;
		for (i = 0; i < MAX_KNIFE; i++){
			if (g_stagedata.knives[i].living == FALSE) break;
		}
		if (i < MAX_KNIFE){
			g_stagedata.knives[i].living = TRUE;
			if(g_stagedata.hero.turn==FALSE){	//操作キャラの手(手前)からナイフを出す
				g_stagedata.knives[i].x = g_stagedata.hero.x + IMG_CHIPSIZE;
			}
			else{
				g_stagedata.knives[i].x = g_stagedata.hero.x - IMG_CHIPSIZE;
			}
			g_stagedata.knives[i].y = g_stagedata.hero.y;
		}
	}
	//ナイフの描画と移動
	float mv = 350.0f * g_frametime; //移動量計算

	for (int i = 0; i < MAX_KNIFE; i++){
		if (g_stagedata.knives[i].living == FALSE) continue;

		//向きによってナイフの向きを変える
		if(g_stagedata.hero.turn==FALSE){
			g_stagedata.knives[i].x += mv;
		}
		else{
			g_stagedata.knives[i].x -= mv;
		}
		//マップ当たり判定
		AtariInfo atari = CheckBlock(g_stagedata.knives[i].x, g_stagedata.knives[i].y, 
			g_stagedata.knives[i].x);
		if (atari.DR == TRUE || atari.UR == TRUE || atari.DL == TRUE || atari.UL == TRUE) g_stagedata.knives[i].living = FALSE;
		//画面外に出ても消滅
		if (g_stagedata.knives[i].x > g_stagedata.scrollx + 1000 || g_stagedata.knives[i].x < g_stagedata.scrollx - IMG_CHIPSIZE){
			g_stagedata.knives[i].living = FALSE;
		}

		DrawGraph((int)(g_stagedata.knives[i].x - g_stagedata.scrollx), 
			(int)g_stagedata.knives[i].y,
			g_imghandles.knife, TRUE);
	}

}
//キートリガー処理
BOOL IsBKeyTrigger(int key){
	if (key & PAD_INPUT_B){
		if (g_stagedata.g_bkey_prev == FALSE){
			g_stagedata.g_bkey_prev = TRUE;
			return TRUE;
		}
	}
	else {
		g_stagedata.g_bkey_prev = FALSE;
	}
	return FALSE;
}

Re: 横スクロールアクションでのショットの向き

Posted: 2014年10月20日(月) 16:01
by softya(ソフト屋)
本の内容はわからないですが、発射したナイフは発射した瞬間のhero.turnの値を保持するメンバ変数をknivesに持つべきだと思います。

Re: 横スクロールアクションでのショットの向き

Posted: 2014年10月21日(火) 14:14
by megaman
遅れて申し訳ありません、softya(ソフト屋) 返信ありがとうございます。
つまり「ボタンを押した時のプレイヤーの向きを1ナイフごとに保持する」ということなのでしょうか?
そのためには、その条件をクラスの中で定義しなければならないと・・・

Re: 横スクロールアクションでのショットの向き

Posted: 2014年10月21日(火) 14:17
by softya(ソフト屋)
> そのためには、その条件をクラスの中で定義しなければならないと・・・

そうしないと常に変化しうるhero.turnに依存する事になりますよね。

Re: 横スクロールアクションでのショットの向き

Posted: 2014年10月21日(火) 15:00
by megaman
発射処理にフラグを付けると正常に動きました。自分の理解度確認になりますが、処理は「キーを押したときにナイフの向きを保持する」
でいいでしょうか?

コード:

void DrawKnife(int key){

	//発射処理
	if (IsBKeyTrigger(key) == TRUE){
		//空きを探す
		int i;
		for (i = 0; i < MAX_KNIFE; i++){
			if (g_stagedata.knives[i].living == FALSE) break;
		}
		if (i < MAX_KNIFE){
			g_stagedata.knives[i].living = TRUE;
			if(g_stagedata.hero.turn==FALSE){	//操作キャラの手(手前)からナイフを出す
				g_stagedata.knives[i].x = g_stagedata.hero.x + IMG_CHIPSIZE;
				g_stagedata.knives[i].turn = FALSE;
			}
			else{
				g_stagedata.knives[i].x = g_stagedata.hero.x - IMG_CHIPSIZE;
				g_stagedata.knives[i].turn = TRUE;
			}
			g_stagedata.knives[i].y = g_stagedata.hero.y;
		}
	}
	//ナイフの描画と移動
	float mv = 350.0f * g_frametime; //移動量計算

	for (int i = 0; i < MAX_KNIFE; i++){
		if (g_stagedata.knives[i].living == FALSE) continue;

		//向きによってナイフの向きを変える
		if(g_stagedata.knives[i].turn==FALSE){
			g_stagedata.knives[i].x += mv;
		}
		else{
			g_stagedata.knives[i].x -= mv;
		}
		//マップ当たり判定
		AtariInfo atari = CheckBlock(g_stagedata.knives[i].x, g_stagedata.knives[i].y, 
			g_stagedata.knives[i].x);
		if (atari.DR == TRUE || atari.UR == TRUE || atari.DL == TRUE || atari.UL == TRUE) g_stagedata.knives[i].living = FALSE;
		//画面外に出ても消滅
		if (g_stagedata.knives[i].x > g_stagedata.scrollx + 1000 || g_stagedata.knives[i].x < g_stagedata.scrollx - IMG_CHIPSIZE){
			g_stagedata.knives[i].living = FALSE;
		}

		DrawGraph((int)(g_stagedata.knives[i].x - g_stagedata.scrollx), 
			(int)g_stagedata.knives[i].y,
			g_imghandles.knife, TRUE);
	}

}
//キートリガー処理
BOOL IsBKeyTrigger(int key){
	if (key & PAD_INPUT_B){
		if (g_stagedata.g_bkey_prev == FALSE){
			g_stagedata.g_bkey_prev = TRUE;
			return TRUE;
		}
	}
	else {
		g_stagedata.g_bkey_prev = FALSE;
	}
	return FALSE;
}

Re: 横スクロールアクションでのショットの向き

Posted: 2014年10月21日(火) 15:07
by softya(ソフト屋)
発射キーを押している間は向きが変わっても良いのか、それとも発射キーを押した1フレーム目で向きが固定されるのかは、ゲーム仕様で決めることですね。
現状は前者の仕様になっているように見えますが、IsBKeyTrigger()の仕様が不明なので推測です。

Re: 横スクロールアクションでのショットの向き

Posted: 2014年10月21日(火) 15:39
by megaman
問題を共に考えていただき、感謝しています。
周りにDXライブラリを学習している人がいないので、またこちらにお世話になるのかもしれませんが、
その時はまたよろしくお願いします。
softya(ソフト屋)さん本当にありがとうございました!