制作日誌6

アバター
SAI
記事: 115
登録日時: 14年前
住所: はひほーひ

制作日誌6

投稿記事 by SAI » 14年前

当たり判定です。
さあ段々プログラムがカオスになってきましたよ~

うーわー。
自機と敵の当たり判定は、GRAMさんに教わった通り、線分と円の当たり判定で求めたいけど、線分と円の当たり判定がわからぬ!

やばっ。参考にしたサイトがどっかいった。
あったあった。タブ復元は偉大です。
http://www.hiramine.com/programming/gra ... tance.html

これをもとにして作った関数がこれ。内積がNaisekiだっていいじゃない。

CODE:

//2点間を結ぶ線分を移動する円と円との当たり判定。1なら当たってる
int Line_Circle_hitnot(double x1a,double y1a,double x1b,double y1b,double r1,double x2,double y2,double r2)
{
	vector vab ={x1b - x1a,y1b - y1a};
	vector va1 ={x2 - x1a ,y2 - y1a};
	double dab = sqrt(vab.x*vab.x+vab.y*vab.y);
	if(Circle_Circle_hitnot(x1a,y1a,r1,x2,y2,r2)==1)	//まずAとBが当たってないか調べる
		return 1;
	if(Circle_Circle_hitnot(x1b,y1b,r1,x2,y2,r2)==1)
		return 1;
	double ashi = VectorNaiseki(&vab,&va1) / (dab*dab);	
	if(ashi=1)	//ab直線上に下ろした垂線の足がab間になければ当たってない
		return 0;
	double dx = x1a + ashi*vab.x - x2;	//垂線の足と円の中心との当たり判定
	double dy = y1a + ashi*vab.y - y2;
	if(dx*dx + dy*dy _


//ワープしたときに変な当たり判定が発生しないように、座標がかなり違ったら除外する
//自機と敵の当たり判定
void Player_Enemy_hitnot(CSTGPlayer* STGPlayer,CSTGenemy STGEnemy[])
{
    if(STGPlayer->getMutekiFlag()==0 && STGPlayer->getFlag()==1)	//プレイヤーの当たり判定がある状態
	{
		for( int i = 0 ; i 0)
			{
				if(Circle_Circle_hitnot(STGEnemy[i].getx(),STGEnemy[i].gety(),STGEnemy[i].getrange(),STGPlayer->getx(),STGPlayer->gety(),STGPlayer->getrange())==1)
				{
					STGEnemy[i].hit_tr(int(STGPlayer->getatk()*double(STGPlayer->getpower())/100 *10));	//10発分のダメージを敵に与える
					STGPlayer->hit_tr(STGEnemy[i].getatk());	//プレイヤーにダメージ
					//無敵時間セット
//					STGPlayer->setFlag(2);
//					DrawFormatStringToHandle(400,100,color.white,font[2],"敵とあたっとるよん",0);
				}
			}
		}
	}
}

//自機と弾の当たり判定
void Player_EnemyTama_hitnot(CSTGPlayer* STGPlayer,CSTGtama STGtama[])
{
    if(STGPlayer->getMutekiFlag()==0 && STGPlayer->getFlag()==1)	//プレイヤーの当たり判定がある状態
	{
		for( int i = 0 ; i 0)
			{
				//半径50に収まっていなければワープしたと判断
				if(Circle_Circle_hitnot(STGtama[i].getx(),STGtama[i].gety(),0,STGtama[i].getoldx(),STGtama[i].getoldy(),50)==1)
				{
					//線判定
					if(Line_Circle_hitnot(STGtama[i].getx(),STGtama[i].gety(),STGtama[i].getoldx(),STGtama[i].getoldy(),STGtama[i].getrange(),
						STGPlayer->getx(),STGPlayer->gety(),STGPlayer->getrange())==1)
					{
						//救済判定
						if(Kyusai(STGtama[i].getx(),STGtama[i].gety(),STGtama[i].getoldx(),STGtama[i].getoldy(),STGtama[i].getrange(),
							STGPlayer->getx(),STGPlayer->gety(),STGPlayer->getoldpos_x(0),STGPlayer->getoldpos_y(0),STGPlayer->getrange())==1)
						{

							STGPlayer->hit_tr(STGtama[i].getatk());	//プレイヤーにダメージ
							if(STGtama[i].getFlag()==1)	//フラグが1なら
							{
								STGtama[i].setFlag(0);	//弾を消す
							}
						}
					}
				}
				//ワープしてたら普通に円判定
				else if(Circle_Circle_hitnot(STGtama[i].getx(),STGtama[i].gety(),STGtama[i].getrange(),STGPlayer->getx(),STGPlayer->gety(),STGPlayer->getrange())==1)
				{
					STGPlayer->hit_tr(STGtama[i].getatk());	//プレイヤーにダメージ
					if(STGtama[i].getFlag()==1)	//フラグが1なら
					{
						STGtama[i].setFlag(0);	//弾を消す
					}
					DrawFormatStringToHandle(400,150,color.white,font[2],"弾とあたっとるよん",0);
				}
			}
		}
	}
}

//自機と弾のグレイズ判定
void Player_EnemyTama_grazenot(CSTGPlayer* STGPlayer,CSTGtama STGtama[])
{
    if(STGPlayer->getMutekiFlag()==0 && STGPlayer->getFlag()==1)	//プレイヤーの当たり判定がある状態
	{
		for( int i = 0 ; i 0 && STGtama[i].getgrazeFlag()==0)
			{
				if(Circle_Circle_hitnot(STGtama[i].getx(),STGtama[i].gety(),STGtama[i].getrange(),STGPlayer->getx(),STGPlayer->gety(),STGPlayer->getgrazerange())==1)
				{
					STGtama[i].setgrazeFlag(1);	//フラグを立てる
					STGPlayer->setitemborder(STGPlayer->getitemborder()+10);	//アイテムボーダーを下げる
					STGPlayer->grazeplas();	//グレイズ+1
					STGPlayer->cleargrazetime();	//グレイズタイムリセット
					score += int((STGtama[i].getatk()+1)*STGtama[i].getrange()*(fabs(STGtama[i].getspd())+1)/10);
//					DrawFormatStringToHandle(400,200,color.white,font[2],"弾とグレイズよん",0);
				}
			}
		}
	}
}



アバター
SAI
記事: 115
登録日時: 14年前
住所: はひほーひ

Re: 制作日誌6

投稿記事 by SAI » 14年前

さて、次は何をしよう(´・ω・`)
そろそろ画像作りでも始めようかな?
あ、レーザーがあったか。
でもレーザー作る前に画像を作らないと。