(九)C++自制植物大战僵尸游戏自定义对话框的实现

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


对话框在游戏的交互中非常重要。在游戏中,对话框不仅可以提醒用户下达任务指令,而且还可以让用户进行操作,自定义游戏中的各种属性。对话框在游戏的交互中非常常见且大量使用。Cocos2d-x中并未实现对话框的功能。所以自定义实现一个对话框非常有必要。

代码文件位置

自定义对话框代码文件在Class\Based文件夹中,详细位置如下图所示。


Dialog.h 

Dialog类继承Cocos2d-xLayerColor类,LayerColor继承LayerLayerCocos2d-x中表示一个层,Layer存在于场景中,一个场景可以包含多个层。LayerColor可以设置层的颜色。由于需要弹出一个对话框,所以背景需要变黑,所以Diaglog继承LayerColor。当弹出一个对话框时,背景就会变黑,让用户聚焦到此对话之中。详细的C++代码如下所示。

class Dialog :public LayerColor
{
public:/***创建触摸监听*/static EventListenerTouchOneByOne* createTouchtListener(Sprite* sprite);/***设置鼠标监听*/virtual void setMouseListener(EventListenerMouse* listener);protected:/***创建标签*/virtual Label* label(const std::string &name, const float& fontsize, Vec2 &vec2 = Vec2(0, 0), const float& space = 0, const Color3B& color = Color3B::GREEN, const float& scale = 1);/***创建按钮上的标签 */virtual void createLabel(Sprite* sprite, MenuItemImage* MenuItem, const std::string &name, Vec2 &vec2, float& fontsize, const float& space = 0, const Color3B& color = Color3B::GREEN);/***创建屏蔽层*/virtual void createShieldLayer(Node* node);/***删除层*/virtual void deleteDialog(){}/***设置鼠标监听是否可用*/virtual void setMouseListenerEnable(bool isEnable = true);CC_CONSTRUCTOR_ACCESS:Dialog();~Dialog();protected:Global* _global;EventListenerMouse* _mouseListener;private:Vec2 _phasePosition; /* 相差位置 */EventListenerTouchOneByOne* _shieldListener;
};

对话框函数可以移动,所以定义了触摸监听函数createTouchtListener()setMouseListener()。对话框上需要有标签,所以定义了标签函数createLabel()。对话框上需要有各种按钮,所以定义了创建按钮的函数。当弹出对话框时,背景中的所有按钮及可点击的部分我们不希望可以再被点击,所以需要当弹出对话框时将背景触摸点击监听屏蔽,所以定义了屏蔽层函数createShieldLayer()


Dialog.cpp 

在源文件中实现了头文件中定义的函数。下面将对重要的函数进行介绍。

构造函数

构造函数对重要变量进行初始化。

Dialog::Dialog():_shieldListener(nullptr),_mouseListener(nullptr),_phasePosition(Vec2::ZERO),_global(Global::getInstance())
{
}

createTouchtListener()函数

函数有一个参数,传入一个Sprite(精灵),用于监听这个Sprite的触摸。创建完成后返回监听。

在函数中需要获取Sprite坐标以及触摸位置的坐标。计算这两个坐标之间的差值phasePosition,在触摸移动的过程中需要实时改变Sprite的位置,设置位置时需要减去phasePosition,这样才能平稳滑动Sprite,否则在首次接触Sprite的时候会导致Sprite瞬间移动到触摸位置。

EventListenerTouchOneByOne* Dialog::createTouchtListener(Sprite* sprite)
{/* 创建触摸监听 */static Vec2 phasePosition = Vec2(Vec2::ZERO);auto listener = EventListenerTouchOneByOne::create();listener->onTouchBegan = [&,sprite](Touch *t, Event *e) {if (sprite->getBoundingBox().containsPoint(t->getLocation())){phasePosition = t->getLocation() - sprite->getPosition();return true;}else return false;};listener->onTouchMoved = [=](Touch *t, Event *e) {sprite->setPosition(t->getLocation() - phasePosition);};Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, sprite);return listener;
}

 


createShieldLayer()函数

当弹出对话框时,背景中的所有按钮及可点击的部分我们不希望可以再被点击,所以需要当弹出对话框时将背景触摸点击监听屏蔽,所以定义了屏蔽层函数createShieldLayer()

函数有一个参数Node,当将Node传入该函数,除该Node可以监听事件之外,场景中其他层的监听将会被屏蔽。

