10UEC++吃豆人[吃超级豆子和改变游戏状态]
当玩家吃掉超级豆子,就会让所有的敌人变虚弱。
我们打开游戏模式类。添加函数
//将所有敌人变虚弱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++吃豆人[吃超级豆子和改变游戏状态]相关推荐
- 玩了5万局游戏,英伟达让GameGAN自己生成「吃豆人」,世界首创无需游戏引擎...
本文转载自新智元(AI_era). 新智元报道 编辑:元子 [新智元导读]近几年来,英伟达在GAN这个领域越走越远.英伟达推出"GameGAN",不需要任何底层游戏引擎,用 ...
- 观看5万个游戏视频后,英伟达AI学会了自己开发「吃豆人」
晓查 发自 凹非寺 量子位 报道 | 公众号 QbitAI AI学会玩游戏已经不是什么新鲜事了,无论是星际争霸还是王者荣耀,AI的水平都已经超过了顶级选手. 现在,AI不仅能玩游戏,还学会了造游戏. ...
- 对抗博弈搜索——吃豆人
对抗博弈搜索--吃豆人 介绍 项目解决方案 question2:Minimax算法 question3:Alpha-Beta 剪枝 question4:Expectimax question5:优化评 ...
- 纯CSS做一个吃豆人动画
我们先来看看将要实现的效果: 可以单击这个链接打开查看效果和代码:https://codepen.io/sd237720488/pen/LMyNxJ 接下来我们来看看怎么实现的,首先它可以分为两 ...
- 如何用Machinations示意图来模拟《吃豆人》的游戏机制?
下面我们来展示一下如何用Machinations 示意图来模拟一个简单游戏的机制.我们使用的案例是经典街机游戏<吃豆人>(Pac-Man),我们将会把模拟这个游戏的过程分解成六步,并在Ma ...
- AI与游戏——吃豆人(4)方法综述
这一部分先提一下一些基本的目前广泛用于游戏中的AI算法.这里最好现有点机器学习相关知识,不然可能会不知所云.后面提到具体算法我会尽量列出一些参考文献,例子也继续在吃豆人上面举例. 目前主流方法主要有, ...
- 小游戏之欢乐吃豆人canvas重制版
前言 <Pac-Man>上一次已经写过了,但是用vue写的,整体下来能玩,但是自己感觉不算流畅,而且游戏计算方面也有点欠缺,感兴趣的可看我上一篇文章.这次我又卷土重来,在三四天内用空闲时间 ...
- 【人工智能导论】吃豆人游戏(上):对抗搜索与Minimax算法
吃豆人实验(The Pac-Man Project)简介 The Pac-Man projects were developed for UC Berkeley's introductory arti ...
- Java语言制作吃豆人游戏
(此项目源码已上传至Github网站,网址为GitHub - Ran-a/Pac-man-yar) 1 游戏界面 游戏的角色分别是追赶者和吃豆人,玩家使用方向键来控制吃豆人的运动方向并吃食物,将食物 ...
最新文章
- Response 和 Request
- R语言观察日志(part20)--包的组件之R代码
- 高效数据序列化的工具 FlatBuffers 的初体验
- 基础编程题目集 6-2 多项式求值 (15 分)
- 今日恐慌与贪婪指数为83 贪婪程度大幅上升
- jquery监听html状态,jquery监听页面刷新
- paip. lbmall V3.1.1 乐彼多用户商城系统的安全漏洞总结
- word2007打印在什么地方
- Go 程序如何被启动,g0,m0 又是什么?
- 火狐浏览器打印网页不全_火狐浏览器网页显示不全
- Linux中E45:'readonly' option is set错误原因的分析
- 【魔兽世界插件】魔兽世界插件实战笔记从入门到放弃的心理历程 第一节 lua框架的建立
- idb 怎么回复mysql_MySQL删除idb文件引发的思考
- fx3u4ad一adp说明书_三菱PLC模块FX3U-4AD与FX3U-4AD-ADP的区别
- 鸿蒙系统开始测试了,华为开始测试鸿蒙系统,百万台华为手机正在测试中,网友:厉害了...
- Laya Air游戏开发模式之传统MVC模式(基础篇)
- js的for循环中return可以跳出循环,而使用forEach等不可以跳出循环
- 微信小程序开发尚学堂 介绍 项目结构 组件 喧嚷 事件 模板
- 记录一次使用JS生成word后端转换PDF功能
- 数据库系列- JDBC 的三种 Statement 是什么?它们有什么区别?
热门文章
- 我与盲行教案(0723)
- 数学物理方法·基础⑦基本初等复变函数的计算公式/方法
- MD5(单向散列算法)原理分析
- python提取日期中的年月_python3 正则提取年月日、年月、年思路
- PWN-COMPETITION-HGAME2022-Week2
- 从 Airflow 到 Apache DolphinScheduler,有赞大数据开发平台的调度系统演进
- hive建表报错 character ‘ ‘ not supported here
- 练习之彩票四 计算中奖数(结尾)
- 【2056】最大的数
- Ensp仿真实验 一会通 一会不通