//---------------------------------- //機能:当たり判定 //引数:pTarget 敵の位置情報 //戻値:TRUEorFALSE //---------------------------------- BOOL Bread::Hit(UnitBase *pTarget) { if (typeid(*pTarget) == typeid(Enemy)) { Enemy *pEnemy = (Enemy*)pTarget; if (isbread == TRUE) { //敵の位置をGetPosを通して受け取る enemyPosition = pEnemy->GetPos(); //位置の計算を行う int distance = (int)(position.x - (enemyPosition.x + g_stageScrollPosition.x)) * (int)(position.x - (enemyPosition.x + g_stageScrollPosition.x)) + (int)(position.y - (enemyPosition.y + g_stageScrollPosition.y)) * (int)(position.y - (enemyPosition.y + g_stageScrollPosition.y)); //(0-0)*(0-0)+(0-0)*(0-0) =((0-0)*(0-0)) + ((0-0)*(0-0)) if (distance <= (28 * 48)) { //弾が当たったら弾を消す Reset(); pEnemy->Kill(); return TRUE; } } } return FALSE; }
//playerのHit関数 //引数:UnitBase型のポインタ //(UnitBaseクラスを継承した子クラスの情報が扱える) //戻り値:HRESULT型-成功かどうか HRESULT Player::Hit(UnitBase* pTarget) { //ステージとの当たり判定 if (typeid(*pTarget) == typeid(Stage)) { //pTargetをステージと判断し、stage型にキャスト Stage* stage = (Stage*)pTarget; //RayCastData型の変数を作る RayCastData ray; //レイが出る位置 ray.start = position; ray.start.y = position.y+10; //レイを向ける方向 ray.dir = D3DXVECTOR3(0, -1, 0); //レイの情報を格納したアドレスを渡す stage->GetModel()->RayCast(&ray); //Rayが当たっているかつ //ステージの位置Yがプレイヤー位置Y-1より大きかったら if (ray.hit && ray.pos.y >= (position.y - 1) && ground_flg == FALSE) { jump_flg = TRUE; jump_Count = 0; ground_flg = TRUE; position = ray.pos + D3DXVECTOR3(0, 0.5, 0); } else if (ground_flg == TRUE) { position = ray.pos + D3DXVECTOR3(0,0.5,0); } //目の前にステージがあるかの判定 ray.start = position; D3DXMATRIX matR; D3DXMatrixRotationY(&matR, D3DXToRadian(dir)); D3DXVECTOR3 rayVec = D3DXVECTOR3(0, 0, 1); D3DXVec3TransformCoord(&rayVec, &rayVec, &matR); ray.dir = rayVec; stage->GetModel()->RayCast(&ray); if (ray.hit && ray.dist < 2) { isWallHit = TRUE; wallNormal = ray.normal; } else { isWallHit = FALSE; } ray.start = position; ray.dir = D3DXVECTOR3(0, 0, -1); stage->GetModel()->RayCast(&ray); D3DXVECTOR3 v = stage->GetPos() - position; //プレイヤーとカメラの間にステージがあるか D3DXVECTOR3 pToCdist = camVec-position; if (D3DXVec3Length(&v) < D3DXVec3Length(&pToCdist)) { camVec = D3DXVECTOR3(position.x, 5, position.z); } } //敵との当たり判定 if (typeid(*pTarget) == typeid(Enemy)) { static int count = 0; count--; Enemy* enemy = (Enemy*)pTarget; //UnitBase型をEnemy型にキャスト BOOL flg = item->Hit(enemy->GetPos()); //アイテムが当たったかどうか if (flg) { enemy->KnockBack(); count = 100; } D3DXVECTOR3 v = enemy->GetPos() - position; //プレイヤーから敵に向かうベクトルを求める if (D3DXVec3Length(&v) < 2) //ベクトルの長さが2以下だったら { if (count >= 0) { enemy->Kill(); g_gameScene = SC_CLEAR; } else { g_gameScene = SC_GAME_OVER; } } } if (typeid(*pTarget) == typeid(Invisible)) { Invisible* invisible = (Invisible*)pTarget; D3DXVECTOR3 inTopVec = invisible->GetPos() - position; if (D3DXVec3Length(&inTopVec) < 1) { isInvisible = TRUE; } else { isInvisible = FALSE; } } return S_OK; }