さあ段々プログラムがカオスになってきましたよ~
うーわー。
自機と敵の当たり判定は、GRAMさんに教わった通り、線分と円の当たり判定で求めたいけど、線分と円の当たり判定がわからぬ!
やばっ。参考にしたサイトがどっかいった。
あったあった。タブ復元は偉大です。
http://www.hiramine.com/programming/gra ... tance.html
これをもとにして作った関数がこれ。内積がNaisekiだっていいじゃない。
//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);
}
}
}
}
}