ページ 1 / 1
円形に敵弾を消しさるには
Posted: 2009年12月14日(月) 20:20
by ☆
龍神録についてです。
if(out_judge_enemyshot(s,n)==1){ //自機にその弾が接触していたら
//全ての弾を消しさる
という処理を追加してるのですが、
もっと、ゲームらしく、
自機と敵弾が接触した場所を中心に、円形に範囲を広げながら
周りの敵弾を一つずつ消しさるという処理を追加したいのですが、
この処理の計算方法はどうしたらいいでしょうか?
誰か分かる方がいましたら、教えてください・・
Re:円形に敵弾を消しさるには
Posted: 2009年12月14日(月) 20:44
by あ~る
敵の弾が当たったら、敵の弾でフラグが立ってる弾と自機との距離を調べて、距離が○○以下だったらフラグをオフにする。で、○○の値を加算していく。(○○はもちろん任意の変数です)
みたいな感じで出来るかもです(もっと効率の良い方法があるかもしれないですが(-.-;))
ちょっと試験期間なんで試して無いから駄目かもしれないです。
駄目だったら申し訳無いですけど僕にはわかんないです…
あと携帯からなんで見にくかったらすいません。
Re:円形に敵弾を消しさるには
Posted: 2009年12月14日(月) 21:07
by y
初めて投稿させていただきます。
恐らく、東方風神録の被弾時のエフェクトを真似ているのだと思いますが、
“敵弾との当たり判定がある何も描画させないオブジェクト”を配置し、
時間の経過とともに当たり判定を広げる方法が、一番簡単だと思います。
処理の流れとしては、
1.被弾する
2.被弾位置にオブジェクトを配置する(初期化する)
3.オブジェクトの当たり判定を徐々に広げる
4.一定時間後、オブジェクトを破棄する(処理させない)
こんな感じになると思います。
ちなみに、円形に消したいならば、何も描画させないオブジェクトの当たり判定を円形にし、
円と四角形との当たり判定を行う必要があります。
参考になれば幸いです。
Re:円形に敵弾を消しさるには
Posted: 2009年12月14日(月) 21:46
by Dixq (管理人)
ちと簡単ではありますが、サンプル作ってみました。
特に難しい事はしていないので、見たらわかると思いますが、
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;
}
こんな感じでどうでしょう?