アクションゲームのショット時モーションが表示されない

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

アクションゲームのショット時モーションが表示されない

#1

投稿記事 by megaman » 10年前

こんにちは、ゲーム完成までの期限も残り少なくなってきました。
今回悩んでいるのはショット時にキャラの画像が入れ替わらず、
通常時のままになってしまっていることです。

コード:

void Drawshot(int key){

	//発射処理
	if (IsBKeyTrigger(key) == 1){
		//空きを探す
		int i;
		for (i = 0; i < MAX_SHOT; i++){
			if (g_stagedata.shots[i].living == FALSE) break;
		}
		if (i < MAX_SHOT){
			g_stagedata.shots[i].living = TRUE;
			if(g_stagedata.hero.turn==FALSE){	//操作キャラの手(手前)からショットを出す
				g_stagedata.shots[i].x = g_stagedata.hero.x + IMG_CHIPSIZE;
				g_stagedata.shots[i].turn = FALSE;
			}
			else{
				g_stagedata.shots[i].x = g_stagedata.hero.x - IMG_CHIPSIZE;
				g_stagedata.shots[i].turn = TRUE;
			}
			g_stagedata.shots[i].y = g_stagedata.hero.y;
		}
		//弾を撃ったフラグ
		g_stagedata.hero.shoting = 1;
	}
}

コード:

//ショット時
if (g_stagedata.hero.shoting == 1) {
	g_stagedata.hero.shotstop = 100;
	while(1){
		if(g_stagedata.hero.shotstop ==0){
			// 硬直時間の終わり
			g_stagedata.hero.shoting = 0;
			break;
		}
		g_stagedata.hero.shotstop -= 1;
	}
}

