-
Notifications
You must be signed in to change notification settings - Fork 0
/
EnemyManager.cpp
95 lines (85 loc) · 1.84 KB
/
EnemyManager.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include <imgui.h>
#include "EnemyManager.h"
#include "Collision.h"
#include "EnemySlime.h"
// 更新処理
void EnemyManager::Update(float elapsedTime)
{
for (Enemy* enemy : enemies)
{
enemy->Update(elapsedTime);
}
// 破棄処理
// ※enemiesの範囲for文中でerase()すると不具合が発生してしまうため、
// 更新処理が終わった後に破棄リストに積まれたオブジェクトを削除する。
for (Enemy* enemy : removes)
{
// std::vectorから要素を削除する場合はイテレーターで削除しなければならない
std::vector<Enemy*>::iterator it = std::find(enemies.begin(), enemies.end(), enemy);
if (it != enemies.end())
{
enemies.erase(it);
}
// 削除
delete enemy;
}
// 破棄リストをクリア
removes.clear();
// 敵同士の衝突処理
CollisionEnemyVsEnemies();
}
// 描画処理
void EnemyManager::Render(ID3D11DeviceContext* context, Shader* shader)
{
for (Enemy* enemy : enemies)
{
enemy->Render(context, shader);
}
}
// エネミー登録
void EnemyManager::Register(Enemy* enemy)
{
enemies.emplace_back(enemy);
}
// エネミー全削除
void EnemyManager::Clear()
{
for (Enemy* enemy : enemies)
{
delete enemy;
}
enemies.clear();
}
// エネミー削除
void EnemyManager::Remove(Enemy* enemy)
{
// 破棄リストに追加
removes.insert(enemy);
}
// エネミー同士の衝突処理
void EnemyManager::CollisionEnemyVsEnemies()
{
size_t enemyCount = enemies.size();
for (int i = 0; i < enemyCount; ++i)
{
Enemy* enemyA = enemies.at(i);
for (int j = i + 1; j < enemyCount; ++j)
{
Enemy* enemyB = enemies.at(j);
DirectX::XMFLOAT3 outPositionA, outPositionB;
if (Collision::IntersectCylinderVsCylinderEx(
enemyA->GetPosition(),
enemyA->GetRadius(),
enemyA->GetHeight(),
enemyB->GetPosition(),
enemyB->GetRadius(),
enemyB->GetHeight(),
outPositionB,
outPositionA))
{
enemyA->SetPosition(outPositionA);
enemyB->SetPosition(outPositionB);
}
}
}
}