//---------------------------------- //機能:当たり判定 //引数: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; }
void MultiplayerMap::UpdateEnemyPathing() { for (int i = 0; i < towers.size(); i++) { Tower *t = towers.at(i); int x = t->GetX() / 32; int y = t->GetY() / 32; pathingArr[TILES_X * y + x].type = 1; pathingArr[TILES_X * (y + 1) + x].type = 1; pathingArr[TILES_X * y + (x + 1)].type = 1; pathingArr[TILES_X * (y + 1) + (x + 1)].type = 1; } for (int i = 0; i < enemies.size(); i++) { Enemy *en = enemies.at(i); Vector2f pos = en->GetPos(); TileNode enemyPos = TileNode(pos.x / 32, pos.y / 32, nullptr); TileNode destination; if (en->GetOwnerID() == 1) { destination = endNode; } else destination = startNode; vector<TileNode> enemyPath = pathfinder->Search(enemyPos, destination); enemyPath.insert(enemyPath.begin(), enemyPos); en->UpdatePath(enemyPath); } }
//—————————————————————— // 機能:衝突判定処理 // 引数:なし // 戻値:成功/失敗 //—————————————————————— HRESULT Player::Hit(UnitBase* pTarget) { //ターゲットが敵だったら if (typeid(*pTarget) == typeid(Enemy)) { //敵の現在の位置 Enemy* enemy = (Enemy*)pTarget; D3DXVECTOR2 enemyPos = enemy->GetPos(); //プレイヤーから敵までの距離の2乗を求める int distance = (position.x - enemyPos.x) * (position.x - enemyPos.x) + (position.y - enemyPos.y) * (position.y - enemyPos.y); //キャラサイズの2乗以内だったら if (distance <= (ACTOR_SIZE * ACTOR_SIZE)) { //プレイヤー死ぬ status = STATUS_DEAD; } } //ターゲットがブロックだったら if (typeid(*pTarget) == typeid(Block)) { //現在の位置 Block* block = (Block*)pTarget; int x = position.x; int y = position.y; if (block->GetMap(y , x) == 1 ) { move.y = 0; } } //ターゲットがアイテムだったら if (typeid(*pTarget) == typeid(Item)) { //現在の位置 Item* item = (Item*)pTarget; D3DXVECTOR3 itemPos = item->GetPos(); //プレイヤーからブロックまでの距離の2乗を求める int distance = (position.x - itemPos.x)*(position.x - itemPos.x) + (position.y - itemPos.y)*(position.y - itemPos.y); //2乗以内だったら if (distance <= ACTOR_SIZE*ACTOR_SIZE) { } } return S_OK; }
void MultiplayerMap::update(float elapsed_seconds) { if (updates++ % 30 == 0) { SendPlayerSync(); for (int i = 0; i < enemies.size(); i++) { Enemy *en = enemies[i]; UpdateEnemyStruct ues; ues.health = en->GetHealth(); ues.UID = en->GetUID(); ues.x = en->GetPos().x; ues.y = en->GetPos().y; if (peerConnection) peerConnection->Send(ues); } } if (localPlayer->GetLives() <= 0) { on_show_winner(false); return; } else if (remotePlayer->GetLives() <= 0) { on_show_winner(true); return; } passiveIncomeCD += elapsed_seconds; if (passiveIncomeCD > SECONDS_PER_PASSIVE_INCOME) { localPlayer->AddGold(localPlayer->GetPassiveIncome()); remotePlayer->AddGold(remotePlayer->GetPassiveIncome()); //SendPlayerSync(); passiveIncomeCD = 0; on_creep_killed(0); } DoProjectileCollision(); if (peerConnection) peerConnection->Update(elapsed_seconds); }
//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; }