ロックマンのティウンティウン

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

ロックマンのティウンティウン

#1

投稿記事 by megaman » 5年前

先日の音楽再生の件、ありがとうございました。
申し訳ないですが、もう一つ質問させてください。

ロックマンが撃破された時の描写を再現したいのです。
この掲示板で検索し、同じ質問をされていた方がいらっしゃいましたが、
私では理解できませんでした。

「アニメーションを持った玉が、同時に8方向へ分かれる」
言葉では分かるのですが・・・

アバター
夢幻ノ月夜
記事: 133
登録日時: 5年前
住所: Stens;Gate世界線

Re: ロックマンのティウンティウン

#2

投稿記事 by 夢幻ノ月夜 » 5年前

コード:

struct Anime{
float x, y;
float a, sp;
int cnt;
bool used;
};

Anime an[8];

int anG;
みたいな感じで構造体定義して
anGにグラフィックハンドルを保存

コード:

for(int i=0;i<8;i++){
if(an[i].used==false)continue;
DrawGraph(an[i].x,an[i].y,anG,TRUE);
}
で描画

コード:

for(int i=0;i<8;i++){
if(an[i].used==false)continue;
an[i].x+=cos(an[i].a)*an[i].sp;
an[i].y+=sin(an[i].a)*an[i].sp;
if(an[i].cnt>60)a[i].used=false;
an[i].cnt++;
}
で移動(60フレーム後に消去)

みたいな感じでおkじゃない?
毎回ゲーム作ろうとするたびに壁にぶち当たる

megaman

Re: ロックマンのティウンティウン

#3

投稿記事 by megaman » 5年前

夢幻ノ月夜さん
返信ありがとうございます。

ですが、どの文でなにをしているのかいまいち理解できません・・・
すいませんが、ご指導願います。

Rittai_3D
記事: 524
登録日時: 7年前

Re: ロックマンのティウンティウン

#4

投稿記事 by Rittai_3D » 5年前

わからない行はどれですか?
全てですか?

具体的にわからない行を教えてください。
初心者です

megaman

Re: ロックマンのティウンティウン

#5

投稿記事 by megaman » 5年前

Rittai_3Dさん
返信ありがとうございます。
短すぎました、すいません。

構造体なのですが

コード:

struct Anime{
float x, y;	//座標
float a, sp;	//?
int cnt;	//フレーム
bool used;	//使われているか
};
 
Anime an[8];	//玉
 
int anG;	//画像
?の部分がわからず、「移動」の文でなにを行っているか
理解できないのです。

Rittai_3D
記事: 524
登録日時: 7年前

Re: ロックマンのティウンティウン

#6

投稿記事 by Rittai_3D » 5年前

megaman さんが書きました:構造体なのですが

コード:

struct Anime{
   float x, y;	//座標
   float a, sp;	//?
   int cnt;	//フレーム
   bool used;	//使われているか
};
 
Anime an[8];	//玉
 
int anG;	//画像
?の部分がわからず、「移動」の文でなにを行っているか
理解できないのです。
夢幻ノ月夜さんの書かれたコードですのでわたしの想像になりますが、
a は angle のことで進行方向の角度
sp は speed のことで進行速度だと思います。
夢幻ノ月夜 さんが書きました:

コード:

for(int i=0;i<8;i++){
   if(an[i].used==false)continue;
   an[i].x+=cos(an[i].a)*an[i].sp;
   an[i].y+=sin(an[i].a)*an[i].sp;
   if(an[i].cnt>60)a[i].used=false;
   an[i].cnt++;
}
では、anime構造体の配列の要素分ループして、使われていなければ次の要素に、そうでなければ移動処理を書いているだけです。
もし、anime構造体の配列の要素ひとつひとつのカウントが60より多くなったら使われてない状態にする。
が大まかな流れです。

sin() cos() が分からないのでしたら、三角関数の話になりますので、三角関数の勉強をしてくださいとしか言えないです。
補足資料 6章 sin, cosって何?(三角比の基本)が参考になると思います。
オフトピック
インデントがずれていたので引用したときにインデントをしておきました。
初心者です

megaman

Re: ロックマンのティウンティウン

#7

投稿記事 by megaman » 5年前

Rittai_3Dさん
丁寧な解説ありがとうございます。
ですが、撃破されても描写されませんでした。
「撃破される直後の座標」が代入されてないからだと思うのですが、
どのタイミングで代入すればいいのでしょうか?

コード:

	//ライフがなくなったら
	if(g_stagedata.hero.life <= 0){
			Anime an[8];    //玉
			int time = g_stagedata.animcounter % 120;	//2秒間で
			if (time == 20){							//timeが20のときに
				for(int i=0;i<8;i++){
				   if(an[i].used==false)continue;
				   an[i].x+=cos(an[i].a)*an[i].sp;
				   an[i].y+=sin(an[i].a)*an[i].sp;
				   if(an[i].cnt>120)an[i].used=false;
				   an[i].cnt++;
				}
				for(int i=0;i<8;i++){
					if(an[i].used==false)continue;
					DrawGraph(an[i].x,an[i].y,g_imghandles.Dead,FALSE);
				}
			}
			else if(time == 110){
				g_stagedata.hero.zanki--;
				g_stagedata.hero.x = g_stagedata.hero.oldx2;
				g_stagedata.hero.y = g_stagedata.hero.oldy2;
				g_stagedata.scrollx = 0;
				g_stagedata.scrolly = 0;
				g_stagedata.hero.life = HERO_LIFE;	//生命力
			}
	}

Rittai_3D
記事: 524
登録日時: 7年前

Re: ロックマンのティウンティウン

#8

投稿記事 by Rittai_3D » 5年前

an[8] が初期化されてないからだと思います。
printfDx() や DrawFormatString() で変数の値を確認すればわかると思いますが、中身は不定です。

C言語/C++においてはグローバル変数は自動的に0に初期化されますが、ローカル変数は初期化してやらないと0にならないはずです。

an.x と an.y の値を要素分確認してください。
オフトピック
変数名がわかりにくい気がします。Anime構造体は一体何のアニメーションなのかがわかるように書いてくださると可読性が上がります。

Anime an[8]; の 8も名前をつけてやりましょう。マジックナンバーは可読性を下げます
初心者です

閉鎖

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