void Dialog::createShieldLayer(Node* node)
{// set shieldLayer_shieldListener = EventListenerTouchOneByOne::create();_shieldListener->onTouchBegan = [](Touch* touch, Event* event)-> bool { return true; };_shieldListener->setSwallowTouches(true);_eventDispatcher->addEventListenerWithSceneGraphPriority(_shieldListener, node);
}

label()函数

函数参数较多,参数表示的有文字本身、字体大小颜色、字间距、缩放比例、位置等。

Label* Dialog::label(const std::string &name, const float& fontsize, Vec2 &vec2, const float& space, const Color3B& color, const float& scale)
{auto label = Label::createWithTTF(name, GAME_FONT_NAME_1, fontsize);label->setScaleX(scale);label->setColor(color);label->setAdditionalKerning(space);//设置列间距label->enableShadow(Color4B(100, 20, 100, 255));//设置阴影label->setPosition(vec2);return label;
}

其他函数

void Dialog::setMouseListener(EventListenerMouse* listener)
{_mouseListener = listener;
}void Dialog::setMouseListenerEnable(bool isEnable)
{_mouseListener->setEnabled(isEnable);
}

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

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

相关文章

LigaAI x 极狐GitLab,共探 AI 时代研发提效新范式

近日,LigaAI 和极狐GitLab 宣布合作,双方将一起探索 AI 时代的研发效能新范式,提供 AI 赋能的一站式研发效能解决方案,让 AI 成为中国程序员和企业发展的新质生产力。 软件研发是一个涉及人员多、流程多、系统多的复杂工程&#…

[docker] 核心知识 - 概念和运行

[docker] 核心知识 - 概念和运行 之前 docker 学了个开头就去搞项目去了,不过项目也开展了好久了,前端差不多吃透了,有些新功能需要用 docker 和 k8s……是时候重新学习一下了。 这一部分简单的过一下概念和讲一下怎么运行 docker 镜像和启…

wps使用Latex编辑公式没有Latex formula

wps使用Latex编辑公式没有Latex formula 1. 下载CTEX2. 下载LaTeXEE3. 配置Miktex4. 配置latexee5. 用管理员权限运行latexeqedit.exe6. wps插入latex公式 1. 下载CTEX 下载CTEX网址,我下载的下图这个,下载完了之后运行exe文件安装ctex。 2. 下载LaTe…

深入理解k8s kube-proxy

1、概述 我觉得只要大家知道kube-proxy是用来配置网络规则的而不是转发流量的,真正的流量由iptables/ipvs来转发就可以了。 网络是k8s的一个关键部分。理解k8s中网络组件如何工作可以帮助更好的设计和配置我们的应用。 kube-proxy就是K8s网络的核心组件。它把我们…

janus部署

配置和运行janus 1. 配置nginx 安装nginx,主要用来提供web访问。 生成证书 mkdir -p ~/cert cd ~/cert # CA私钥 openssl genrsa -out key.pem 2048 # 自签名证书 openssl req -new -x509 -key key.pem -out cert.pem -days 1095安装nginx #下载nginx 1.15.8版…

OOCT WPF_D3D项目报错无法加载依赖项

运行示例项目报错缺少dll,发现运用了这个大老李,通过添加PATH路径也无法解决,看到debug文件夹下面没有其他的依赖项。 通过depneds工具可以看到 OCCTProxy_D3D.dll 缺少依赖项,图中的缺项都是OCCT生成的模块dll所以讲这些dll从..…

百度 千帆sdk 试用

主要是Java SDK的使用&#xff1a; <dependency> <groupId>com.baidubce</groupId> <artifactId>qianfan</artifactId> <version>0.0.4</version> </dependency> 参考文档&#xff1a;bce-qianfan-sdk/java at main baidub…

【CVE-2010-2883】进行钓鱼攻击的研究

最近作业中研究APT攻击&#xff0c;了解到2011年前后披露的LURID-APT&#xff0c;其中敌手利用了各种版本的文件查看器的漏洞实现攻击。CVE-2010-2883就是其中被利用的一个adobe reader的漏洞。特此复现&#xff0c;更好的研究和防范APT攻击。 本文仅仅是对相关漏洞利用的学习…

若依前后端部署到一起

