(十八)C++自制植物大战僵尸游戏的游戏暂停实现

植物大战僵尸游戏开发教程专栏地址icon-default.png?t=N7T8http://t.csdnimg.cn/uzrnw


游戏暂停

当玩家遇到突发事件,可以通过暂停功能暂停游戏,以便及时处理问题。在激烈的游戏中,玩家可能需要暂停游戏来进行策略调整。此外,长时间的游戏对战可能会让玩家感到疲劳,暂停功能可以让玩家短暂休息,调整状态,以便更好地进行后续的游戏。

代码文件位置

实现功能的代码在Class\Scenes\GameScene文件夹中。具体位置如下图所示 。


PauseQuitLayer.h 

这段代码定义了一个枚举类 PauseQuitLayer_Button,用于表示暂停退出图层中的按钮。

枚举类中定义了以下几个枚举值:

cpp

复制

enum class PauseQuitLayer_Button
{查看图鉴 = 0,重新开始,退出游戏,按键说明,返回游戏
};

每个枚举值都代表了暂停退出图层中的一个按钮,并具有与之对应的整数值。这些枚举值的含义如下:

  • 查看图鉴:表示一个按钮,用于查看游戏中的图鉴。
  • 重新开始:表示一个按钮,用于重新开始游戏。
  • 退出游戏:表示一个按钮,用于退出游戏。
  • 按键说明:表示一个按钮,用于显示按键说明。
  • 返回游戏:表示一个按钮,用于返回游戏继续进行。

使用这个枚举类可以方便地标识和操作暂停退出图层中的不同按钮,提高代码的可读性和维护性。


 

class GSPauseQuitLayer :public OptionsMenu
{
public:CREATE_FUNC(GSPauseQuitLayer);static Layer* addLayer();static void pauseLayer();static void resumeLayer();static int getPauseNumbers();CC_CONSTRUCTOR_ACCESS:GSPauseQuitLayer();~GSPauseQuitLayer();virtual bool init();protected:virtual void createButton(const Vec2& vec2, const std::string name, PauseQuitLayer_Button type);virtual void createDialog() override;virtual void popSceneAnimation();private:void showPrompt();void openHandBook();void setRestart();void setQuitGame();void keyDescription();void returnGame();protected:EventListenerTouchOneByOne* _touchListener;private:LayerColor* _promptLayer;static int _pauseNumbers;static string _layerName[6];char* _levelName;
};

这段代码定义了一个名为 GSPauseQuitLayer 的类,它是 OptionsMenu 类的子类。

这个类的主要特点和成员函数如下:

  • 类继承自 OptionsMenu,表示它是一个选项菜单类的扩展。

  • CREATE_FUNC(GSPauseQuitLayer) 是一个宏定义,用于创建 GSPauseQuitLayer 的实例。

  • addLayer() 是一个静态函数,返回一个 Layer* 类型的指针。

  • pauseLayer() 和 resumeLayer() 是静态函数,用于暂停和恢复图层的操作。

  • getPauseNumbers() 是静态函数,用于获取暂停次数。

  • GSPauseQuitLayer() 是构造函数。

  • ~GSPauseQuitLayer() 是析构函数。

  • init() 是一个虚函数,用于初始化图层的操作。

  • createButton() 是一个保护函数,用于创建按钮。

  • createDialog() 是一个重写的函数,用于创建对话框。

  • popSceneAnimation() 是一个保护函数,用于执行场景动画。

  • showPrompt()openHandBook()setRestart()setQuitGame()keyDescription() 和 returnGame() 是私有函数,用于处理不同按钮的点击事件。

  • _touchListener 是一个 EventListenerTouchOneByOne 类型的指针,用于监听触摸事件。

  • _promptLayer 是一个 LayerColor 类型的指针,用于显示提示信息的图层。

  • _pauseNumbers 是一个静态变量,表示暂停次数。

  • _layerName 是一个包含 6 个字符串的静态数组,表示图层的名称。

  • _levelName 是一个 char* 类型的指针,用于存储关卡名称。

该类提供了一些函数用于创建按钮、处理点击事件、执行动画等操作,并且具有一些静态变量用于记录暂停次数和图层名称。


PauseQuitLayer.cpp

构造函数

