敵のショット位置について
敵のショット位置について
初めまして、いつも拝見させてもらってます。ここのソースファイルを写していたんですが、敵が移動しても敵のショットの出る場所が変わりません。また、敵を倒してもショットが出続けるんですけど、どうすればいいか教えてください。
Re:敵のショット位置について
敵の現在位置をショットの初期位置に設定する。
条件文を利用して、敵が死んだ場合のフラグを立てる。
フラグにしたがって弾を発射するかどうか決める。
ソースないので、これぐらいかな?
条件文を利用して、敵が死んだ場合のフラグを立てる。
フラグにしたがって弾を発射するかどうか決める。
ソースないので、これぐらいかな?
Re:敵のショット位置について
ソースがないのでなんとも断定できませんが、
シューティングゲームの館に
------------------------------------
弾が持つべき構造体の情報は以下これだけあります。
・弾が発射されたかどうかを示すflag
・弾がどんなパターンの動きをするか示すpattern
・弾が発射されて何カウントたったかカウントするcount
・弾が何の画像であるか示すimg
・弾が発射した瞬間の初期座標を示す mem_ex , mem_ey ※1
・弾が発射した瞬間のプレイヤーの座標を示すmem_px , mem_py ※2
・敵が弾を発射した時の位置と、プレイヤーの位置から計算した弾の飛んでくる角度ラジアンを示すAngle[ENEMY_TOTAL_SHOT_NUM];//[200] ※3
・そして、先ほど構造体で示した、200個のココの弾情報EnemyShots[ENEMY_TOTAL_SHOT_NUM]; //[200] ※4
沢山ありますが、全部で弾が持つべき情報はこれだけあります。
※1:発射した瞬間の初期座標は、敵が発射するわけですから、その時の敵の座標になります。
※2:プレイヤーがいる場所へショットをうつパターンの時に必要になります。
※3:時間差で弾を発射するときもあるので、角度を格納する変数は弾の数だけ用意する。
※4:構造体の中に、構造体をここで宣言しています。
これらの事を実際プログラムで宣言するとこうなります。
//個々の弾が持つ情報
とありますのでもう一度読み返されることをオススメします。
(以上、宣伝でした(笑))
シューティングゲームの館に
------------------------------------
弾が持つべき構造体の情報は以下これだけあります。
・弾が発射されたかどうかを示すflag
・弾がどんなパターンの動きをするか示すpattern
・弾が発射されて何カウントたったかカウントするcount
・弾が何の画像であるか示すimg
・弾が発射した瞬間の初期座標を示す mem_ex , mem_ey ※1
・弾が発射した瞬間のプレイヤーの座標を示すmem_px , mem_py ※2
・敵が弾を発射した時の位置と、プレイヤーの位置から計算した弾の飛んでくる角度ラジアンを示すAngle[ENEMY_TOTAL_SHOT_NUM];//[200] ※3
・そして、先ほど構造体で示した、200個のココの弾情報EnemyShots[ENEMY_TOTAL_SHOT_NUM]; //[200] ※4
沢山ありますが、全部で弾が持つべき情報はこれだけあります。
※1:発射した瞬間の初期座標は、敵が発射するわけですから、その時の敵の座標になります。
※2:プレイヤーがいる場所へショットをうつパターンの時に必要になります。
※3:時間差で弾を発射するときもあるので、角度を格納する変数は弾の数だけ用意する。
※4:構造体の中に、構造体をここで宣言しています。
これらの事を実際プログラムで宣言するとこうなります。
//個々の弾が持つ情報
typedef struct{ int flag; double x,y; } ENEMY_SHOTS_t; //1組の弾が持つ情報 typedef struct{ int flag,pattern,counter,img; double mem_ex,mem_ey,mem_px,mem_py,Angle[ENEMY_TOTAL_SHOT_NUM];//[200]; ENEMY_SHOTS_t EnemyShots[ENEMY_TOTAL_SHOT_NUM];//[200]; } ENEMY_SHOT_t;------------------------------------
とありますのでもう一度読み返されることをオススメします。
(以上、宣伝でした(笑))
Re:敵のショット位置について
シューティングの館のソース見てきました、多分ここだと思うんですけど
void EnemyShotPattern2(int i){
for(int j=0;j<10;j++){//計10発撃つ
if(EnemyShot.counter==20*j){//20カウントに1回ずつ発射。
EnemyShot.EnemyShots[j].flag=1;//発射フラグをたてる
EnemyShot.EnemyShots[j].x=EnemyShot.mem_ex;//弾の初期座標に敵の座標を代入
EnemyShot.EnemyShots[j].y=EnemyShot.mem_ey;//y同様
//敵とプレイヤーとの角度を計算
EnemyShot.Angle[0] = atan2(EnemyShot.mem_py-EnemyShot .mem_ey,EnemyShot.mem_px-EnemyShot[i].mem_ex);
StopSoundMem(sound_enemy_shot[0]);//前の音がかぶさらないようにショットの音を 消し
PlaySoundMem(sound_enemy_shot[0],DX_PLAYTYPE_BACK);//ショット音を流す
}
EnemyShot[i].EnemyShots[j].x+=PATTERN1SPEED*cos(EnemyShot[i].Angle[0]);//x座標の増 加
EnemyShot[i].EnemyShots[j].y+=PATTERN1SPEED*sin(EnemyShot[i].Angle[0]);//y座標の増 加
}
}
これだと、敵が移動しながら弾を発射すると、最初に弾を発射した座標からしか弾が発射されません。移動しながら弾を撃つ場合、どうすればいいか、教えてもらえると助かります。
void EnemyShotPattern2(int i){
for(int j=0;j<10;j++){//計10発撃つ
if(EnemyShot.counter==20*j){//20カウントに1回ずつ発射。
EnemyShot.EnemyShots[j].flag=1;//発射フラグをたてる
EnemyShot.EnemyShots[j].x=EnemyShot.mem_ex;//弾の初期座標に敵の座標を代入
EnemyShot.EnemyShots[j].y=EnemyShot.mem_ey;//y同様
//敵とプレイヤーとの角度を計算
EnemyShot.Angle[0] = atan2(EnemyShot.mem_py-EnemyShot .mem_ey,EnemyShot.mem_px-EnemyShot[i].mem_ex);
StopSoundMem(sound_enemy_shot[0]);//前の音がかぶさらないようにショットの音を 消し
PlaySoundMem(sound_enemy_shot[0],DX_PLAYTYPE_BACK);//ショット音を流す
}
EnemyShot[i].EnemyShots[j].x+=PATTERN1SPEED*cos(EnemyShot[i].Angle[0]);//x座標の増 加
EnemyShot[i].EnemyShots[j].y+=PATTERN1SPEED*sin(EnemyShot[i].Angle[0]);//y座標の増 加
}
}
これだと、敵が移動しながら弾を発射すると、最初に弾を発射した座標からしか弾が発射されません。移動しながら弾を撃つ場合、どうすればいいか、教えてもらえると助かります。
Re:敵のショット位置について
弾を撃つことだけ見れば、TNB さんの思っている通り
「最初に弾を発射した座標からしか弾が発射されません。」
となるかもしれません。
問題は
EnemyShot.mem_ex
に敵の座標をいつ入れるのか。のほうじゃないでしょうか?
概念説明のところに、
-------------------------------
発射させるのは簡単です。発射フラグを立てるだけです。
つまりenemy.flag=1;をするのです。
ただ、発射に際して、先ほど構造体で宣言しただらだらした情報を色々初期化する必要があります。
一つ一つみていってください。
-------------------------------
があります。(敵の移動パターンルーチン)
コレをしっかり記述してあれば、敵の移動によってきちんと弾座標に反映されるはずです。
どうでしょうか?
「最初に弾を発射した座標からしか弾が発射されません。」
となるかもしれません。
問題は
EnemyShot.mem_ex
に敵の座標をいつ入れるのか。のほうじゃないでしょうか?
概念説明のところに、
-------------------------------
発射させるのは簡単です。発射フラグを立てるだけです。
つまりenemy.flag=1;をするのです。
ただ、発射に際して、先ほど構造体で宣言しただらだらした情報を色々初期化する必要があります。
一つ一つみていってください。
void EnemyPattern2(int i){
int j;
if(enemy.counter<50)
enemy.y+=4.0f;
if(enemy.counter==75){//エネミーカウンターが75の時
for(j=0;j < ENEMY_TOTAL_NUM ;j++)//発射されていない弾を探す。
if(EnemyShot[j].flag==0)//あったらそこでiを保持してブレイク
break;
EnemyShot[j].flag=1;//発射フラグを立てる
EnemyShot[j].mem_ex=enemy.x;//弾の初期x座標を敵の座標から設定する
EnemyShot[j].mem_ey=enemy.y;//同様y
EnemyShot[j].mem_px=Player.x;//うつ瞬間のプレイヤーの座標を記憶
EnemyShot[j].mem_py=Player.y;//同様y
EnemyShot[j].counter=0;//カウンターを初期化
EnemyShot[j].pattern=1;//ショットパターン1とする※1
EnemyShot[j].img=0;//画像タイプは0とする※2
}
if(enemy.counter>100)
enemy.y-=4.0f;
}
-------------------------------
があります。(敵の移動パターンルーチン)
コレをしっかり記述してあれば、敵の移動によってきちんと弾座標に反映されるはずです。
どうでしょうか?
Re:敵のショット位置について
返信有難うございます。やそさんの書いてくださったソースはenemy.cppのやつですよね?赤色にのソースの部分をどこかに代入すればいいんでしょうか?普通にコンパイルして実行しても、連続射撃の弾は最初に発射された座標から出てきてしまうんですが。
Re:敵のショット位置について
連続ショットですか。まあ、連続であろうと単独のボムであろうと関係なさそうですが。
どこかに代入すれば・・・ってどこにも書いてないんですか?
敵は移動するんですよね?
敵の実体(画)が移動しているなら、その移動の仕方にあった移動パターンの関数を通過していますよね?
その移動パターンの関数に追加すればいいんじゃないですか?
敵がある地点から弾を撃つ
弾発射
敵移動
弾発射
敵移動
・
・
・
と言う流れで処理が行われていれば、必ず反映されるはずなんですが・・・
これ以上はTNBさんがソースをさらさない限り突き詰められません^^;
[color=White" size="1](なんか意識のずれもチョット感じていたり・・・)[/color]
どこかに代入すれば・・・ってどこにも書いてないんですか?
敵は移動するんですよね?
敵の実体(画)が移動しているなら、その移動の仕方にあった移動パターンの関数を通過していますよね?
その移動パターンの関数に追加すればいいんじゃないですか?
敵がある地点から弾を撃つ
弾発射
敵移動
弾発射
敵移動
・
・
・
と言う流れで処理が行われていれば、必ず反映されるはずなんですが・・・
これ以上はTNBさんがソースをさらさない限り突き詰められません^^;
[color=White" size="1](なんか意識のずれもチョット感じていたり・・・)[/color]
Re:敵のショット位置について
各関数や変数は何をしているのかの説明を自分で付け加える。
弾が発射される座標を示しているのを見つける。
これが、いつ更新されているか見つける。
その更新しているときが、毎回呼ばれているか?
そのとき、代入されている座標は?
適当に抜き出して切り貼りしたってプログラムにはならないので、各々が何を示しているかを意識してみてください^^
多分大変かと思いますが、何度もそうやって見ていると自然となれるはずです。
弾が発射される座標を示しているのを見つける。
これが、いつ更新されているか見つける。
その更新しているときが、毎回呼ばれているか?
そのとき、代入されている座標は?
適当に抜き出して切り貼りしたってプログラムにはならないので、各々が何を示しているかを意識してみてください^^
多分大変かと思いますが、何度もそうやって見ていると自然となれるはずです。
Re:敵のショット位置について
本当にあちこちで、混乱されている方がいらっしゃるようで、責任感じています;
シューティングの館は近々全く違うものにリニューアル予定です。
しばしお待ち下さい・・。
サンプルソースの中で、
「敵の情報」と「ショットの情報」とは全く分離して作られています。
そのせいで、敵が死んでもショットには影響しません。
敵の情報は
「こういう風に出て、ここでAを発射」
という感じ。
ショットの情報は
「受け取った座標でAを発射し続ける」
と言う感じ。
そこで、ショット情報に「どの敵(n)から発射されたものか」を示す変数を追加し、
nの敵が死んだら、そのショットはもう登録しない、起動計算のみ行うように変更してください。
シューティングの館は近々全く違うものにリニューアル予定です。
しばしお待ち下さい・・。
サンプルソースの中で、
「敵の情報」と「ショットの情報」とは全く分離して作られています。
そのせいで、敵が死んでもショットには影響しません。
敵の情報は
「こういう風に出て、ここでAを発射」
という感じ。
ショットの情報は
「受け取った座標でAを発射し続ける」
と言う感じ。
そこで、ショット情報に「どの敵(n)から発射されたものか」を示す変数を追加し、
nの敵が死んだら、そのショットはもう登録しない、起動計算のみ行うように変更してください。
Re:敵のショット位置について
ショット位置についての過去ログを調べているとここに行き着いたので質問させてください。
>ショット情報に「どの敵(n)から発射されたものか」を示す変数を追加し、
nの敵が死んだら、そのショットはもう登録しない、起動計算のみ行うように変更してください。
とありますが、これは「シューティングゲームの館」で公開している「enemy.cpp」のソース内のswitch文
の中にある、enemy[i]をenemy_shot.cppに認識させるという事なのでしょうか?
それとも新しい変数をenemy_shot.cpp内に作るという事でしょうか?
>ショット情報に「どの敵(n)から発射されたものか」を示す変数を追加し、
nの敵が死んだら、そのショットはもう登録しない、起動計算のみ行うように変更してください。
とありますが、これは「シューティングゲームの館」で公開している「enemy.cpp」のソース内のswitch文
void EnemyCalcDisp(){ int i; for(i=0;i<100;i++) if(enemy.flag==0) break; switch(counter){//今回はパターン2の動きだけさせる case 50: enemy.pattern=2; //どういう軌道を描くか enemy.flag=1; //出現フラグを立てる enemy.counter=0;//出現して何カウント目か測るカウンター初期化 enemy.size=0.5f;//敵の大きさ enemy.x=100.0; //xの初期座標 enemy.y=-10.0; //yの初期座標 break; default: break; } int enemy_img[8]={0,1,2,3,4,3,2,1}; for(i=0;i<100;i++){ if(enemy.flag==1){ enemy.counter++; DrawRotaGraph( (int)enemy.x , (int)enemy[i].y , enemy[i].size , 0.0f , img_enemy1[enemy_img[counter%32/4]] , TRUE ) ; if(enemy[i].x<0.0-MONSTER1_X_SIZE/2.0*enemy[i].size || enemy[i].x>420.0+MONSTER1_X_SIZE/2.0*enemy[i].size || enemy[i].y<0.0-MONSTER1_Y_SIZE/2.0*enemy[i].size || enemy[i].y<0.0-MONSTER1_Y_SIZE/2.0*enemy[i].size) enemy[i].flag=0; } } }
の中にある、enemy[i]をenemy_shot.cppに認識させるという事なのでしょうか?
それとも新しい変数をenemy_shot.cpp内に作るという事でしょうか?
Re:敵のショット位置について
ショット情報と敵情報は全く違うものとして扱っています。
よって、どの敵から発射された弾かという情報は弾に持たせないといけません。
enemyのiが敵のIDだとするなら、そのIDを弾情報に持たせ、
そのIDが無効になったら(敵が倒されたら)、
EnemyShotPattern関数で弾を登録しないようにしないといけません。
よって、どの敵から発射された弾かという情報は弾に持たせないといけません。
enemyのiが敵のIDだとするなら、そのIDを弾情報に持たせ、
そのIDが無効になったら(敵が倒されたら)、
EnemyShotPattern関数で弾を登録しないようにしないといけません。
Re:敵のショット位置について
回答ありがとうございます。
敵のIDを弾情報に持たせるには、
EnemyShot[ENEMY_TOTAL_NUM]の構造体にenemy[ENEMY_TOTAL_NUM]を追加することで可能になるのではないかと私は考えたのですが、どうやら間違っているようで・・・
下記はGlobalVariable.hとenemy_shot.cppのソースです。
----------------------------GlobalVariable.h-----------------------------------
このようにソースを変更してみたのですが、発射された弾はその場で停滞するような動作になってしまいました。
質問ばかりで申し訳ありませんが、回答よろしくお願いします。
敵のIDを弾情報に持たせるには、
EnemyShot[ENEMY_TOTAL_NUM]の構造体にenemy[ENEMY_TOTAL_NUM]を追加することで可能になるのではないかと私は考えたのですが、どうやら間違っているようで・・・
下記はGlobalVariable.hとenemy_shot.cppのソースです。
----------------------------GlobalVariable.h-----------------------------------
//敵 typedef struct{ double x,y,size; int flag,counter,hp,pattern,range; } BODY_enemy_t; BODY_enemy_t enemy[ENEMY_TOTAL_NUM]; //[100] //個々の弾の情報 typedef struct{ int flag; double x,y,angle,disp_angle,speed; } ENEMY_SHOTS_t; //ENEMY_SHOTS_t EnemyShots[ENEMY_TOTAL_SHOT_NUM]; //[200]; //1組の弾の情報 typedef struct{ int flag,pattern,counter,img; // double mem_ex,mem_ey,mem_px,mem_py,Angle[ENEMY_TOTAL_SHOT_NUM]; //[200]; double mem_ex,mem_ey,mem_px,mem_py,Enx[60],Eny[60]; //[200]; ENEMY_SHOTS_t EnemyShots[ENEMY_TOTAL_SHOT_NUM]; //[200]; BODY_enemy_t enemy[ENEMY_TOTAL_NUM]; //[100] } ENEMY_SHOT_t; ENEMY_SHOT_t EnemyShot[ENEMY_TOTAL_NUM]; //[100]; -----------------------------------enemy_shot.cpp-------------------------------------- //敵のショットパターン3 void EnemyShotPattern3(int i){ for(int j=0;j<10;j++){ if(EnemyShot.counter==20*j){ if(EnemyShot.enemy.flag=1){ //弾を発射する敵が出たら EnemyShot.EnemyShots[j].flag=1; //発射フラグを立てる EnemyShot.EnemyShots[j].x=EnemyShot.mem_ex; EnemyShot.EnemyShots[j].y=EnemyShot.mem_ey; //現在のプレイヤーの座標と、弾の初期座標からそれぞれ角度を計算する。 EnemyShot.EnemyShots[j].angle = atan2(Player.y-EnemyShot.mem_ey, Player.x-EnemyShot[i].mem_ex); StopSoundMem(sound_enemy_shot[0]); PlaySoundMem(sound_enemy_shot[0],DX_PLAYTYPE_BACK); } EnemyShot[i].EnemyShots[j].x+=PATTERN1SPEED*cos(EnemyShot[i].EnemyShots[j].angle); EnemyShot[i].EnemyShots[j].y+=PATTERN1SPEED*sin(EnemyShot[i].EnemyShots[j].angle); }else{ break; //敵のフラグが1以外(倒されたら)ループを抜ける } } }
このようにソースを変更してみたのですが、発射された弾はその場で停滞するような動作になってしまいました。
質問ばかりで申し訳ありませんが、回答よろしくお願いします。
Re:敵のショット位置について
一番簡単なのは・・
typedef struct{
int flag,id;
double x,y,angle,disp_angle,speed;
} ENEMY_SHOTS_t;
ここにidを追加し、どの敵から発射されたものかを記憶します。
敵は弾にあたったらflagを2にします。
敵の描画はflagが1の時のみ行います。
idの敵のflagが2の時は発射しないようにします。
全ての弾が画面外になったら、idの敵のフラグは0にします。
・・とこれが一番早い実装ではないでしょうか。
しかし、お遊び程度しか対応しないこのコード・・。
本格的に作ることが出来ません。
もし本格的に作るのならば、「ステージの作り方」のトピの最後にあるサンプルを参考に、ご自分でお作りになったほうがいいかもしれません(_ _|||)
HPの更新が遅くなってすみません(汗
Re:敵のショット位置について
すばやい回答ありがとうございます。
管理人さんの方法で試してみようと思います。
管理人さんも色々忙しいと思うので、更新できないのは仕方ないと思います。
しかし、管理人さんのHPはかなり参考にしていますし、私にとってとても役立っています。
これからもサイト運営頑張ってください!!
また分からない事があったら質問をするかもしれませんが、そのときはよろしくお願いしますm(_ _)m
管理人さんの方法で試してみようと思います。
管理人さんも色々忙しいと思うので、更新できないのは仕方ないと思います。
しかし、管理人さんのHPはかなり参考にしていますし、私にとってとても役立っています。
これからもサイト運営頑張ってください!!
また分からない事があったら質問をするかもしれませんが、そのときはよろしくお願いしますm(_ _)m
Re:敵のショット位置について
またまた失礼します。
敵のショット位置について考察していたのですが、どうもうまくいきません。if文の分岐がちゃんとしていないのが原因だと思うのですが、なかなか解決しないためまた質問させてください。
先日アドバイスをいただいたことを参考に、敵の弾情報に変数idをもたせ、それをショットパターン内のif文で分岐させようと考えたプログラムです。これだと今までのように、ショットの動作に入ってしまった敵を倒しても弾が出続けてしまいます。
お忙しいとは思いますが、回答のほうよろしくお願いします。
同じ質問ばかりで申し訳ありませんが、よろしくお願いします。
敵のショット位置について考察していたのですが、どうもうまくいきません。if文の分岐がちゃんとしていないのが原因だと思うのですが、なかなか解決しないためまた質問させてください。
先日アドバイスをいただいたことを参考に、敵の弾情報に変数idをもたせ、それをショットパターン内のif文で分岐させようと考えたプログラムです。これだと今までのように、ショットの動作に入ってしまった敵を倒しても弾が出続けてしまいます。
お忙しいとは思いますが、回答のほうよろしくお願いします。
------------------------------------GlobalVariable.h-----------------------------------------------
//敵
typedef struct{
double x,y,size;
int flag,counter,hp,pattern,range;
} BODY_enemy_t;
BODY_enemy_t enemy[ENEMY_TOTAL_NUM]; //[100]
//個々の弾の情報
typedef struct{
int flag,id;
double x,y,angle,disp_angle,speed;
} ENEMY_SHOTS_t;
//ENEMY_SHOTS_t EnemyShots[ENEMY_TOTAL_SHOT_NUM]; //[200];
//1組の弾の情報
typedef struct{
int flag,pattern,counter,img;
double mem_ex,mem_ey,mem_px,mem_py,Enx[60],Eny[60]; //[200];
ENEMY_SHOTS_t EnemyShots[ENEMY_TOTAL_SHOT_NUM]; //[200];
BODY_enemy_t enemy[ENEMY_TOTAL_NUM]; //[100]
} ENEMY_SHOT_t;
ENEMY_SHOT_t EnemyShot[ENEMY_TOTAL_NUM]; //[100];
------------------------------------player.cpp-----------------------------------------------
//自機のショットと敵の当たり判定処理
void CollisionDetection(){
for(int i=0;i<PLAYER_MAX_SHOT1;i++){ //ショットの全列分
for(int j=0;j<PLAYER_MAX_SHOT2;j++){ //1列全弾分
if(PlayerShot[j].flag==1){ //その弾が発射中なら
for(int s=0;s<ENEMY_TOTAL_NUM;s++){ //全敵100体分
if(enemy.flag==1){ //その敵が出現中なら
double x,y;
int range;
x=(int)(PlayerShot[j].x-enemy.x);
y=(int)(PlayerShot[j].y-enemy.y);
switch(i){
case 0: //0列目と
case 5: //5列目と
case 6: //6列目の
range=12; //大きさは半径12
break;
default:
range=9; //大きさは半径9
break;
}
//当たり判定処理
if((int)sqrt(x*x+y*y) < range+enemy.range){ //当たり判定内なら
PlayerShot[j].flag=0;
enemy.hp--;
if(enemy.hp==0){
EnemyShot.EnemyShots[j].id=enemy.flag=2;
enemy.flag=0; //表示フラグを戻す
//EnemyShot.flag=0;
PlayerShot[j].flag=0; //当たった弾を消す
if(CheckSoundMem(sound_enemy_death)==1){ //消滅音が鳴っていなかったら
StopSoundMem(sound_enemy_death); //とめて
}
PlaySoundMem(sound_enemy_death, DX_PLAYTYPE_BACK); //消滅音を鳴らす
}
}
}
}
}
}
}
}
------------------------------------enemy_shot.cpp-----------------------------------------------
void EnemyShotPattern3(int i){
for(int s=0;s<ENEMY_TOTAL_NUM;s++){
if(enemy.flag==1){
break;
}
}
for(int j=0;j<10;j++){
EnemyShot.EnemyShots[j].id=enemy[s].flag=1;
if(EnemyShot.counter==20*j){
if(EnemyShot.EnemyShots[j].id=enemy[s].flag==1){
printfDx("1"); //テスト用に表示
EnemyShot.EnemyShots[j].flag=1;
EnemyShot[i].EnemyShots[j].x=EnemyShot[i].mem_ex;
EnemyShot[i].EnemyShots[j].y=EnemyShot[i].mem_ey;
//現在のプレイヤーの座標と、弾の初期座標からそれぞれ角度を計算する。
EnemyShot[i].EnemyShots[j].angle = atan2(Player.y-EnemyShot[i].mem_ey, Player.x-EnemyShot[i].mem_ex);
StopSoundMem(sound_enemy_shot[0]);
PlaySoundMem(sound_enemy_shot[0],DX_PLAYTYPE_BACK);
}
if(EnemyShot[i].EnemyShots[j].id=enemy[s].flag==2){
printfDx("2"); //テスト用に表示
}
}
EnemyShot[i].EnemyShots[j].x+=PATTERN1SPEED*cos(EnemyShot[i].EnemyShots[j].angle);
EnemyShot[i].EnemyShots[j].y+=PATTERN1SPEED*sin(EnemyShot[i].EnemyShots[j].angle);
}
}
同じ質問ばかりで申し訳ありませんが、よろしくお願いします。
Re:敵のショット位置について
EnemyShotPattern3 はいつ呼び出されていますか?
>//当たり判定処理
の後で呼び出さないと、いくら変数を変更しても無駄ではないでしょうか?
処理順として、
味方のキーが押されているか
押されたときの処理
味方が過去に撃った弾が敵に当たっているか
あたっていたら、敵の削除(ここで弾のフラグをOFFへ
敵の弾が味方にあたっていないか
あたっていたら、その処置
敵が弾を発射するタイミングであるかどうか判定
YESは一発発射(連射は時間によって遅らせたほうが良いかと思いますがどうでしょうか?
例えば、一秒間に6発打つ
タイマーでカウントして、前回のカウントからどれだけ変化しているか、
弾を撃つ回数を超えていないかどうか
1/6秒経過したかどうか
していたら、発射 & 発射した時間を保存
そして、この弾は何発目かを保存
こんな感じ?
時間を使って処理するので、キャラクター(敵味方)は時間を持つものとして変数を作る。
自分の処理順が回ってくるたびに、時間を取得して
現在取得した時間 - 過去の時間 =x
として、それぞれのキャラが持っている時間から引く
キャラの時間 -= x
弾を一発撃つたびにキャラの時間に1/6秒追加する
・・・ += 1/6
こんな処理を考えてみてはどうでしょうか?
ただ、敵が多くなると処理速度が遅くなりそうなので、全然実用化出来そうにないんですが・・・ww
あと、(ここが一番まとも!?
enemy_shot.cppの
for(int j=0;j<10;j++){
でまわしているところが、打ってるところかな?って思うのですが・・・これだと当たり判定処理あるんでしょうか?
>//当たり判定処理
の後で呼び出さないと、いくら変数を変更しても無駄ではないでしょうか?
処理順として、
味方のキーが押されているか
押されたときの処理
味方が過去に撃った弾が敵に当たっているか
あたっていたら、敵の削除(ここで弾のフラグをOFFへ
敵の弾が味方にあたっていないか
あたっていたら、その処置
敵が弾を発射するタイミングであるかどうか判定
YESは一発発射(連射は時間によって遅らせたほうが良いかと思いますがどうでしょうか?
例えば、一秒間に6発打つ
タイマーでカウントして、前回のカウントからどれだけ変化しているか、
弾を撃つ回数を超えていないかどうか
1/6秒経過したかどうか
していたら、発射 & 発射した時間を保存
そして、この弾は何発目かを保存
こんな感じ?
時間を使って処理するので、キャラクター(敵味方)は時間を持つものとして変数を作る。
自分の処理順が回ってくるたびに、時間を取得して
現在取得した時間 - 過去の時間 =x
として、それぞれのキャラが持っている時間から引く
キャラの時間 -= x
弾を一発撃つたびにキャラの時間に1/6秒追加する
・・・ += 1/6
こんな処理を考えてみてはどうでしょうか?
ただ、敵が多くなると処理速度が遅くなりそうなので、全然実用化出来そうにないんですが・・・ww
あと、(ここが一番まとも!?
enemy_shot.cppの
for(int j=0;j<10;j++){
でまわしているところが、打ってるところかな?って思うのですが・・・これだと当たり判定処理あるんでしょうか?
Re:敵のショット位置について
回答ありがとうございます。
返事が遅れてしまい申し訳ありません。
>EnemyShotPattern3 はいつ呼び出されていますか?
これは、enemy.cppのほうに書いてあるEnemypattern2のなかで呼び出しています。
ほぼサンプルのままですが…
-----------------------------enemy.cpp-----------------------------------
雷さんのアドバイスが私の頭でこんがらがっているので、勉強して理解したいと思います。
すみません…orz
>あと、(ここが一番まとも!?
>enemy_shot.cppの
>for(int j=0;j<10;j++){
>でまわしているところが、打ってるところかな?って思うのですが・・・これだと当たり判定処理あるんでしょうか?
そのとおりです。シューティングゲームの館にある「プレイヤーのいる方向に弾を10個発射」というプログラムを少し改変したものです。
plyaer.cppの中の
EnemyShot.EnemyShots[j].id=enemy.flag=2;
で、idに敵の情報を入れ、enemy_shot.cppの中でif分岐させようと考えています。
おそらくここのif文の処理が原因だと思います。
せっかく回答していただいたのに返信がかなり遅れてしまってすみませんでしたm(_ _)m
返事が遅れてしまい申し訳ありません。
>EnemyShotPattern3 はいつ呼び出されていますか?
これは、enemy.cppのほうに書いてあるEnemypattern2のなかで呼び出しています。
ほぼサンプルのままですが…
-----------------------------enemy.cpp-----------------------------------
//敵のパターン2 void EnemyPattern2(int i){ if(enemy.counter<50){ enemy.y+=4.0f; } if(enemy.counter==75){ for(int j=0;j<ENEMY_TOTAL_NUM;j++){ if(EnemyShot[j].flag==0){ break; } } EnemyShot[j].mem_ex=enemy.x; //敵のx座標 EnemyShot[j].mem_ey=enemy.y; //敵のy座標 EnemyShot[j].mem_px=Player.x; //プレイヤーのx座標 EnemyShot[j].mem_py=Player.y; //プレイヤーのy座標 EnemyShot[j].counter=0; //弾が発射されてからのカウンターの初期化 EnemyShot[j].flag=1; //弾が発射されたことを示すフラグを1に EnemyShot[j].pattern=3; //ショットパターンは3を指定 EnemyShot[j].img=0; //弾の画像 } if(enemy.counter>200){ enemy.y-=4.0f; } }
雷さんのアドバイスが私の頭でこんがらがっているので、勉強して理解したいと思います。
すみません…orz
>あと、(ここが一番まとも!?
>enemy_shot.cppの
>for(int j=0;j<10;j++){
>でまわしているところが、打ってるところかな?って思うのですが・・・これだと当たり判定処理あるんでしょうか?
そのとおりです。シューティングゲームの館にある「プレイヤーのいる方向に弾を10個発射」というプログラムを少し改変したものです。
plyaer.cppの中の
EnemyShot.EnemyShots[j].id=enemy.flag=2;
で、idに敵の情報を入れ、enemy_shot.cppの中でif分岐させようと考えています。
おそらくここのif文の処理が原因だと思います。
せっかく回答していただいたのに返信がかなり遅れてしまってすみませんでしたm(_ _)m
Re:敵のショット位置について
説明へたですいません^^;
いいたかったことを実装してみた。
弾がそろってない、絵が入ってない
など、いろいろありますが・・・・・・・
とりあえず実行は出来ます。
エンターで途切れます(敵の攻撃…みたいなものが
これでわかってもらえるかな?
シューティングの館はほとんどやっていないので、構成がさっぱりです^^;
いいたかったことを実装してみた。
弾がそろってない、絵が入ってない
など、いろいろありますが・・・・・・・
とりあえず実行は出来ます。
エンターで途切れます(敵の攻撃…みたいなものが
これでわかってもらえるかな?
シューティングの館はほとんどやっていないので、構成がさっぱりです^^;
Re:敵のショット位置について
雷さんおはようございます。
雷さんのソースコードをダウンロードし、弾と絵を用意して実行してみたところ、エンターを押すことで弾が途切れました。このソースコードを参考にしてプログラムを組んでみようと思います。
回答ありがとうございましたm(_ _)m
また質問するときがあるかもしれませんが、そのときはよろしくお願いします。
雷さんのソースコードをダウンロードし、弾と絵を用意して実行してみたところ、エンターを押すことで弾が途切れました。このソースコードを参考にしてプログラムを組んでみようと思います。
回答ありがとうございましたm(_ _)m
また質問するときがあるかもしれませんが、そのときはよろしくお願いします。
Re:敵のショット位置について
参考になるようでしたら、とてもうれしいです^^
本当はシューティングの館のを改良しようかな…って思ってたんですが、
やったことがなかったので、何が何しているかがわかりませんでした^^;
僕自身質問する立場の人間なので、回答が全然なっていなかったりすると思いますが…w
頑張ってくださいね!!!!!
本当はシューティングの館のを改良しようかな…って思ってたんですが、
やったことがなかったので、何が何しているかがわかりませんでした^^;
僕自身質問する立場の人間なので、回答が全然なっていなかったりすると思いますが…w
頑張ってくださいね!!!!!