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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
megaman

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

#1

投稿記事 by megaman » 10年前

こんにちは、初めて利用させていただきます。ただ今、ロックマンのような横スクロールアクションを作りたいを思っています。
「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;
}

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

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

#2

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

本の内容はわからないですが、発射したナイフは発射した瞬間のhero.turnの値を保持するメンバ変数をknivesに持つべきだと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

megaman

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

#3

投稿記事 by megaman » 10年前

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

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

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

#4

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

> そのためには、その条件をクラスの中で定義しなければならないと・・・

そうしないと常に変化しうるhero.turnに依存する事になりますよね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

megaman

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

#5

投稿記事 by megaman » 10年前

発射処理にフラグを付けると正常に動きました。自分の理解度確認になりますが、処理は「キーを押したときにナイフの向きを保持する」
でいいでしょうか?

コード:

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;
}

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

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

#6

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

発射キーを押している間は向きが変わっても良いのか、それとも発射キーを押した1フレーム目で向きが固定されるのかは、ゲーム仕様で決めることですね。
現状は前者の仕様になっているように見えますが、IsBKeyTrigger()の仕様が不明なので推測です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

megaman

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

#7

投稿記事 by megaman » 10年前

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

閉鎖

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