当玩家吃掉超级豆子,就会让所有的敌人变虚弱。

我们打开游戏模式类。添加函数

 //将所有敌人变虚弱void SetEnermiesVolunerable();

定义这个函数

void APacmanGameModeBase::SetEnermiesVolunerable()
{for (auto Iter(Enermis.CreateIterator()); Iter; ++Iter){(*Iter)->SetVulnerable();}
}

然后打开玩家类

完善吃豆子逻辑

//发生重叠,就会调用这个函数
void APacdotPlayer::OnPacmanBeginOverlay(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{if (OtherActor->IsA(APacdot::StaticClass())){//当前的豆子APacdot* CurrentPacdot = Cast<APacdot>(OtherActor);//判断是否是超级豆子if (CurrentPacdot->bIsSuperPacdot){//让所有的敌人变虚弱ModeBaseRef->SetEnermiesVolunerable();}OtherActor->Destroy();//更新一下豆子的数量ModeBaseRef->SetPacdotNum(ModeBaseRef->GetPacdotNum()-1);}}

===========================

完善一下游戏状态逻辑

只有当游戏在游玩状态,我们才可以控制角色

void APacdotPlayer::MoveX(float value)
{//用if包裹起来if (ModeBaseRef->GetCurrentState() == EGameState::EPlay){Vlocity.X = value;Vlocity.Y = 0;//character自带的函数,我们把向量喂给他就可以了AddMovementInput(Vlocity);if (value > 0){SetActorRotation(FRotator(0, 0, 0));}else if (value < 0){SetActorRotation(FRotator(0, -180, 0));}}}
void APacdotPlayer::MoveY(float value)
{用if包裹起来if (ModeBaseRef->GetCurrentState() == EGameState::EPlay){Vlocity.X = 0;Vlocity.Y = value;AddMovementInput(Vlocity);if (value > 0){SetActorRotation(FRotator(0, 90, 0));}else if (value < 0){SetActorRotation(FRotator(0, -90, 0));}}}
//发生重叠,就会调用这个函数
void APacdotPlayer::OnPacmanBeginOverlay(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{用if包裹起来if (ModeBaseRef->GetCurrentState() == EGameState::EPlay){if (OtherActor->IsA(APacdot::StaticClass())){//当前的豆子APacdot* CurrentPacdot = Cast<APacdot>(OtherActor);//判断是否是超级豆子if (CurrentPacdot->bIsSuperPacdot){//让所有的敌人变虚弱ModeBaseRef->SetEnermiesVolunerable();}OtherActor->Destroy();//更新一下豆子的数量ModeBaseRef->SetPacdotNum(ModeBaseRef->GetPacdotNum());}}}

=============================

实现重新游戏

打开游戏模式类,定义重启游戏函数

void APacmanGameModeBase::ReStartGame()
{GetWorld()->GetFirstLocalPlayerFromController()->ConsoleCommand(TEXT("RestartLevel"));
}

定义暂停游戏函数

void APacmanGameModeBase::PauseGame()
{if (GetCurrentState() == EGameState::EPlay){SetCurrentState(EGameState::EPause);}else if (GetCurrentState() == EGameState::EPause){SetCurrentState(EGameState::EPlay);}
}

现在定义一下改变状态函数

void APacmanGameModeBase::SetCurrentState(EGameState value)
{CurrentState = value;switch (CurrentState){case EGameState::EMenu:break;case EGameState::EPlay://改变敌人的移动for (auto Iter(Enermis.CreateIterator()); Iter; ++Iter){(*Iter)->SetMovement(true);}//改变玩家的移动Cast< APacdotPlayer>(GetWorld()->GetFirstPlayerController()->GetPawn())->SetMovement(true);break;case EGameState::EPause://改变敌人的移动,并清除计时器for (auto Iter(Enermis.CreateIterator()); Iter; ++Iter){(*Iter)->SetMovement(false);GetWorldTimerManager().ClearAllTimersForObject(*Iter);}//改变玩家的移动Cast< APacdotPlayer>(GetWorld()->GetFirstPlayerController()->GetPawn())->SetMovement(false);break;case EGameState::EWin://销毁所有敌人for (auto Iter(Enermis.CreateIterator()); Iter; ++Iter){(*Iter)->Destroy();}break;case EGameState::EGameOver://改变敌人的移动并清除计时器for (auto Iter(Enermis.CreateIterator()); Iter; ++Iter){(*Iter)->SetMovement(false);GetWorldTimerManager().ClearAllTimersForObject(*Iter);}//改变玩家的移动Cast< APacdotPlayer>(GetWorld()->GetFirstPlayerController()->GetPawn())->SetMovement(false);break;default:break;}
}

=======================

打开游戏模式类,声明保存和还原计时器函数

 //记录所有敌人计时器void RecordEnermiesTimer();//还原所有敌人计时器void RestoreEnermiesTimer();

再声明一个私有容器属性,存放每个敌人计时器剩余时间

 //每个敌人计时器剩余时间TArray<float> EnermisRemainingTime;

定义RecordEnermiesTimer()函数

//用来记录计时器剩余时间
void APacmanGameModeBase::RecordEnermiesTimer()
{//清空容器EnermisRemainingTime.Empty();//遍历场景中的敌人for (auto Iter(Enermis.CreateIterator()); Iter; ++Iter){//正常状态if ((*Iter)->bIsVulnerable == false && (*Iter)->bIsDeath == false){EnermisRemainingTime.Add(-1);}//虚弱状态if ((*Iter)->bIsVulnerable == true && (*Iter)->bIsDeath == false){//存储计时器float VulnerableRemainingTime = GetWorldTimerManager().GetTimerRemaining((*Iter)->VulnerableTimerHandle);EnermisRemainingTime.Add(VulnerableRemainingTime);}//死亡状态if ((*Iter)->bIsDeath == true){//存储计时器float DeathRemainingTime = GetWorldTimerManager().GetTimerRemaining((*Iter)->DeathTimerHandle);EnermisRemainingTime.Add(DeathRemainingTime);}}}

定义恢复计时器函数

//回复计时器
void APacmanGameModeBase::RestoreEnermiesTimer()
{for (auto Iter(Enermis.CreateIterator()); Iter; ++Iter){//虚弱状态if ((*Iter)->bIsVulnerable == true && (*Iter)->bIsDeath == false){(*Iter)->SetVulnerable(true, EnermisRemainingTime[Iter.GetIndex()]);}//死亡状态if ((*Iter)->bIsDeath == true){(*Iter)->SetDeath(true, EnermisRemainingTime[Iter.GetIndex()]);}}
}

此时我们完善一下pause()暂停函数

void APacmanGameModeBase::PauseGame()
{if (GetCurrentState() == EGameState::EPlay){//暂停之后,记录剩余时间RecordEnermiesTimer();SetCurrentState(EGameState::EPause);}else if (GetCurrentState() == EGameState::EPause){//暂停之后,恢复剩余时间RestoreEnermiesTimer();SetCurrentState(EGameState::EPlay);}
}

10UEC++吃豆人[吃超级豆子和改变游戏状态]相关推荐

  1. 玩了5万局游戏,英伟达让GameGAN自己生成「吃豆人」,世界首创无需游戏引擎...

    本文转载自新智元(AI_era).   新智元报道   编辑:元子 [新智元导读]近几年来,英伟达在GAN这个领域越走越远.英伟达推出"GameGAN",不需要任何底层游戏引擎,用 ...

  2. 观看5万个游戏视频后,英伟达AI学会了自己开发「吃豆人」

    晓查 发自 凹非寺  量子位 报道 | 公众号 QbitAI AI学会玩游戏已经不是什么新鲜事了,无论是星际争霸还是王者荣耀,AI的水平都已经超过了顶级选手. 现在,AI不仅能玩游戏,还学会了造游戏. ...

  3. 对抗博弈搜索——吃豆人

    对抗博弈搜索--吃豆人 介绍 项目解决方案 question2:Minimax算法 question3:Alpha-Beta 剪枝 question4:Expectimax question5:优化评 ...

  4. 纯CSS做一个吃豆人动画

    我们先来看看将要实现的效果:    可以单击这个链接打开查看效果和代码:https://codepen.io/sd237720488/pen/LMyNxJ 接下来我们来看看怎么实现的,首先它可以分为两 ...

  5. 如何用Machinations示意图来模拟《吃豆人》的游戏机制?

    下面我们来展示一下如何用Machinations 示意图来模拟一个简单游戏的机制.我们使用的案例是经典街机游戏<吃豆人>(Pac-Man),我们将会把模拟这个游戏的过程分解成六步,并在Ma ...

  6. AI与游戏——吃豆人(4)方法综述

    这一部分先提一下一些基本的目前广泛用于游戏中的AI算法.这里最好现有点机器学习相关知识,不然可能会不知所云.后面提到具体算法我会尽量列出一些参考文献,例子也继续在吃豆人上面举例. 目前主流方法主要有, ...

  7. 小游戏之欢乐吃豆人canvas重制版

    前言 <Pac-Man>上一次已经写过了,但是用vue写的,整体下来能玩,但是自己感觉不算流畅,而且游戏计算方面也有点欠缺,感兴趣的可看我上一篇文章.这次我又卷土重来,在三四天内用空闲时间 ...

  8. 【人工智能导论】吃豆人游戏(上):对抗搜索与Minimax算法

    吃豆人实验(The Pac-Man Project)简介 The Pac-Man projects were developed for UC Berkeley's introductory arti ...

  9. Java语言制作吃豆人游戏

    (此项目源码已上传至Github网站,网址为GitHub - Ran-a/Pac-man-yar) 1  游戏界面 游戏的角色分别是追赶者和吃豆人,玩家使用方向键来控制吃豆人的运动方向并吃食物,将食物 ...

最新文章

  1. Response 和 Request
  2. R语言观察日志(part20)--包的组件之R代码
  3. 高效数据序列化的工具 FlatBuffers 的初体验
  4. 基础编程题目集 6-2 多项式求值 (15 分)
  5. 今日恐慌与贪婪指数为83 贪婪程度大幅上升
  6. jquery监听html状态,jquery监听页面刷新
  7. paip. lbmall V3.1.1 乐彼多用户商城系统的安全漏洞总结
  8. word2007打印在什么地方
  9. Go 程序如何被启动,g0,m0 又是什么?
  10. 火狐浏览器打印网页不全_火狐浏览器网页显示不全
  11. Linux中E45:'readonly' option is set错误原因的分析
  12. 【魔兽世界插件】魔兽世界插件实战笔记从入门到放弃的心理历程 第一节 lua框架的建立
  13. idb 怎么回复mysql_MySQL删除idb文件引发的思考
  14. fx3u4ad一adp说明书_三菱PLC模块FX3U-4AD与FX3U-4AD-ADP的区别
  15. 鸿蒙系统开始测试了,华为开始测试鸿蒙系统,百万台华为手机正在测试中,网友:厉害了...
  16. Laya Air游戏开发模式之传统MVC模式(基础篇)
  17. js的for循环中return可以跳出循环,而使用forEach等不可以跳出循环
  18. 微信小程序开发尚学堂 介绍 项目结构 组件 喧嚷 事件 模板
  19. 记录一次使用JS生成word后端转换PDF功能
  20. 数据库系列- JDBC 的三种 Statement 是什么?它们有什么区别?

热门文章

  1. 我与盲行教案(0723)
  2. 数学物理方法·基础⑦基本初等复变函数的计算公式/方法
  3. MD5(单向散列算法)原理分析
  4. python提取日期中的年月_python3 正则提取年月日、年月、年思路
  5. PWN-COMPETITION-HGAME2022-Week2
  6. 从 Airflow 到 Apache DolphinScheduler,有赞大数据开发平台的调度系统演进
  7. hive建表报错 character ‘ ‘ not supported here
  8. 练习之彩票四 计算中奖数(结尾)
  9. 【2056】最大的数
  10. Ensp仿真实验 一会通 一会不通