龍神録についてです。
if(out_judge_enemyshot(s,n)==1){ //自機にその弾が接触していたら
//全ての弾を消しさる
という処理を追加してるのですが、
もっと、ゲームらしく、
自機と敵弾が接触した場所を中心に、円形に範囲を広げながら
周りの敵弾を一つずつ消しさるという処理を追加したいのですが、
この処理の計算方法はどうしたらいいでしょうか?
誰か分かる方がいましたら、教えてください・・
円形に敵弾を消しさるには
Re:円形に敵弾を消しさるには
敵の弾が当たったら、敵の弾でフラグが立ってる弾と自機との距離を調べて、距離が○○以下だったらフラグをオフにする。で、○○の値を加算していく。(○○はもちろん任意の変数です)
みたいな感じで出来るかもです(もっと効率の良い方法があるかもしれないですが(-.-;))
ちょっと試験期間なんで試して無いから駄目かもしれないです。
駄目だったら申し訳無いですけど僕にはわかんないです…
あと携帯からなんで見にくかったらすいません。
みたいな感じで出来るかもです(もっと効率の良い方法があるかもしれないですが(-.-;))
ちょっと試験期間なんで試して無いから駄目かもしれないです。
駄目だったら申し訳無いですけど僕にはわかんないです…
あと携帯からなんで見にくかったらすいません。
Re:円形に敵弾を消しさるには
初めて投稿させていただきます。
恐らく、東方風神録の被弾時のエフェクトを真似ているのだと思いますが、
“敵弾との当たり判定がある何も描画させないオブジェクト”を配置し、
時間の経過とともに当たり判定を広げる方法が、一番簡単だと思います。
処理の流れとしては、
1.被弾する
2.被弾位置にオブジェクトを配置する(初期化する)
3.オブジェクトの当たり判定を徐々に広げる
4.一定時間後、オブジェクトを破棄する(処理させない)
こんな感じになると思います。
ちなみに、円形に消したいならば、何も描画させないオブジェクトの当たり判定を円形にし、
円と四角形との当たり判定を行う必要があります。
参考になれば幸いです。
恐らく、東方風神録の被弾時のエフェクトを真似ているのだと思いますが、
“敵弾との当たり判定がある何も描画させないオブジェクト”を配置し、
時間の経過とともに当たり判定を広げる方法が、一番簡単だと思います。
処理の流れとしては、
1.被弾する
2.被弾位置にオブジェクトを配置する(初期化する)
3.オブジェクトの当たり判定を徐々に広げる
4.一定時間後、オブジェクトを破棄する(処理させない)
こんな感じになると思います。
ちなみに、円形に消したいならば、何も描画させないオブジェクトの当たり判定を円形にし、
円と四角形との当たり判定を行う必要があります。
参考になれば幸いです。
Re:円形に敵弾を消しさるには
ちと簡単ではありますが、サンプル作ってみました。
特に難しい事はしていないので、見たらわかると思いますが、
Zキーを押したらその瞬間からあたり判定円が広がり、接触中の弾を消しています。
こんな感じでどうでしょう?
特に難しい事はしていないので、見たらわかると思いますが、
Zキーを押したらその瞬間からあたり判定円が広がり、接触中の弾を消しています。
#include <math.h> #include "DxLib.h" //円周率 #define PI 3.141592654f #define PI2 (PI*2) //弾構造体 typedef struct{ int flag; float x,y; }Bullet_t; Bullet_t Bullet[49*65]; //半径、カウンタ、状態変数 float r,cnt,states; //初期化 void Ini(){ int x,y; for(y=0;y<49;y++){ for(x=0;x<65;x++){ Bullet[y*65+x].flag=1; Bullet[y*65+x].x=10*x; Bullet[y*65+x].y=10*y; } } } //円計算 void Calc(){ if(CheckHitKey(KEY_INPUT_Z)==1 && states==0) states=1; if(states==1){ r=sin(PI/2/120*cnt)*300; cnt++; if(cnt==120) states=2; } } //弾消去 void DeleteBullet(){ int i; for(i=0;i<49*65;i++){ if(Bullet.flag==1){ float x=320-Bullet.x; float y=240-Bullet.y; if( x*x+y*y < r*r ){ Bullet.flag=0; } } } } //弾描画 void GraphBullet(){ int i; for(i=0;i<49*65;i++){ if(Bullet.flag==1){ DrawCircle(Bullet.x,Bullet.y,2,GetColor(255,0,0),TRUE); } } } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){ if(ChangeWindowMode(TRUE)==-1 || DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1; Ini();//初期化 while(!ScreenFlip() && !ProcessMessage() && !ClearDrawScreen() && !CheckHitKey(KEY_INPUT_ESCAPE)){ Calc();//円計算 DeleteBullet();//弾消去 GraphBullet();//描画 } DxLib_End(); return 0; }
こんな感じでどうでしょう?