引用&#xff1a;https://blog.csdn.net/qq_42341853/article/details/129127553 前端改造&#xff1a; 配置打包前缀 修改router.js 编程hash模式&#xff1a; 前端打包&#xff1a;npm run build:prod 后端修改&#xff1a; 添加thymeleaf包&#xff0c;和配置文件 spri…

spring-cloud微服务gateway

核心部分&#xff1a;routes(路由)&#xff0c; predicates(断言)&#xff0c;filters(过滤器) id&#xff1a;可以理解为是这组配置的一个id值&#xff0c;请保证他的唯一的&#xff0c;可以设置为和服务名一致 uri&#xff1a;可以理解为是通过条件匹配之后需要路由到&…

rhce day1

一 . 在系统中设定延迟任务要求如下 在系统中建立 easylee 用户&#xff0c;设定其密码为 easylee 延迟任务由 root 用户建立 要求在 5 小时后备份系统中的用户信息文件到 /backup 中 确保延迟任务是使用非交互模式建立 确保系统中只有 root 用户和 easylee 用户可以执行延…

线性表概念及顺序表的实现

文章目录 前言一、线性表1.定义2.特点3.一般线性表的抽象数据类型定义 二、线性表的顺序存储&#xff08;顺序表&#xff09;1.基本概念2.数组实现顺序表3.顺序表中基本操作的具体实现4.顺序表总结 总结 前言 T_T此专栏用于记录数据结构及算法的&#xff08;痛苦&#xff09;学…

Golang教程一(环境搭建,变量,数据类型,数组切片map)

目录 一、环境搭建 1.windows安装 2.linux安装 3.开发工具 二、变量定义与输入输出 1.变量定义 2.全局变量与局部变量 3.定义多个变量 4.常量定义 5.命名规范 6.输出 格式化输出 7.输入 三、基本数据类型 1.整数型 2.浮点型 3.字符型 4.字符串类型 转义字…

计算机网络(四)网络层

网络层 基本概念 网络互联&#xff1a; 将两个以上的计算机网络&#xff0c;通过一定的办法&#xff0c;用一种或多种通信处理设备(即中间设备)相互连接起来&#xff0c;以构成更大的网络系统。中间设备又称中间系统或中继系统 中继系统分为4种&#xff1a; 物理层中继系统…

Navicat的安装与破解

个人介绍 hello hello~ &#xff0c;这里是 code袁~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的…

EI级 | Matlab实现TCN-LSTM-MATT、TCN-LSTM、TCN、LSTM多变量时间序列预测对比

EI级 | Matlab实现TCN-LSTM-MATT、TCN-LSTM、TCN、LSTM多变量时间序列预测对比 目录 EI级 | Matlab实现TCN-LSTM-MATT、TCN-LSTM、TCN、LSTM多变量时间序列预测对比预测效果基本介绍程序设计参考资料 预测效果 基本介绍 【EI级】Matlab实现TCN-LSTM-MATT、TCN-LSTM、TCN、LSTM…

Unity 扩展自定义编辑器窗口

在Assets文件夹路径下任意位置创建Editor文件夹&#xff0c;将扩展编辑器的代码放在Editor文件夹下 生成编辑器窗口 代码中首先引用命名空间 using UnityEditor; 然后将创建的类继承自EditorWindow public class MenuEditor : EditorWindow 然后通过扩展编辑器菜单功能调用…

AI - 提示词意外收获 (5)

提示词&#xff1a; A soft pink rose with opalescent leaves, located in a surreal desert under the light of a binary star system, The dual shadows and contrasting lights create a dreamlike quality, emphasizing the roses unique beauty,翻译: 一种柔软的粉红…

动态规划|343.整数拆分

力扣题目链接 class Solution { public:int integerBreak(int n) {vector<int> dp(n 1);dp[2] 1;for (int i 3; i < n ; i) {for (int j 1; j < i / 2; j) {dp[i] max(dp[i], max((i - j) * j, dp[i - j] * j));}}return dp[n];} }; 思路 看到这道题目&…

153. 寻找旋转排序数组中的最小值

Problem: 153. 寻找旋转排序数组中的最小值 文章目录 思路解题方法复杂度Code 思路 排序( O ( n l o g n ) O(nlogn) O(nlogn)) 或者 循环一次( O ( n ) O(n) O(n))&#xff0c;但时间复杂度均不满足要求 解题方法 二分 当数组旋转后&#xff0c;只有可能出现如图的两种情况&am…