CCClippingNode:在游戏中实现遮罩效果、剪切效果,以涂抹糖霜为例,如何更好的实现涂抹效果,提高用户的游戏体验

news/2024/7/20 23:10:57 标签: 游戏, cocos2d, 游戏开发, ios, xcode, c++

CCClippingNode:在游戏中实现遮罩效果、剪切效果,以涂抹糖霜为例,如何更好的实现涂抹效果

cocos2dx_1">设备/引擎:Mac(11.6)/cocos2d-x

开发工具:Xcode(13.0)

开发需求:实现用户在饼干上涂抹糖霜的效果

最近工程中需要在新玩法中增加一个在饼干上涂抹糖霜的效果,方法跟前一篇的吃东西差不多,都是用到CCClippingNode来完成效果。

不同的是涂抹效果需要考虑以下问题
1.用户更换不同的糖霜:需要考虑实时更换对应的糖霜Node;
2.涂抹糖霜的层级:新的糖霜需要在旧的糖霜之上;
3.糖霜与其他topping的层级:避免出现糖霜覆盖其余topping的情况;

1.创建糖霜Node:
注:除了初始化需要创建,每次更换糖霜时也需要创建

//初始化
……
    CCNode* newNOde = CCNode::create();
    CCSprite* maskInLayer = CCSprite::create(糖霜资源路径);
    maskInLayer->setScale(1.1);
    maskInLayer->setPosition(ccp(center.x,center.y+70));
    maskInLayer->setTag(kFrostMaskTextureInClipping);
    CCClippingNode* clip2 = CCClippingNode::create(newNOde);
    clip2->addChild(maskInLayer);
    clip2->setInverted(false);				//糖霜默认看不见
    clip2->setAlphaThreshold(0.0f);
……
//更换糖霜:在CCTouchBegan中
	 CCClippingNode* frostcookieNode = this->MakeFrostClipNode(糖霜资源路径);//与初始化创建一样的方法
	this->addChild(frostcookieNode,5);
	frostNodeArr->addObject(frostcookieNode);	//将新建的糖霜节点加到数组中

2.将创建的糖霜节点存放到一个动态数组CCArray中
注:游戏中用户随时会更换糖霜,为了保证涂抹的糖霜永远都在最上层显示,我们每更换一种糖霜都需要将新创建的糖霜节点存放到同一个动态数组中,当创建剪切区域时再从数组中取出糖霜节点即可

……
  CCArray* frostNodeArr = CCArray::create();
  frostNodeArr->retain();
……

  frostNodeArr->addObject(clip2);

3.创建触摸显示区域并将精灵加到糖霜节点上
注:需要在涂抹过程中不停去创建剪切区域,也就是放到CCTouchMoved中

    if (frostNodeArr->count()>0) {
        int lastNum = frostNodeArr->count()-1;
        CCClippingNode* frostNode = (CCClippingNode*)frostNodeArr->objectAtIndex(lastNum);	//获取最新的糖霜节点
        if (frostNode != NULL) {
            CCNode* newFrostNode = frostNode->getStencil();
            if (newFrostNode) {
                CCPoint frostPos = frostNode->convertToNodeSpace(location);
                CCSprite* mask = CCSprite::create("makeup/makeupbrush.png");
                mask->setPosition(ccp(frostPos.x, frostPos.y));
                    mask->setScale(0.8);
                newFrostNode->addChild(mask,9);
            }
        }
    }

4.糖霜与其他非CCClippingNode类型的Topping层级问题
遇到此类情况如果不处理就很容易会出现糖霜将其他topping覆盖的情况,但是直接更改层级也没什么效果,这种情况就需要考虑将糖霜跟其他不同类型的topping放到同一个layer上,可以新创建一个layer,然后通过layer对他们的层级进行修改调整。

希望能给大家带来帮助!!!有什么问题需要讨论的可以评论私信欢迎讨论~


http://www.niftyadmin.cn/n/4951104.html

相关文章

Java课题笔记~ Ajax

1.1 概述 AJAX (Asynchronous JavaScript And XML):异步的 JavaScript 和 XML。 我们先来说概念中的 JavaScript 和 XML,JavaScript 表明该技术和前端相关;XML 是指以此进行数据交换。 1.1.1 作用 AJAX 作用有以下两方面: 与服…

基于Forcite模块的分子动力学研究药剂与矿物相互作用实例(一)

关键词:相互作用 MS Forcite 分子动力学 径向分布 笔名:杨过 Forcite模块是分子动力学计算的主要模块,研究范围广,可以对多种周期性体系进行计算分析,在矿物分选领域中主要是计算分析药剂与矿物相互作用&#xff0…

(六)、深度学习框架中的算子

1、深度学习框架算子的基本概念 深度学习框架中的算子(operator)是指用于执行各种数学运算和操作的函数或类。这些算子通常被用来构建神经网络的各个层和组件,实现数据的传递、转换和计算。 算子是深度学习模型的基本组成单元,它们…

请不要用 JSON 作为配置文件,使用JSON做配置文件的缺点

我最近关注到有的项目使用JSON作为配置文件。我觉得这不是个好主意。 这不是JSON的设计目的,因此也不是它擅长的。JSON旨在成为一种“轻量级数据交换格式”,并声称它“易于人类读写”和“易于机器解析和生成”。 作为一种数据交换格式,JSON是…

目标检测YOLO实战应用案例100讲-面向交通复杂目标场景的机器视觉检测技术研究

目录 前言 相关背景知识 深度卷积神经网络 2.1.1 基本概念 2.1.2 基本网络结构

win11安装ubuntu 子系统安装过程及注意事项

第一步 :安装系统必须组件 由于子系统是系统自带组件,需要安装软件支持 第二步:应用商店安装 ubuntu 编辑 编辑 这个时候打开会报错 第三步,运行linux子系统 选择Windows PowerShell 以管理员身份运行) 输入&#…

核能的发展与应用

目录 1.核能的概念 2.核能的实现原理 3.核能的利与弊 4.核能未来的发展趋势 1.核能的概念 核能是指利用核反应过程中释放出的能量来产生电力或其他形式能量的能源形式。核能主要通过核裂变和核聚变两种方式产生。 1. 核裂变:核裂变是指重核(通常是铀、…

网络安全--负载均衡

负载均衡 webshell实践 一、负载均衡配置 1.在全局的http下写下它: upstream nginx_boot{# 30s内检查心跳发送两次包,未回复就代表该机器宕机,请求分发权重比为1:2server 192.168.0.000:8080 weight100 max_fails2 fail_timeout30s; ser…