特殊効果を時間制にする方法

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

特殊効果を時間制にする方法

#1

投稿記事 by Begineer » 14年前

[1] 質問文
 [1.1] 自分が今行いたい事は何か
ブロック崩しにおいて、アイテムをとったとき、特殊効果(バーの長さが長くなる等)が発動し、ある一定時間が
経ったら、その効果を消す処理をしたいですがなかなかうまくいきません。
 [1.2] どのように取り組んだか(プログラムコードがある場合記載)
アイテム取得のコードの概要は以下の通りです。
codeタグをお使い下さい。 by softya(ソフト屋)

コード:

~省略~
	if(ItemType[i] == 2){ //アイテムを取ったら
				BarGHandle = LoadGraph( "bar2.png" ); //バーを長くする
				OldTime = GetNowCount() ;//取得した時点の時間を記録
				while(1){
				 TimeFunc() ;//時間経過関数
				}
	}
~省略~
int WaitCounter ;	//経過時間計測用 
int NowTime ;	// 現在のフレームで経過した時間
int OldTime ;	// 前のフレームのときにGetNowCount関数で得たタイム

int TimeFunc( void )
{
	int Time ;

	// 現在の時間を得る
	Time = GetNowCount() ;

	// 今フレームで経過した時間を得る
	NowTime = Time - OldTime ;

	// 現在の時間を保存
	OldTime = Time ; 

	// ウエイトカウンタに経過時間を加算する
	WaitCounter += NowTime ;

	// 一定時間が経過したら、効果を消す関数へ
	if( WaitCounter > WAIT )
	{
		TurnBar();

		// カウンターを0に戻す
		WaitCounter = 0 ;
	}

	// 終了
	return 0 ;
}

int TurnBar(void)
{
	BarGHandle = LoadGraph( "標準バー.png" );//長くなったバーをもとに戻す
	return 0;
}
 [1.3] どのようなエラーやトラブルで困っているか(エラーメッセージが解る場合は記載)
アイテムを取ったときに全体がフリーズしてしまって、ゲームが続かなくなります。
 [1.4] 今何がわからないのか、知りたいのか
全体が止まらずに、一定時間が経過したら、特殊効果がなくなるようにしたいです。

[2] 環境  
 [2.1] OS : Windows7
 [2.2] コンパイラ名 : VC++ 2008EE
[3] その他
  ・ライブラリを使っている場合は何を使っているか
DXライブラリ

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

Re: 特殊効果を時間制にする方法

#2

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

つい最近同じような質問があったのですが別の方でしょうか?
「ブロック崩しのアイテム効果について • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/viewtopic.php?f=3&t=9717
別の方だとすれば同じ学校で、これは課題ということでしょうか?

とそれは一旦置いておいて、ゲーム内でウェイトすることはゲームの停止を意味しますので絶対にやってはいけません。
その代わりにゲームの時間経過をフレーム数で管理します。所定のフレーム数が経過したことをカウントしてやれば解決しますよ。

[追記]
バーの長さの変更をLoadGraph()で行なっていますが、これだとメモリリークします。
グラフィックはゲーム起動時に読み込んでゲーム途中では読み込んではいけません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Begineer

Re: 特殊効果を時間制にする方法

#3

投稿記事 by Begineer » 14年前

コメントありがとうございます。
うまく時間制にすることができました。連続で申し訳ありませんが、ボールの速度を変更すると動きがおかしくなります。

コード:

int BallVX = 10; //X方向ボールの初期速度
int BallVY = 5;  //Y方向ボールの初期速度
int BallVXM = 16;//X方向ボールの最高速度
int BallVYM = 8;//Y方向ボールの最古速度
~省略~
if((WallCounter%10 == 0) && (WallCounter > 0)){           //ブロックを10の倍数ぶん(10,20,30…)壊したら
	if((BallVX < BallVXM)&&(BallVY < BallVYM)){      //ボールの速度が最高速度より小さいなら
		BallVX ++;  //X方向の速度を1足して上げる
		BallVY ++;  //Y方向の速度を1足して上げる
	}
}
~省略~
こうすることで、ブロックを壊すにつれて、ボールの速度を上げようと考えています。
が、10個ブロックを壊すと、動きがおかしくなります。
なにがいけないのでしょうか。


ちなみに、
viewtopic.php?f=3&t=9717
は私です。
ご迷惑おかけしてすいませんでした。

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

Re: 特殊効果を時間制にする方法

#4

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

名前は一貫性のあるものにしてくださいね。ここのルールですので。

>こうすることで、ブロックを壊すにつれて、ボールの速度を上げようと考えています。
>が、10個ブロックを壊すと、動きがおかしくなります。
>なにがいけないのでしょうか。

「動きがおかしくなります」の説明が不十分なので勘ですが、このコードだとストッパがないので10個になったときに加速をしますがそのまま最高速度まで加速し続けます。もう一つ判定が必要ではないでしょうか?例えば、壊したフレームだけ有効になるフラグなどを判定に加えましょう。
それとベクトルなのに何も考えずに正の数を足してますが、これだと進行方向次第では逆方向に動き始めると思います。ちゃんとやるには、ベクトルから角度と速度に一度変換して速度を加算した後ベクトルに戻す必要があります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Be

Re: 特殊効果を時間制にする方法

#5

投稿記事 by Be » 14年前

説明が不明快な部分は申し訳ありませんでした。
「動きがおかしい」というのは「進行方向と逆方向に動く」というのが主な状態です。

ベクトルとはいったいなんですか?
もう少し詳しく教えてください。

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

Re: 特殊効果を時間制にする方法

#6

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

Be さんが書きました:説明が不明快な部分は申し訳ありませんでした。
「動きがおかしい」というのは「進行方向と逆方向に動く」というのが主な状態です。

ベクトルとはいったいなんですか?
もう少し詳しく教えてください。
早速名前が変わってますが、Beで統一するということでよろしいですか?

ベクトルは高校の数学で習うはずですが専門学校生ですよね?
「数学B ベクトル」
http://www.geocities.co.jp/Technopolis/ ... _index.htm
「ベクトル」
http://w3e.kanazawa-it.ac.jp/math/categ ... index.html

ゲームでベクトルは重要な意味を持ちますので出来れば教科書で復習してみてください。
もし習っていないなら、この機会に覚えてくださいね。

「シューティングゲームと二次元ベクトル」
http://www7.plala.or.jp/kfb/program/stg2dvec.html
「[GAME004] ベクトルによる移動処理(初級編)」
http://orangeknowledge.jpn.org/tips/game003.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Be

Re: 特殊効果を時間制にする方法

#7

投稿記事 by Be » 14年前

またユーザー名を間違えました。
Beで統一します。
すいませんでした。

ベクトルですか・・もっとしっかり学びたいと思います。

閉鎖

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