string GSPauseQuitLayer::_layerName[] = 
{ "backgroundLayer","buttonLayer","animationLayer","controlLayer","informationLayer","sunLayer" 
};int GSPauseQuitLayer::_pauseNumbers = 0;GSPauseQuitLayer::GSPauseQuitLayer() :_promptLayer(nullptr)
, _levelName(_global->userInformation->getCurrentCaveFileLevelWorldName())
{
}

这段代码给 GSPauseQuitLayer 类的静态成员变量 _layerName 和 _pauseNumbers 进行了初始化,并定义了 GSPauseQuitLayer 类的构造函数。

在这段代码中:

  • _layerName 是一个静态字符串数组,包含了 6 个图层的名称。

  • _pauseNumbers 是一个静态整数变量,用于记录暂停次数,初始值为 0。

  • GSPauseQuitLayer 类的构造函数 GSPauseQuitLayer() 初始化了成员变量 _promptLayer 为 nullptr,并将 _levelName 初始化为 _global->userInformation->getCurrentCaveFileLevelWorldName() 的返回值。这里使用了 _global 对象的 userInformation 成员指针来获取当前洞穴文件的级别世界名称。

通过这些代码,对 GSPauseQuitLayer 类的静态成员变量和构造函数进行了初始化,为后续的使用做好准备。


析构函数 

GSPauseQuitLayer::~GSPauseQuitLayer()
{_pauseNumbers = 0;
}

在析构函数中,将静态成员变量 _pauseNumbers 的值设置为 0。这意味着在销毁 GSPauseQuitLayer 对象时,会将暂停次数重置为 0。

这段代码的作用是在销毁 GSPauseQuitLayer 对象时,重置暂停次数,以便在下次使用时重新计数。


pauseLayer函数

void GSPauseQuitLayer::pauseLayer()
{auto director = Director::getInstance()->getRunningScene();for (auto name : _layerName){if (director->getChildByName(name))director->getChildByName(name)->onExit();elsereturn;}PlayMusic::stopMusic();++_pauseNumbers;
}

这个函数的作用是暂停图层的操作。具体的实现步骤如下:

  1. 获取当前正在运行的场景对象 director
  2. 遍历 _layerName 数组中的图层名称。
  3. 对于每个图层名称,检查是否存在对应的子节点。如果存在,则调用该子节点的 onExit() 函数进行退出操作。如果不存在任何一个图层,则直接返回。
  4. 调用 PlayMusic::stopMusic() 函数停止正在播放的音乐。
  5. 将暂停次数 _pauseNumbers 增加 1。

这段代码的功能是暂停图层,它会遍历图层名称数组并调用相应图层的退出操作,同时停止音乐播放并增加暂停次数。


resumeLayer函数 

void GSPauseQuitLayer::resumeLayer()
{if (!--_pauseNumbers){auto director = Director::getInstance()->getRunningScene();for (auto name : _layerName){if (director->getChildByName(name))director->getChildByName(name)->onEnter();elsereturn;}PlayMusic::resumeMusic();}
}

这个函数的作用是恢复图层的操作。具体的实现步骤如下:

  1. 检查暂停次数 _pauseNumbers 是否为 0。如果不为 0,则将暂停次数减 1。
  2. 如果暂停次数减少后为 0,则执行以下操作:
    • 获取当前正在运行的场景对象 director
    • 遍历 _layerName 数组中的图层名称。
    • 对于每个图层名称,检查是否存在对应的子节点。如果存在,则调用该子节点的 onEnter() 函数进行进入操作。如果不存在任何一个图层,则直接返回。
    • 调用 PlayMusic::resumeMusic() 函数恢复音乐播放。

这段代码的功能是恢复图层,它会根据暂停次数判断是否执行恢复操作,如果暂停次数为 0,则遍历图层名称数组并调用相应图层的进入操作,同时恢复音乐播放。


setRestart函数 

void GSPauseQuitLayer::setRestart()
{_director->getScheduler()->setTimeScale(1.0f);UserData::getInstance()->caveUserData("BREAKTHROUGH", ++_global->userInformation->getBreakThroughNumbers());_director->replaceScene(TransitionFade::create(1.0f, SelectPlantsScene::createScene()));UserData::getInstance()->createNewLevelDataDocument();UserData::getInstance()->removeLevelData(_levelName);
}

