トップページ > 過去ログ > 記事閲覧
敵のショット
名前:本田 日時: 2010/01/17 21:14

こんばんは 現在敵のショットを作っています。しかしながら私が実行した所真っ直ぐ飛んでいくはずの弾が真っ直ぐに進みません。また、敵の10Wayショットも作成したのですが、こちらは描画すらされませんでした。よろしければ皆様のお力を貸していただければ幸いです 尚ソースの量の都合上10Wayは別記事に書かせていただきます。 大変申し訳ありません。弾を真下に発射するソースは自力で解決できました。 ↓敵の弾を直線状に発射するプログラム void enemyshot1(){ GetGraphSize( teki , &Ex , &Ey ) ; //敵画像のサイズチェック Ex:敵xサイズ Ey:敵yサイズ GetGraphSize( shot2 , &ESx , &ESy ) ; //敵ショットのサイズチェック ESx:敵ショットxサイズ ESy敵ショットyサイズ for(j=0; j<40; j++){ if(ESFlag[j] == 0){ eshotx1[j] = (Ex - ESx) / 2 + ex[0]; //弾のx座標の初期化 eshoty1[j] = (Ey - ESy) / 2 + ey[0]; //弾のy座標の初期化 ESFlag[j] = 1; } } for(k=0;k<40;k++){ if(ESFlag[k] == 1){ eshoty1[k] += 10; if(eshoty1[k] > 500){ ESFlag[k] = 0; } if(eshotx1[k] < 430 && eshotx1[k] > -30 && eshoty1[k] > -30 && eshoty1[k] < 430){ DrawGraph(eshotx1[k],eshoty1[k],shot2,TRUE); } } } }

Page: 1 |

Re: 敵のショット ( No.1 )
名前:本田 日時:2010/01/17 21:17

10wayのソースです。 参考HPはttp://www5.big.or.jp/~high/VENIO/kouza/are08.htm こちらの資料を参考とさせていただきました。 void enemyshot3(){ GetGraphSize( teki , &Ex , &Ey ) ; //敵画像のサイズチェック GetGraphSize( shot2 , &ESx2 , &ESy2 ) ; //弾画像のサイズチェック for(i=0;i<400; i++){ //サイズ、角度、スピード決定 eshotx3[i] = (Ex2 + ESx2) / 2 - ex[1];//敵サイズ+弾サイズ/2-敵座標 eshoty3[i] = (Ey2 + ESy2) / 2 - ey[1];//敵ショットのy軸 //10way弾 if(i == 0 || i % 10 == 0){ //iが0、10、20、30…なら〜 TargetX3[i] = 600 - eshotx3[i]; //目標までのxの距離を出す TargetY3[i] = 300 - eshoty3[i]; Angle3[i] = atan2((double)TargetX3[i],(double)TargetY3[i]); //発射角度 Speedx3[i] = cos((double)Angle3[i]) * speed3; //移動量 Speedy3[i] = sin((double)Angle3[i]) * speed3; } if(i == 1 || i - 1 % 10 == 0){ //iが1、11、21、31…なら〜 TargetX3[i] = 550 - eshotx3[i]; TargetY3[i] = 350 - eshotx3[i]; Angle3[i] = atan2((double)TargetX3[i],(double)TargetY3[i]); //発射角度 Speedx3[i] = cos((double)Angle3[i]) * speed3; //移動量 Speedy3[i] = sin((double)Angle3[i]) * speed3; } if(i == 2 || i - 2 % 10 == 0){ //iが2、12、22、32…なら〜 TargetX3[i] = 500 - eshotx3[i]; TargetY3[i] = 400 - eshotx3[i]; Angle3[i] = atan2((double)TargetX3[i],(double)TargetY3[i]); //発射角度 Speedx3[i] = cos((double)Angle3[i]) * speed3; //移動量 Speedy3[i] = sin((double)Angle3[i]) * speed3; } if(i == 3 || i - 3 % 10 == 0){ TargetX3[i] = 450 - eshotx3[i]; TargetY3[i] = 500 - eshotx3[i]; Angle3[i] = atan2((double)TargetX3[i],(double)TargetY3[i]); //発射角度 Speedx3[i] = cos((double)Angle3[i]) * speed3; //移動量 Speedy3[i] = sin((double)Angle3[i]) * speed3; } if(i == 4 || i - 4 % 10 == 0){ TargetX3[i] = 400 - eshotx3[i]; TargetY3[i] = 500 - eshotx3[i]; Angle3[i] = atan2((double)TargetX3[i],(double)TargetY3[i]); //発射角度 Speedx3[i] = cos((double)Angle3[i]) * speed3; //移動量 Speedy3[i] = sin((double)Angle3[i]) * speed3; } if(i == 5 || i - 5 % 10 == 0){ TargetX3[i] = 350 - eshotx3[i]; TargetY3[i] = 550 - eshotx3[i]; Angle3[i] = atan2((double)TargetX3[i],(double)TargetY3[i]); //発射角度 Speedx3[i] = cos((double)Angle3[i]) * speed3; //移動量 Speedy3[i] = sin((double)Angle3[i]) * speed3; } if(i == 6 || i - 6 % 10 == 0){ TargetX3[i] = 300 - eshotx3[i]; TargetY3[i] = 500 - eshotx3[i]; Angle3[i] = atan2((double)TargetX3[i],(double)TargetY3[i]); //発射角度 Speedx3[i] = cos((double)Angle3[i]) * speed3; //移動量 Speedy3[i] = sin((double)Angle3[i]) * speed3; } if(i == 7 || i - 7 % 10 == 0){ TargetX3[i] = 200 - eshotx3[i]; TargetY3[i] = 500 - eshotx3[i]; Angle3[i] = atan2((double)TargetX3[i],(double)TargetY3[i]); //発射角度 Speedx3[i] = cos((double)Angle3[i]) * speed3; //移動量 Speedy3[i] = sin((double)Angle3[i]) * speed3; } if(i == 8 || i - 8 % 10 == 0){ TargetX3[i] = 100 - eshotx3[i]; TargetY3[i] = 500 - eshotx3[i]; Angle3[i] = atan2((double)TargetX3[i],(double)TargetY3[i]); //発射角度 Speedx3[i] = cos((double)Angle3[i]) * speed3; //移動量 Speedy3[i] = sin((double)Angle3[i]) * speed3; } if(i == 9 || i - 9 % 10 == 0){ TargetX3[i] = 0 - eshotx3[i]; TargetY3[i] = 500 - eshotx3[i]; Angle3[i] = atan2((double)TargetX3[i],(double)TargetY3[i]); //発射角度 Speedx3[9] = cos((double)Angle3[i]) * speed3; //移動量 Speedy3[9] = sin((double)Angle3[i]) * speed3; } if(i == 10 || i - 10 % 10 == 0){ TargetX3[i] = -10 - eshotx3[i]; TargetY3[i] = 450 - eshotx3[i]; Angle3[i] = atan2((double)TargetX3[i],(double)TargetY3[i]); //発射角度 Speedx3[i] = cos((double)Angle3[i]) * speed3; //移動量 Speedy3[i] = sin((double)Angle3[i]) * speed3; } if(ESFlag2[i] == 0){ ESFlag2[i] =1; } break; }//for終了 for(i=0;i<400;i++){ if(ESFlag2[i]==1){ //弾のフラグがたってるなら //移動処理 eshotx3[i]+=Speedx3[i]; //弾の移動x eshoty3[i]+=Speedy3[i]; //弾の移動y if(eshoty3[i] > 500 || eshotx3[i] < -10 || eshotx3[i] > 510){ //弾が画面外に出たら ESFlag2[i] = 0; } DrawGraph(eshotx3[i],eshoty3[i],shot2,FALSE); } } }
Re: 敵のショット ( No.2 )
名前:いっち 日時:2010/01/17 22:03

( No.1 )のソースについてですが、最初のfor文の末尾(91行目ぐらい)で 無条件にbreakを入れているために動かないのではないでしょうか?
Re: 敵のショット ( No.3 )
名前:本田 日時:2010/01/19 23:25

>いっちさん 一応break文はずしてみたのですがだめでした。 実行した所左上に画像は表示されますが移動しません。 一応関数を呼び出す部分も乗っけて起きます void enemy(){ if(DFlag[0] == 1){ ex[0]-=5.0; if(ey[0] > -30 && ey[0] <510 && ex[0] > -30 && ex[0] < 430){ DrawGraph(ex[0],ey[0],teki,TRUE); enemyshot3(); } } }
Re: 敵のショット ( No.4 )
名前:さかな 日時:2010/01/20 17:53

あの、enemyshot3は発射時に呼び出されるものですよね。 発射の処理と、描画の処理が1つの関数に入っていたら、1フレームごとに弾が初期化されるので 弾がいつまでも敵のところにあるままだと思います。 いっちさんのおっしゃるようにbreak文をはずし、 enemyshot3とenemyshotdraw3のように描画と発射を分け、描画は毎フレーム呼び出して、 発射は必要なときだけ呼び出すようにしたらよいと思います。 (もうしてたらすみません)
Re: 敵のショット ( No.5 )
名前:いっち 日時:2010/01/20 18:17

以下の3点を修正すれば動くような気がします。 1. 最初のforループのbreakをはずす。( No.2 )に記載済み 2. 最初のforループの開始直後に以下の行を挿入 if(ESFlag2[i]==1) continue; 3. 最初のforループの中のif条件式(10箇所?)を修正する if(i == 1 || i - 1 % 10 == 0){ ↓↓↓ if(i == 1 || (i - 1) % 10 == 0){ ↓↓↓ (または) if( i % 10 == 1 ){ しかし、このままだと、400発の弾がいっぺんに撃たれると思います。

Page: 1 |