当前位置: 首页 > article >正文

【100个Cocos实例】完蛋,你看我在刮刮乐中刮到了什么?

在这里插入图片描述

引言

什么?还能刮出这个?

相信大家对刮刮乐都不陌生,昨天听到小伙伴说花了20买了张刮刮乐,结果刮中了20白忙活一场

假如我们要在Cocos游戏开发中实现刮刮乐效果,应该怎么做呢?

本文将介绍一下如何实现能刮出美女的刮刮乐效果。

本文源工程可在文末获取,小伙伴们自行前往。

1.实现原理

想要实现刮刮乐的效果,我们需要借助Mask遮罩组件和Graphics自定义图形组件。

1.遮罩组件

在这里插入图片描述

Mask组件是一个用于实现遮罩效果的关键组件。

通过使用Mask,你可以在游戏中创建各种形状的遮罩,用于显示或隐藏特定区域的内容,常用于实现圆形的头像

2.自定义图形组件

在这里插入图片描述

Graphics组件是一个用于绘制2D图形和路径的强大工具,可通过代码动态创建形状、线条和填充,为游戏界面和特效提供灵活的绘图功能

笔者在写文章和教程的时候就最喜欢用Graphics组件,因为它真的好用

2.资源准备

既然想要在刮刮乐中刮出美女,那么我们就要准备一张美女图,和一张盖在美女上面的遮罩图,所以,这次就委屈Cocos您了。

在这里插入图片描述

将图片放进去Creator,然后简单编辑一下UI。层级结构如下:

在这里插入图片描述

Mask节点添加Mask组件,并且勾选Inverted反向遮罩。添加Mask组件,系统会自动帮忙添加一个Graphics组件:

在这里插入图片描述

3.编写代码

首先创建一个ScratchTicket组件,包含对Mask组件的引用、Graphics组件的引用和isScratching变量用于判断是否正在刮刮刮乐。

import { _decorator, Component, Graphics, Mask, Node, UITransform, v3 } from 'cc';
const { ccclass, property } = _decorator;

@ccclass('ScratchTicket')
export class ScratchTicket extends Component {
    @property({ type: Mask })
    mask: Mask = null;

    graphics: Graphics;

    private isScratching: boolean = false;
}

start方法中获取Graphics组件以及添加鼠标事件的监听。

start() {
    this.graphics = this.mask.getComponent(Graphics);
    this.node.on(Node.EventType.TOUCH_START, this.onTouchStart, this);
    this.node.on(Node.EventType.TOUCH_MOVE, this.onTouchMove, this);
    this.node.on(Node.EventType.TOUCH_END, this.onTouchEnd, this);
}

onTouchStartonTouchEnd方法主要处理isScratching的状态。

onTouchStart(event) {
    this.isScratching = true;
}

onTouchEnd(event) {
    this.isScratching = false;
}

onTouchMove中主要实现刮刮乐的核心逻辑:

  • 通过event.getLocation()获取鼠标位置。
  • 通过convertToNodeSpaceAR实现坐标转换。
  • 通过circle方法画圆。
  • 通过fill进行填充。
onTouchMove(event) {
    if (!this.isScratching) return;
    const pos = this.node.getComponent(UITransform).convertToNodeSpaceAR(v3(event.getLocation().x, event.getLocation().y, 0));
    this.graphics.circle(pos.x, pos.y, 30);
    this.graphics.fill();
}

由于Mask组件的反向遮罩效果,画圆的地方会有“擦玻璃”的效果:

在这里插入图片描述

4.效果演示

在这里插入图片描述

结语

近日,笔者受麒麟子(深耕游戏引擎与游戏开发15年,每一滴干货都源自商业项目实践)的邀请,以嘉宾的形式加入知识星球,星球主要用于:

  • 导师教学
  • 学习问题交流
  • 新人入门与进阶
  • 招聘与就业机会分享
  • 面试题集锦
  • 面试经验分享

总的来说,星球的目标只有一个:提供优质内容,搞学习。感兴趣的小伙伴可以私信“知识星球”了解和捧场。

我是"亿元程序员",一位有着8年游戏行业经验的主程。在游戏开发中,希望能给到您帮助, 也希望通过您能帮助到大家。

AD:笔者线上的小游戏《贪吃蛇掌机经典》《重力迷宫球》《填色之旅》大家可以自行点击搜索体验。

实不相瞒,想要个在看!请把该文章分享给你觉得有需要的其他小伙伴。谢谢!

推荐专栏:

你知道王者荣耀是怎么实现技能范围指示器的吗?

8年主程手把手打造Cocos独立游戏开发框架

和8年游戏主程一起学习设计模式

从零开始开发贪吃蛇小游戏到上线系列

本文源工程可通过私信发送ScratchTicket获取。


http://www.kler.cn/news/149412.html

相关文章:

  • 【Java基础】-- Java包(package)命名规范
  • 选择更灵活的设计工具:SOLIDWORKS 软件网络版与单机版的比较
  • [C++][原创]VSCode C++怎么让运行的时候弹出cmd窗口,而不是在VSCode调试输出
  • Rust之构建命令行程序(一):接受命令行参数
  • 算法之插入排序及希尔排序(C语言版)
  • C++ day42背包理论基础01 + 滚动数组
  • source: command not found错误的解决方法
  • 学习知识随笔(Django)
  • 机器学习笔记 - 基于百度飞桨PaddleSeg的人体分割
  • Douuble 4 VR智能互动系统为酒店管理专业提供虚拟场景实训
  • 代洋集团,引领绿色能源新潮流
  • Python搭建运筹模型的代码框架
  • Android 13.0 系统settings系统属性控制一级菜单显示隐藏
  • layui下拉框jQuery动态修改选中并展示
  • Vue实现可拖拽边界布局
  • UE5、CesiumForUnreal实现加载GeoJson绘制多面(MultiPolygon)功能(支持点选高亮)
  • python循环调用http示例(一定时间duration内,每隔时间interval去调用一次)call_http()
  • osgFX扩展库-异性光照、贴图、卡通特效(1)
  • Docker+Anaconda+CUDA+cuDNN
  • C++ 17实现无锁队列
  • Servlet-Vue-JSON交互
  • JSP迭代标签之 forEach循环标签 基本使用讲解
  • 使用Wireshark提取流量中图片方法
  • JSP forEach 标签遍历map集合
  • 【nlp】4.5 迁移学习实践项目(相关概念、中文分类、填空、句子关系、模型微调)
  • Less 安装教程
  • Java第二十章
  • Android 12.0 禁用adb reboot recovery命令实现正常重启功能
  • Android控件全解手册 - 任意View缩放平移工具-源码
  • Oracle整体架构