这个函数的作用是设置重新开始游戏的操作。具体的实现步骤如下:

  1. 使用 _director 对象的 getScheduler() 函数获取调度器对象,然后调用 setTimeScale(1.0f) 将时间缩放设置为正常速度。
  2. 使用 UserData::getInstance() 获取用户数据的实例,调用 caveUserData("BREAKTHROUGH", ++_global->userInformation->getBreakThroughNumbers()) 更新用户数据中的 "BREAKTHROUGH" 字段,将 BreakThroughNumbers 值加一。
  3. 使用 _director 对象的 replaceScene() 函数切换场景,将当前场景替换为 SelectPlantsScene 场景,并使用 TransitionFade::create(1.0f, SelectPlantsScene::createScene()) 创建一个淡入淡出的过渡效果。
  4. 使用 UserData::getInstance() 创建新的关卡数据文档。
  5. 使用 UserData::getInstance() 调用 removeLevelData(_levelName) 函数,从用户数据中移除指定关卡的数据,其中 _levelName 是当前关卡的名称。

这段代码的功能是执行重新开始游戏的操作。它重置播放速度,更新用户数据,切换场景,创建新的关卡数据文档,并移除当前关卡的数据。


setQuitGame函数 

void GSPauseQuitLayer::setQuitGame()
{_director->getScheduler()->setTimeScale(1.0f);UserData::getInstance()->caveUserData("BREAKTHROUGH", ++_global->userInformation->getBreakThroughNumbers());UserData::getInstance()->createNewLevelDataDocument();UserData::getInstance()->caveLevelData(_levelName);popSceneAnimation();
}

这个函数的作用是设置退出游戏的操作。具体的实现步骤如下:

  1. 使用 _director 对象的 getScheduler() 函数获取调度器对象,然后调用 setTimeScale(1.0f) 将时间缩放设置为正常速度。
  2. 使用 UserData::getInstance() 获取用户数据的实例,调用 caveUserData("BREAKTHROUGH", ++_global->userInformation->getBreakThroughNumbers()) 更新用户数据中的 "BREAKTHROUGH" 字段,将 BreakThroughNumbers 值加一。
  3. 使用 UserData::getInstance() 创建新的关卡数据文档。
  4. 使用 UserData::getInstance() 调用 caveLevelData(_levelName) 函数,将当前关卡的数据保存到用户数据中,其中 _levelName 是当前关卡的名称。
  5. 调用 popSceneAnimation() 函数执行退出游戏的过渡动画,弹出当前场景。

这段代码的功能是执行退出游戏的操作。它重置播放速度,更新用户数据,创建新的关卡数据文档,并保存当前关卡的数据,然后执行退出游戏的过渡动画,弹出当前场景。


createButton函数 

void GSPauseQuitLayer::createButton(const Vec2& vec2, const std::string name, PauseQuitLayer_Button button_type)
{/* 创建返回主菜单按钮 */auto button = ui::Button::create("ButtonNew2.png", "ButtonNew.png", "", TextureResType::PLIST);auto label = Label::createWithTTF(name, GAME_FONT_NAME_1, 35);label->enableShadow(Color4B(0, 0, 0, 200));//设置阴影label->setScale(2.0f);button->setTitleLabel(label);button->setTitleColor(Color3B::WHITE);button->setPosition(vec2);button->setScale(0.5f);_option->addChild(button);button->addTouchEventListener([=](Ref* sender, ui::Widget::TouchEventType type){switch (type){case ui::Widget::TouchEventType::BEGAN:PlayMusic::playMusic("gravebutton");break;case ui::Widget::TouchEventType::ENDED:switch (button_type){case PauseQuitLayer_Button::查看图鉴: openHandBook();   break;case PauseQuitLayer_Button::从新开始: setRestart();     break;case PauseQuitLayer_Button::退出游戏: setQuitGame();    break;case PauseQuitLayer_Button::按键说明: keyDescription(); break;case PauseQuitLayer_Button::返回游戏: returnGame();     break;default: break;}}});
}

