四聖龍神録の13章「敵にショットを撃たせてみよう」→http://dixq.net/rp/13.htmlで
あまりにも複雑なのでコードを縮めたいんですが
うまくいきません。
以下のコードで敵と弾の画像は表示されるのですがカウント後に弾が直線の動きをしてくれません
for(i=0;i<ENEMY_MAX;i++){//弾幕データ計算
//フラグが立っていて、設定した種類が間違っていなければ(オーバーフロー対策)
shot_bullet[shot.knd](i);//.kndの弾幕計算関数を呼ぶ関数ポインタ
if(enemy.bltime==enemy.cnt){
shot.flag=1;//フラグをたてる
}
if(shot.flag==1){
bullet2.x+=cos(bullet2.angle)*bullet2.spd;
bullet2.y+=sin(bullet2.angle)*bullet2[i].spd;
}
DrawRotaGraphF(
bullet2[i].x, bullet2[i].y,
1.0, bullet2[i].angle+PI/2,
img_bullet[bullet2[i].knd][10],TRUE);
}
//1発だけ、自機に向かって直線移動
void shot_bullet_H000(int i){
int k;
k=1;
bullet2[i].knd =enemy[i].blknd2;
bullet2[i].angle =2;
bullet2[i].flag =1;
bullet2[i].x = enemy[i].x;
bullet2[i].y = enemy[i].y;
bullet2[i].col =8;
bullet2[i].cnt =0;
bullet2[i].spd =3;
se_flag[0]=1;
}
構造体shotは作用がよく分からないので省きました
どなたか原因が分かる方よろしくお願いします
四聖龍神録の敵のショット
Re:四聖龍神録の敵のショット
>どんな動きをするんですか?
敵画像の上に弾画像が描写されてる状態です
150カウントしたら
bullet2.x+=cos(bullet2.angle)*bullet2.spd;
bullet2.y+=sin(bullet2.angle)*bullet2.spd;
分の動きを弾画像にプラスされるハズなんですがプラスされません
いじった所は if(enemy.flag==1){//その敵のフラグがオンになってたら
if(0<=enemy.pattern && enemy.pattern<ENEMY_PATTERN_MAX){
shot[n].bullet[k].knd =enemy[shot[n].num].blknd2;
となってる所をbullet2.knd =enemy[i].blknd2;
というように変更しました。
単純に構造体bullet2だけで150カウントすれば直線の動きにしたいんですが
敵画像の上に弾画像が描写されてる状態です
150カウントしたら
bullet2.x+=cos(bullet2.angle)*bullet2.spd;
bullet2.y+=sin(bullet2.angle)*bullet2.spd;
分の動きを弾画像にプラスされるハズなんですがプラスされません
いじった所は if(enemy.flag==1){//その敵のフラグがオンになってたら
if(0<=enemy.pattern && enemy.pattern<ENEMY_PATTERN_MAX){
shot[n].bullet[k].knd =enemy[shot[n].num].blknd2;
となってる所をbullet2.knd =enemy[i].blknd2;
というように変更しました。
単純に構造体bullet2だけで150カウントすれば直線の動きにしたいんですが
Re:四聖龍神録の敵のショット
色々と問題があると思います。
まず、動かない原因についてですが。
>for(i=0;i<ENEMY_MAX;i++){//弾幕データ計算
> //フラグが立っていて、設定した種類が間違っていなければ(オーバーフロー対策)
>shot_bullet[shot.knd](i);//.knd
特定の弾のフラグ既に立っていようと居なかろうと(既に画面上に存在していようと)、shot_bullet_H000(int i) が呼び出され、この関数により
>bullet2.x = enemy.x;
>bullet2.y = enemy.y;
と、強制的に弾の座標が敵の居場所まで巻き戻っております。
他に:
・shot,enemy,bulletが全て同じインデックス i を参照している
これは即ち、敵1が1番目の弾幕のデータの1番目の弾しかチェックせず、敵2が2番目の弾幕(以下略 を意味します。
故に、1体の敵が多数の弾を同時にコントロールできません。
とりあえず、無理に最初から縮めず、先ずはプログラムを理解してから改造を行う事をお勧めします。
まず、動かない原因についてですが。
>for(i=0;i<ENEMY_MAX;i++){//弾幕データ計算
> //フラグが立っていて、設定した種類が間違っていなければ(オーバーフロー対策)
>shot_bullet[shot.knd](i);//.knd
特定の弾のフラグ既に立っていようと居なかろうと(既に画面上に存在していようと)、shot_bullet_H000(int i) が呼び出され、この関数により
>bullet2.x = enemy.x;
>bullet2.y = enemy.y;
と、強制的に弾の座標が敵の居場所まで巻き戻っております。
他に:
・shot,enemy,bulletが全て同じインデックス i を参照している
これは即ち、敵1が1番目の弾幕のデータの1番目の弾しかチェックせず、敵2が2番目の弾幕(以下略 を意味します。
故に、1体の敵が多数の弾を同時にコントロールできません。
とりあえず、無理に最初から縮めず、先ずはプログラムを理解してから改造を行う事をお勧めします。
Re:四聖龍神録の敵のショット
Mr.Vinceさんの言うとおり
shot_bullet[shot.knd](i);
の所をif(shot.flag==0){}で囲むとうまく動きました。
ありがとうございます^^
ちなみに構造体shot_tを入れるメリットって分かりますか?
shot_bullet[shot.knd](i);
の所をif(shot.flag==0){}で囲むとうまく動きました。
ありがとうございます^^
ちなみに構造体shot_tを入れるメリットって分かりますか?
Re:四聖龍神録の敵のショット
私見ですが、構造体shot_tは弾幕の統制の為ではないかと。
bullet_tのみですと、ばらばらに動くだけで他の弾との連携が取れません。
東方の咲夜の弾幕系統の「発射して暫くしてから、一旦止まって一斉に目標に向かって動き出す」や、弾から更に弾を増殖させる、等する時に必要になると思われます。
bullet_tのみですと、ばらばらに動くだけで他の弾との連携が取れません。
東方の咲夜の弾幕系統の「発射して暫くしてから、一旦止まって一斉に目標に向かって動き出す」や、弾から更に弾を増殖させる、等する時に必要になると思われます。
Re:四聖龍神録の敵のショット
なるほど、複雑な動きをするには構造体が複数必要になるという事ですね。
勉強になりました。
もっと色んなコードをいじってみます。ありがとうございました。
とりあえずこの件は解決で
勉強になりました。
もっと色んなコードをいじってみます。ありがとうございました。
とりあえずこの件は解決で