ページ 11

途中から自機狙いに変化するプログラムについてです

Posted: 2010年4月11日(日) 05:05
by
龍神録のプログラムについて質問なんですが、途中から自機狙いに変化するプログラムが分かりません。
shot.cppに
double shotatan3(int n){
return atan2(ch.y-enemy[shot[bullet[n].y].num].y,ch.x-enemy[shot[bullet[n].x].num].x);
}
というものを追加してshotH.cppに
void shot_bullet_H017(int n){
int t=shot[n].cnt;
int k;

if(t>0 && t<=100 && t%50==0){
for(int i=0;i<=60;i++){
if(shot[n].flag!=2 && (k=shot_search(n))!=-1){
shot[n].bullet[k].knd =3;//2番の弾
shot[n].bullet[k].angle =PI2/60*i;//円形60個
shot[n].bullet[k].flag =1;
shot[n].bullet[k].x =enemy[shot[n].num].x;
shot[n].bullet[k].y =enemy[shot[n].num].y;
shot[n].bullet[k].col =4;//4番の色
shot[n].bullet[k].cnt =0;
shot[n].bullet[k].state =1;
shot[n].bullet[k].spd =1;
se_flag[0]=1;//発射音鳴らす
}
}
}
for(int i=0;i<SHOT_BULLET_MAX;i++){//全弾分
if(shot[n].bullet.flag>0 && shot[n].bullet.state==1){//登録されている弾があれば
int cnt=shot[n].bullet.cnt;
if(cnt==100){
shot[n].bullet.spd =2;
shot[n].bullet.angle = shotatan3(n);
}
}
}
と作ったのですが、コンパイルしてみると

'bullet' : 定義されていない識別子です。
'.y' の左側はクラス、構造体、共用体でなければなりません
'.num' の左側はクラス、構造体、共用体でなければなりません

といったエラーが出てしまいます。
初歩的な質問かもしれませんが、分かるかたがいましたら教えていただけませんでしょうか?

Re:途中から自機狙いに変化するプログラムについてです

Posted: 2010年4月11日(日) 07:05
by ひよこ
enemy[shot[bullet[n].y].num].yをenemy[shot[n].num].yにすれば動くと思います。

Re:途中から自機狙いに変化するプログラムについてです

Posted: 2010年4月12日(月) 18:36
by
返答ありがとうございます。
しかし、ひよこさんのように書き換えると、敵が自機にショットを撃った瞬間の角度でしか動きません。
敵の撃ったショットのカウントhot[n].bullet.cntが100になった瞬間に自機と弾との角度を返すにはどうしたらよいでしょうか?

Re:途中から自機狙いに変化するプログラムについてです

Posted: 2010年4月12日(月) 19:36
by ひよこ
私の環境ではちゃんと自機のほうへ行きましたよ。
一応上手くいったソースを載せておきます。
double shotatan3(int n){
return atan2(ch.y-enemy[shot[n].num].y,ch.x-enemy[shot[n].num].x);
}
//1発だけ、自機に向かって直線発射
void shot_bullet_H000(int n){
int t=shot[n].cnt;
int k;

if(t>0 && t<=100 && t%50==0){
for(int i=0;i<=60;i++){
if(shot[n].flag!=2 && (k=shot_search(n))!=-1){
shot[n].bullet[k].knd =3;//2番の弾
shot[n].bullet[k].angle =PI2/60*i;//円形60個
shot[n].bullet[k].flag =1;
shot[n].bullet[k].x =enemy[shot[n].num].x;
shot[n].bullet[k].y =enemy[shot[n].num].y;
shot[n].bullet[k].col =4;//4番の色
shot[n].bullet[k].cnt =0;
shot[n].bullet[k].state =1;
shot[n].bullet[k].spd =1;
se_flag[0]=1;//発射音鳴らす
}
}
}
for(int i=0;i<SHOT_BULLET_MAX;i++){//全弾分
if(shot[n].bullet.flag>0 && shot[n].bullet.state==1){//登録されている弾があれば
int cnt=shot[n].bullet.cnt;
if(cnt==100){
shot[n].bullet.spd =2;
shot[n].bullet.angle = shotatan3(n);
}
}
}
}

Re:途中から自機狙いに変化するプログラムについてです

Posted: 2010年4月12日(月) 21:08
by
何度もすみません、自分の説明が足りませんでした。

ひよこさんのように書き換えたところ、敵が動かない場合は上手くいくのですが、敵が動いている場合が上手くいきません。

例えば、敵が自機のななめ左上にいる場合にショットを撃つとします。このまま敵も自機も動かなかった場合はショットカウントが100になったときにショットが右下に動きますよね。

しかし敵がショットを撃ったあとにショットのカウントが100になる前に敵が動き、自機のななめ右上に来てしまったときにショットのカウントが100になってしまった場合、ショット自体はななめ右上に残されたままなのに、ななめ右上に存在する敵と、自機との角度を返してしまって、ショットが左下に動いてしまうんです。

説明が複雑になっていしまって申し訳ありませんが、これを解決することは出来るでしょうか?

Re:途中から自機狙いに変化するプログラムについてです

Posted: 2010年4月12日(月) 21:32
by ひよこ
簡単に言うと、ショットと自機との角度を求めればいいのではないでしょうか?

Re:途中から自機狙いに変化するプログラムについてです

Posted: 2010年4月14日(水) 01:10
by
はい。そういう風にしようとしたんですが、最初のようにエラーが出てしまって・・・
enemy[shot[bullet[n].y].num].yの部分がおかしいとは思うんですが具体的にどこがおかしいのかが分からないです。

回りくどいせつめいになってしまってすみません。

Re:途中から自機狙いに変化するプログラムについてです

Posted: 2010年4月14日(水) 01:40
by ookami
横からすみません。
shot[n].bullet.angle = shotatan3(n);
を、
shot[n].bullet.angle = atan2(ch.y-shot[n].bullet.y,ch.x-shot[n].bullet.x);
にしてみてはいかがでしょうか。

Re:途中から自機狙いに変化するプログラムについてです

Posted: 2010年4月14日(水) 13:08
by
なりました!ありがとうございます!shotH.cppのほうを変えればよかったんですね。

ひよこさんもookamiさんも私のつたない説明に回答ありがとうございました!
すごくうれしかったです!

Re:途中から自機狙いに変化するプログラムについてです

Posted: 2010年4月14日(水) 14:47
by ookami
喜んでいただけてよかったです。

理解のために、最初のエラーについて説明します。

(1) 'bullet' : 定義されていない識別子です。
(2) '.y' の左側はクラス、構造体、共用体でなければなりません
(3) '.num' の左側はクラス、構造体、共用体でなければなりません

の、(2)(3)は(1)に引っ張られて出ているものと思いますので、(1)について説明します。



元の定義が分からないのですが、例えば

struct BULLET {
double x; // y以降は省略します。
};

struct SHOT {
BULLET bullet[8]; // 8は適当です。最大値です。
};

SHOT shot[8]; // 8は適当です。最大値です。

...と宣言されていた場合、

直接アクセスできる変数は
shot[0].bullet[0].x
shot[0].bullet[1].x
:
shot[0].bullet[7].x

shot[1].bullet[0].x
shot[1].bullet[1].x
:
shot[1].bullet[7].x

:
:
:

shot[7].bullet[0].x
shot[7].bullet[1].x
:
shot[7].bullet[7].x


となります。ここまではよろしいでしょうか。bulletがSHOTのメンバであることに注意です。


問題の、
return atan2(ch.y-enemy[shot[bullet[n].y].num].y,ch.x-enemy[shot[bullet[n].x].num].x);
の中で、
bullet[n]
という部分。bulletはSHOTのメンバなので、(限定的な言い方ですが)「どのSHOTのbulletか分からない」、よって「bulletは定義されていない」というわけです。


>shotH.cppのほうを変えればよかったんですね。
とのことですが、shot.cpp 側を変えて対応することもできます。

-- shot.cpp
double shotatan3(int n,int i){
return atan2(ch.y-shot[n].bullet.y,ch.x-shot[n].bullet.x);
}

-- shotH.cpp
shot[n].bullet.angle = shotatan3(n,i);

理解のしやすいように組むのがいいと思います。

Re:途中から自機狙いに変化するプログラムについてです

Posted: 2010年4月14日(水) 17:02
by
丁寧にありがとうございます。

すみませんけど、もう一つ質問いいでしょうか?

double shotatan3(int n,int i){
return atan2(ch.y-shot[n].bullet.y,ch.x-shot[n].bullet.x);
}
とは自機とn番目のショットで出された、弾iと自機との角度を返す、ということですよね。

ものすごく初歩的な質問で申し訳ありませんが、

double shotatan3(int n,int i){
return atan2(ch.y-shot[n].bullet.y,ch.x-shot[n].bullet.x);
}
の(int n,int i)の意味は何なのでしょうか?

double shotatan3{
  int n,i;
return atan2(ch.y-shot[n].bullet.y,ch.x-shot[n].bullet.x);
}

とは違うのでしょうか?

Re:途中から自機狙いに変化するプログラムについてです

Posted: 2010年4月14日(水) 17:31
by ひよこ
引数として内部で宣言しているの違いです。
内部で宣言しただけだとすごい値が勝手に入ります。
引数を使うことで外部から値を設定しているのです。

Re:途中から自機狙いに変化するプログラムについてです

Posted: 2010年4月14日(水) 18:43
by ookami
携帯からいけるかなっと。例を示します。

■例1

int func(int n){
return n+1;
}

i=func(3); // i に 4 が代入される

■例2

int func(){
int n;
return n+1;
}

i=func(); // i に 何が代入されるかわからない。0かもしれないし、123456789かもしれない。ひよこさんのいう「すごい値」のこと
i=func(3); // また、これは実行できない。funcが引数をとらない関数として実装されているため。3 の代入先がないということです。 画像

Re:途中から自機狙いに変化するプログラムについてです

Posted: 2010年4月14日(水) 20:09
by
なるほど!よくわかりました!
本当に丁寧にありがとうございました!