円形に敵弾を消しさるには

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら

円形に敵弾を消しさるには

#1

投稿記事 by » 15年前

龍神録についてです。
if(out_judge_enemyshot(s,n)==1){ //自機にその弾が接触していたら
//全ての弾を消しさる

という処理を追加してるのですが、
もっと、ゲームらしく、
自機と敵弾が接触した場所を中心に、円形に範囲を広げながら
周りの敵弾を一つずつ消しさるという処理を追加したいのですが、
この処理の計算方法はどうしたらいいでしょうか?
誰か分かる方がいましたら、教えてください・・

あ~る

Re:円形に敵弾を消しさるには

#2

投稿記事 by あ~る » 15年前

敵の弾が当たったら、敵の弾でフラグが立ってる弾と自機との距離を調べて、距離が○○以下だったらフラグをオフにする。で、○○の値を加算していく。(○○はもちろん任意の変数です)

みたいな感じで出来るかもです(もっと効率の良い方法があるかもしれないですが(-.-;))
ちょっと試験期間なんで試して無いから駄目かもしれないです。
駄目だったら申し訳無いですけど僕にはわかんないです…

あと携帯からなんで見にくかったらすいません。

y

Re:円形に敵弾を消しさるには

#3

投稿記事 by y » 15年前

初めて投稿させていただきます。

恐らく、東方風神録の被弾時のエフェクトを真似ているのだと思いますが、
“敵弾との当たり判定がある何も描画させないオブジェクト”を配置し、
時間の経過とともに当たり判定を広げる方法が、一番簡単だと思います。

処理の流れとしては、

1.被弾する
2.被弾位置にオブジェクトを配置する(初期化する)
3.オブジェクトの当たり判定を徐々に広げる
4.一定時間後、オブジェクトを破棄する(処理させない)

こんな感じになると思います。
ちなみに、円形に消したいならば、何も描画させないオブジェクトの当たり判定を円形にし、
円と四角形との当たり判定を行う必要があります。

参考になれば幸いです。

Dixq (管理人)

Re:円形に敵弾を消しさるには

#4

投稿記事 by Dixq (管理人) » 15年前

ちと簡単ではありますが、サンプル作ってみました。
特に難しい事はしていないので、見たらわかると思いますが、
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;
}


こんな感じでどうでしょう?

閉鎖

“C言語何でも質問掲示板” へ戻る