这个函数用于创建按钮,并设置按钮的属性和触摸事件。具体的实现步骤如下:

  1. 创建一个按钮对象 button,使用图片资源 "ButtonNew2.png" 和 "ButtonNew.png",使用 TextureResType::PLIST 方式加载。
  2. 创建一个标签对象 label,使用字体文件 GAME_FONT_NAME_1 和字号 35。
  3. 设置标签的阴影效果,使用 enableShadow() 函数并传入阴影颜色 Color4B(0, 0, 0, 200)。
  4. 设置标签的缩放比例为 2.0。
  5. 将标签设置为按钮的标题标签,设置标题颜色为白色。
  6. 设置按钮的位置为 vec2
  7. 设置按钮的缩放比例为 0.5。
  8. 将按钮添加到 _option 节点中。
  9. 为按钮添加触摸事件回调函数,使用 addTouchEventListener() 函数。
  10. 在触摸事件回调函数中,根据触摸事件类型进行不同的处理:
    • 如果是触摸事件开始(BEGAN),播放 "gravebutton" 音效。
    • 如果是触摸事件结束(ENDED),根据按钮类型 button_type 执行相应的操作,包括打开图鉴、重新开始游戏、退出游戏、显示按键说明和返回游戏。

这段代码的功能是创建按钮并设置按钮的属性和触摸事件。根据按钮类型的不同,触摸事件的处理也不同,可以执行不同的操作。


其他函数 

其他函数不再一一解释,请自行查看理解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/550.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

「探索C语言内存:动态内存管理解析」

🌠先赞后看,不足指正!🌠 🎈这将对我有很大的帮助!🎈 📝所属专栏:C语言知识 📝阿哇旭的主页:Awas-Home page 目录 引言 1. 静态内存 2. 动态内存 2.1 动态内…

超越现实的展览体验,VR全景展厅重新定义艺术与产品展示

随着数字化时代的到来,VR全景展厅成为了企业和创作者展示作品与产品的新兴选择。通过结合先进的虚拟现实技术,VR全景展厅不仅能够提供身临其境的观展体验,而且还拓展了传统展示方式的界限。 一、虚拟现实技术的融合之美 1、高度沉浸的观展体验…

本地项目如何设置https——2024-04-19

问题:由于项目引用了html5-qrcode插件,但是该插件在本地移动端调试时只能使用https访问,所有原本的本地地址是http,就需要改成https以方便调试。 解决方法:使用本地https证书 1)从项目文件下打开cmd逐步输…

vulfocus靶场tomcat-cve_2017_12615 文件上传

7.0.0-7.0.81 影响版本 Windows上的Apache Tomcat如果开启PUT方法(默认关闭),则存在此漏洞,攻击者可以利用该漏洞上传JSP文件,从而导致远程代码执行。 Tomcat 是一个小型的轻量级应用服务器,在中小型系统和并发访问用户不是很多…

基于达梦数据库开发-C#篇

文章目录 前言一、相关准备二、主要代码1.引入达梦类库2.连接达梦数据库3.DmCommand方式获取达梦数据库信息4.DmDataAdapter方式获取达梦数据库信息 总结 前言 达梦数据库是国产的新一代大型通用关系型数据库,全面支持 SQL 标准和主流编程语言接口/开发框架。其中.…

OpenHarmony实战开发-如何利用panel实现底部面板内嵌套列表。

介绍 本示例主要介绍了利用panel实现底部面板内嵌套列表,分阶段滑动效果场景。 效果图预览 使用说明 点击底部“展开”,弹出panel面板。在panel半展开时,手指向上滑动panel高度充满页面,手指向下滑动panel隐藏。在panel完全展开…

浏览器工作原理与实践--浏览上下文组:如何计算Chrome中渲染进程的个数

经常有朋友问到如何计算Chrome中渲染进程个数的问题,那么今天就来完整地解答这个问题。 在前面“04 | 导航流程”这一讲中我们介绍过了,在默认情况下,如果打开一个标签页,那么浏览器会默认为其创建一个渲染进程。不过我们在“04 |…

Echarts-知识图谱

Echarts-知识图谱 demo地址 打开CodePen 效果 思路 1. 生成根节点 2. 根据子节点距离与根节点的角度关系,生成子节点坐标,进而生成子节点 3. 从子节点上按角度生成对应的子节点 4. 递归将根节点与每一层级子节点连线核心代码 定义节点配置 functio…

