ページ 1 / 1
ロックマンのティウンティウン
Posted: 2015年2月21日(土) 17:12
by megaman
先日の音楽再生の件、ありがとうございました。
申し訳ないですが、もう一つ質問させてください。
ロックマンが撃破された時の描写を再現したいのです。
この掲示板で検索し、同じ質問をされていた方がいらっしゃいましたが、
私では理解できませんでした。
「アニメーションを持った玉が、同時に8方向へ分かれる」
言葉では分かるのですが・・・
Re: ロックマンのティウンティウン
Posted: 2015年2月21日(土) 19:29
by 夢幻ノ月夜
コード:
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じゃない?
Re: ロックマンのティウンティウン
Posted: 2015年2月23日(月) 12:16
by megaman
夢幻ノ月夜さん
返信ありがとうございます。
ですが、どの文でなにをしているのかいまいち理解できません・・・
すいませんが、ご指導願います。
Re: ロックマンのティウンティウン
Posted: 2015年2月23日(月) 12:39
by Rittai_3D
わからない行はどれですか?
全てですか?
具体的にわからない行を教えてください。
Re: ロックマンのティウンティウン
Posted: 2015年2月23日(月) 13:52
by megaman
Rittai_3Dさん
返信ありがとうございます。
短すぎました、すいません。
構造体なのですが
コード:
struct Anime{
float x, y; //座標
float a, sp; //?
int cnt; //フレーム
bool used; //使われているか
};
Anime an[8]; //玉
int anG; //画像
?の部分がわからず、「移動」の文でなにを行っているか
理解できないのです。
Re: ロックマンのティウンティウン
Posted: 2015年2月23日(月) 14:43
by Rittai_3D
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って何?(三角比の基本)が参考になると思います。
オフトピック
インデントがずれていたので引用したときにインデントをしておきました。
Re: ロックマンのティウンティウン
Posted: 2015年2月25日(水) 09:45
by megaman
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; //生命力
}
}
Re: ロックマンのティウンティウン
Posted: 2015年2月25日(水) 10:06
by Rittai_3D
an[8] が初期化されてないからだと思います。
printfDx() や DrawFormatString() で変数の値を確認すればわかると思いますが、中身は不定です。
C言語/C++においてはグローバル変数は自動的に0に初期化されますが、ローカル変数は初期化してやらないと0にならないはずです。
an
.x と an.y の値を要素分確認してください。
オフトピック
変数名がわかりにくい気がします。Anime構造体は一体何のアニメーションなのかがわかるように書いてくださると可読性が上がります。
Anime an[8]; の 8も名前をつけてやりましょう。マジックナンバーは可読性を下げます