コード:

	if(g_stagedata.hero.shoting == 0 && g_stagedata.hero.lifedown == 0){
		if(g_stagedata.hero.muteki%5==0 && g_stagedata.hero.jumping == FALSE && walk == 0){
			DrawRotaGraph2((int)(g_stagedata.hero.x - g_stagedata.scrollx), 
			(int)g_stagedata.hero.y, 0, 0, 1, 0,
			g_imghandles.hero[0], FALSE, g_stagedata.hero.turn);
		}
	else if (g_stagedata.hero.shoting ==1 && g_stagedata.hero.lifedown == 0){
		
		if(g_stagedata.hero.muteki%5==0 && g_stagedata.hero.jumping == FALSE && walk == 0){
			DrawRotaGraph2((int)(g_stagedata.hero.x - g_stagedata.scrollx), 
			(int)g_stagedata.hero.y, 0, 0, 1, 0,
			g_imghandles.hero[4], FALSE, g_stagedata.hero.turn);
		}
	}
一度ブレークポイントを使用してみたところ、
g_stagedata.hero.shotstop = 100;が機能していないようです。
申し訳ありませんが、訂正をよろしくお願いします。

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

Re: アクションゲームのショット時モーションが表示されない

#2

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

megaman さんが書きました:

コード:

//ショット時
if (g_stagedata.hero.shoting == 1) {
	g_stagedata.hero.shotstop = 100;
	while(1){
		if(g_stagedata.hero.shotstop ==0){
			// 硬直時間の終わり
			g_stagedata.hero.shoting = 0;
			break;
		}
		g_stagedata.hero.shotstop -= 1;
	}
}
megaman さんが書きました:一度ブレークポイントを使用してみたところ、
g_stagedata.hero.shotstop = 100;が機能していないようです。
申し訳ありませんが、訂正をよろしくお願いします。
これは本当ですか?
g_stagedata.hero.shotstop = 100;は正常に機能しているが、
その後のループですぐにg_stagedata.hero.shotstop=0にしているだけではないですか?
この行の前後にブレークポイントを置いて確認してみてください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

megaman

Re: アクションゲームのショット時モーションが表示されない

#3

投稿記事 by megaman » 10年前

>みけCATさん
返信ありがとうございます。ですがうまく原因がわかりませんでした。
みけCAT さんが書きました: g_stagedata.hero.shotstop = 100;は正常に機能しているが、
その後のループですぐにg_stagedata.hero.shotstop=0にしているだけではないですか?
この部分でしかg_stagedata.hero.shotstopを使っていないので初期化するようなことはしていないです。
検索で確認すると視覚化する目的でprintfDxで使っていますが、それ以外では使用していません。
再度ブレークポイントもやってみましたが、

コード:

//ショット時
if (g_stagedata.hero.shoting == 1) {
    g_stagedata.hero.shotstop = 100;
    while(1){
        if(g_stagedata.hero.shotstop ==0){
            // 硬直時間の終わり
            g_stagedata.hero.shoting = 0;
            break;
        }
        g_stagedata.hero.shotstop -= 1;
    }
}
一番上のif文(g_stagedata.hero.shoting == 1)から「ステップイン」動作をすると、
変数に代入せずに、次のif文(g_stagedata.hero.shotstop ==0)に飛んでしまいます。

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

Re: アクションゲームのショット時モーションが表示されない

#4

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

megaman さんが書きました:再度ブレークポイントもやってみましたが、

コード:

//ショット時
if (g_stagedata.hero.shoting == 1) {
    g_stagedata.hero.shotstop = 100;
    while(1){
        if(g_stagedata.hero.shotstop ==0){
            // 硬直時間の終わり
            g_stagedata.hero.shoting = 0;
            break;
        }
        g_stagedata.hero.shotstop -= 1;
    }
}
一番上のif文(g_stagedata.hero.shoting == 1)から「ステップイン」動作をすると、
変数に代入せずに、次のif文(g_stagedata.hero.shotstop ==0)に飛んでしまいます。
申し訳ないですが、あまり信じられないです。
megamanさんが使用しているデバッガに変数の値を表示(ウォッチ)する機能はありますか?
あるならば、「次のif文(g_stagedata.hero.shotstop ==0)」でのg_stagedata.hero.shotstopの値を調べてみてください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Ryo

Re: アクションゲームのショット時モーションが表示されない

#5

投稿記事 by Ryo » 10年前

想像で申し訳ありませんが・・・、VisualStudioなどで、リリースモードや
「最適化あり」と「DEBUG情報あり」で、デバッグ確認してることはないでしょうか?
そして、

コード:

//ショット時
if (g_stagedata.hero.shoting == 1) {
    g_stagedata.hero.shotstop = 100;
    while(1){
        if(g_stagedata.hero.shotstop ==0){
            // 硬直時間の終わり
            g_stagedata.hero.shoting = 0;
            break;
        }
        g_stagedata.hero.shotstop -= 1;
    }
}
ここ、4-11行目は、100という数字をカウントダウンさせて0になったら抜けるだけ、
時間にして1meCにも満たずに抜けると思います
100~1の間は「何もしてない」に等しいと判断されて、最適化されてるのではないでしょうか

megaman

Re: アクションゲームのショット時モーションが表示されない

#6

投稿記事 by megaman » 10年前

>みけCATさん
変数(g_stagedata.hero.shotstop)の値を表示すると「0」が入っています。
これが原因なのでしょうか・・・

>Ryoさん
おっしゃる通りVisualStudioで動作しています。
Ryo さんが書きました: 100~1の間は「何もしてない」に等しいと判断されて、最適化されてるのではないでしょうか
つまりこの中でなにか動作すれば通るのでしょうか?
ちょっと頭の整理がつきませんが考えてみます。

Ryo

Re: アクションゲームのショット時モーションが表示されない

#7

投稿記事 by Ryo » 10年前

10行目あたりにSleep(1);でもいれれば、
「g_stagedata.hero.shotstopの値が減っていくことをデバッグで確認」
は、できるでしょうが、そもそもの目的には意味がないと思います

以前、megamanさんは、無敵時間の質問されてい方かたですよね
無敵時間も、硬直時間も
「ある条件が成立したらフラグをたててカウント開始、『一定のタイミングで減らしていき』、そしてカウンターが0になったらフラグをもどす」
という作業は同じですから、同じ流れでつくれると思います。

現在は、while(1){}の中で、なんのタイミングも計ることなくカウンターを減らしているだけです。

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

Re: アクションゲームのショット時モーションが表示されない

#8

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

megaman さんが書きました:>みけCATさん
変数(g_stagedata.hero.shotstop)の値を表示すると「0」が入っています。
これが原因なのでしょうか・・・
Ryo さんが書きました:想像で申し訳ありませんが・・・、VisualStudioなどで、リリースモードや
「最適化あり」と「DEBUG情報あり」で、デバッグ確認してることはないでしょうか?
なるほど、確かにコンパイラのバグではなく、
最適化によって実際に「g_stagedata.hero.shotstop = 100;が機能していない」という現象が見られることは考えられますね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

megaman

Re: アクションゲームのショット時モーションが表示されない

#9

投稿記事 by megaman » 10年前

>Ryoさん
[quote=”Ryo”]
無敵時間も、硬直時間も
「ある条件が成立したらフラグをたててカウント開始、『一定のタイミングで減らしていき』、そしてカウンターが0になったらフラグをもどす」
という作業は同じですから、同じ流れでつくれると思います。
[/quote]
上のとおりしてみるとできました。自分が以前書いたソースに助けられるとは
どれだけ自分の頭が詰まってたかがわかりますね。

>みけCATさん
最適化機能が働いてくるとは思いもしなかったです。これから書いていく時は
最適化にも気を付けていきたいです。

コード:

	//発射処理
	if (IsBKeyTrigger(key) == 1){
		//空きを探す
		int i;
		for (i = 0; i < MAX_SHOT; i++){
			if (g_stagedata.shots[i].living == FALSE) break;
		}
		if (i < MAX_SHOT){
			g_stagedata.shots[i].living = TRUE;
			if(g_stagedata.hero.turn==FALSE){	//操作キャラの手(手前)からショットを出す
				g_stagedata.shots[i].x = g_stagedata.hero.x + IMG_CHIPSIZE;
				g_stagedata.shots[i].turn = FALSE;
			}
			else{
				g_stagedata.shots[i].x = g_stagedata.hero.x - IMG_CHIPSIZE;
				g_stagedata.shots[i].turn = TRUE;
			}
			g_stagedata.shots[i].y = g_stagedata.hero.y;
		}
		//弾を撃ったフラグ
		g_stagedata.hero.shoting = 1;
		g_stagedata.hero.shotstop = 30;
	}

コード:

	//ショット時
	if (g_stagedata.hero.shoting == 1) {
		if(g_stagedata.hero.shotstop > 0){
			--g_stagedata.hero.shotstop;
		}
		if(g_stagedata.hero.shotstop <= 0){
			g_stagedata.hero.shotstop = 0;
			g_stagedata.hero.shoting = 0;
		}
	}
お二人ともありがとうございました。またお世話になることがあれば
よろしくお願いします。

閉鎖

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