基于springboot实现车辆管理系统设计项目【项目源码+论文说明】计算机毕业设计

基于springboot实现车辆管理系统演示 摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了车辆管理系统的开发全过程。通过分析车辆管理系统管理的不足,创建了一个计算机管理车辆管理系统的方案。文章介…

黑洞路由、 DDoS 攻击 、 环路

黑洞路由 DDoS 攻击 DDoS 攻击是一种针对服务器、服务或网络的恶意行为。DDoS 攻击通过向目标发送大量流量,使其不堪重负,导致资源和带宽被耗尽。因此,目标可能会变慢或崩溃,无法正常处理合法的流量。DDoS 攻击通常是由僵尸网络…

在龙梦迷你电脑福珑2.0上使用Fedora 28 龙梦版

在龙梦迷你电脑福珑2.0上使用Fedora 28 龙梦版。这个版本的操作系统ISO文件是:Fedora28_for_loongson_MATE_Live_7.2.iso 。它在功能方面不错。能放音乐,能看cctv直播,有声音,能录屏,能在局域网里用PuTTY的ssh方式连接…

《苏东坡 传》一蓑烟雨任平生

《苏东坡 传》一蓑烟雨任平生 林语堂,中国现代著名作家、学者、翻译家、语言学家。 张振玉 译 文章目录 《苏东坡 传》一蓑烟雨任平生[toc]摘录小结感悟 摘录 苏东坡是个秉性难改的乐天派,是悲天悯人的道德家,是黎民百姓的好朋友,…

C语言C/S架构PACS影像归档和通信系统源码 医院PACS系统源码

C语言C/S架构PACS影像归档和通信系统源码 医院PACS系统源码 医院影像科PACS系统,意为影像归档和通信系统。它是应用在医院影像科室的系统,主要的任务是把日常产生的各种医学影像(包括核磁、CT、超声、各种X光机、各种红外仪、显微…

JAVA ASM总结篇-03

MethodVisitor ClassVisitor的visitMethod能够访问到类中某个方法的一些入口信息,那么针对具体方法中字节码的访问是由MethodVisitor来进行的 访问顺序如下,其中visitCode和visitMaxs仅调用一次,标志方法字节码访问的开始和结束 MethodVisi…

不羁联盟怎么参与测试 不羁联盟测试时间+参与测试方法分享

不羁联盟怎么参与测试 不羁联盟测试时间参与测试方法分享 《不羁联盟》是由育碧(Ubisoft)开发的一款6v6团队合作射击游戏。游戏的背景设定在一个后启示录时代的废土世界中,玩家能够身临其境地感受到废土世界的荒凉和残酷。游戏在内测时候就受…

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台级联时,下级平台未发流是什么原因?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

AUTOCAD输出或打印PDF文件时,如何将图形居中且布满图纸?

AUTOCAD输出或打印PDF文件时,如何将图形居中且布满图纸? 如下图所示,我们打开一份DWG格式的图纸文件,然后点击上方的“打印“图标, 如下图所示, 打印机/绘图仪这里选择“DWG To PDF“; 图纸尺寸:这里以普通的A4纸为例进行说明; 打印比例选择“布满图纸“; 打印偏移…

优维应用级数字化架构管理:让企业运维天堑变通途

在优维科技的产品视角中,数字化架构管理就像是一门精妙的艺术,它将上层应用模型的业务概念以可视化的方式呈现出来,使得业务逻辑和流程变得更加直观、清晰。我们将这样的管理方式理解为“给企业搭起一座桥梁”——在这座桥梁的搭建过程中&…

express服务器 authorization 前端获取不到的问题

服务器生成token 设置在响应头,但是前端获取不到 const token JWT.generate({ id: new Date().getTime(), userName }, 10s) res.header(Authorization, token) axios.interceptors.response.use((response) > {console.log(response);if (response.data?.co…

破解费用管理迷局,企业费用管理从不止于报销

数字化变革浪潮下,各种企业费用报销软件如雨后春笋般不断涌现,企业报销效率大幅提升,部分财务处理流程得到固化和优化,报销早已不再是企业费时费力的财务难题。那么,企业费用管里如何实现呢? 企业费用贯穿于…