PacManGameModeBase.h
#include "Public/Enemy.h"
UCLASS()
class PACMAN_API APacManGameModeBase : public AGameModeBase
{
GENERATED_BODY()
public:
// 易受攻击的方法
void SetEnemyVulnerable();
private:
// 定义一个数组,保存所有的敌人
TArray<class AEnemy*> Enemys;
};
PacManGameMode.cpp
#include "Public/EngineUtils.h"
// 易受攻击的事情,用 GameMode 来处理所有的敌人,在 Character 中直接调用 GameMode 的这个方法,就可以把所有的敌人都设置成易受到攻击的状态,而不必分别设置了
// 设置成易受攻击,被主角吃的行为就好了
void APacManGameModeBase::SetEnemyVulnerable()
{
// 遍历所有的Enemy,调用它身上的SetVulnerable方法就可以了
// Iter 表示存在的话,Iter++
for (auto Iter(Enemys.CreateIterator()); Iter; Iter++)
{
// 调用它身上的SetVulnerable方法
(*Iter)->SetVulnerable();
}
}
void APacManGameModeBase::BeginPlay()
{
SetCurrentState(EGameState::EPlaying);
// 使用迭代器,需要引入头文件:Public/EngineUtils.h
// 获得所有的敌人 ;起个名字:enemyItr; GetWorld():从世界得到; enemyItr 存在的话就去遍历
for (TActorIterator<AEnemy> enemyItr(GetWorld()); enemyItr; ++enemyItr)
{
// 强制转化成 AEnemy
AEnemy* enemy = Cast<AEnemy>(*enemyItr);
// 转化后,看存不存在
if (enemy)
{
// 如果存在的话,就添加到数组里面
Enemys.Add(enemy);
}
}
}
PacManCharacter.cpp
void APacManCharacter::OnCollision(UPrimitiveComponent * HitComp, AActor * OtherActor, UPrimitiveComponent * OtherComp, int OtherBodyIndex, bool bFromSweep, const FHitResult & SweepResult)
{
// 当游戏正在运行才去检测碰撞
if (GameMode->GetCurrentState() == EGameState::EPlaying)
{
// 调用易受攻击的状态,什么时候调用:就是在主角吃到了超级大力丸的时候调用,把敌人设置成易受攻击的状态,找到主角,找到碰撞函数 OnCollision
// 碰到是食物的话,就把它销毁
// 当碰撞的对象是 ACollectables 类时销毁掉
// 使用自己定义的类AColletables,也需要引入对应的头文件: #include "Public/Collectables.h"
if (OtherActor->IsA(ACollectables::StaticClass()))
{
// 吃到豆子
// 强制转化成豆子
ACollectables* collectable = Cast<ACollectables>(OtherActor);
// 判断是不是大力丸
if (collectable->bIsSuperCollectable)
{
// 把敌人变成易受攻击的状态
GameMode->SetEnemyVulnerable();
}
// 销毁豆子
OtherActor->Destroy();
// 检测一下豆子的数量是否为 0
if (--CollectablesToEat == 0)
{
GameMode->SetCurrentState(EGameState::EWin);
}
UE_LOG(LogTemp, Warning, TEXT("Remain Collectable is %d"), CollectablesToEat);
}
}
}
GameMode 是定制游戏规则的地方
按下 P 键,所有的敌人都不能移动
GameMode 来管理所有的敌人
把敌人易受攻击的状态设置
单独一个一个设置太麻烦了
在GameMode 里面获得所有敌人
调用易受攻击的方法就可以了
GameModeBase 获得所有敌人,需要引入头文件:敌人