首页 > 其他分享 >Cocos Creator之不规则的点击区域

Cocos Creator之不规则的点击区域

时间:2023-11-13 23:01:13浏览次数:32  
标签:Node Cocos Creator void btnImg 点击 PolygonCollider2D import event

一,前景

1,点击区域不是一个矩形,如下图所示

Cocos Creator之不规则的点击区域_区域

二,新建一个节点(Node)

     1,添加Sprite组件

Cocos Creator之不规则的点击区域_点击区域_02

    2,继续添加Button组件

Cocos Creator之不规则的点击区域_点击区域_03

3, 添加PolygonCollider2D组件

Cocos Creator之不规则的点击区域_点击区域_04

三,核心代码

import {
    _decorator,
    Component,
    Node,
    isValid,
    PolygonCollider2D,
    Intersection2D,
    UITransform,
    Vec3,
    v2,
    EventTouch,
    math,
    v3,
    Sprite, SpriteFrame, ImageAsset
} from 'cc';
import IBundleResItemType from "../manager/bundle/IBundleResItemType";
import AppUtil from "../utils/AppUtil";
import { ResConfig } from "../manager/bundle/ResConfig";
import BundleResManager from "../manager/bundle/BundleResManager";

const { ccclass, property } = _decorator;

@ccclass('ButtonUI')
export class ButtonUI extends Component {
    @property({ type: Node, tooltip: "按钮" })
    private btnImg: Node = null;

    protected start(): void {
        const item: IBundleResItemType<ImageAsset> = AppUtil.getPreload(ResConfig, "red") as IBundleResItemType<ImageAsset>;
        let imageAsset: ImageAsset = BundleResManager.instance.getAsset(AppUtil.getLoadingABName(ResConfig), item.urls as string);
        this.btnImg.getComponent(Sprite).spriteFrame = SpriteFrame.createWithImage(imageAsset);
    }

    protected onEnable(): void {
        this.listener(true);
    }

    protected onDisable(): void {
        this.listener(false);
    }

    private listener(isAdd: boolean): void {
        if (isAdd) {
            this.btnImg.on(Node.EventType.TOUCH_END, this.onClickHandler, this);
        } else {
            this.btnImg.off(Node.EventType.TOUCH_END, this.onClickHandler, this);
        }
    }

    private onClickHandler(event: EventTouch): void {
        if (!isValid(this.node)) return;
        if (this.isCheckAreaSuccess(this.btnImg, event)) {
            console.log("点击成功");
        } else {
            console.log("点击失败");
        }
    }

    private isCheckAreaSuccess(btnNode: Node, event: EventTouch): boolean {
        if (!isValid(btnNode) || !event) {
            return false;
        }
        let collider: PolygonCollider2D = btnNode.getComponent(PolygonCollider2D);
        let mathV2: math.Vec2 = event.getUILocation();
        let local: Vec3 = btnNode.getComponent(UITransform).convertToNodeSpaceAR(v3(mathV2.x, mathV2.y));
        return Intersection2D.pointInPolygon(v2(local.x, local.y), collider.points);
    }

}

Cocos Creator之不规则的点击区域_Cocos_05


标签:Node,Cocos,Creator,void,btnImg,点击,PolygonCollider2D,import,event
From: https://blog.51cto.com/aonaufly/8355523

相关文章

  • linux xfce 在文件管理器里点击运行shell脚本文件
    1.打开SettingsEditor2.点击左边的thunar3.点击右边的添加,在属性中输入/misc-exec-shell-scripts-by-default在类型中选择布尔类型在值中选择真保存4.给shell脚本文件添加运行权限命令行chmod+xyour_filename或者gui界面在右键脚本文件,点击属性,在权限里允许......
  • Cocos Creator 性能调优之《如何优化2D/3D Drawcall》
    游戏渲染是性能开销的大头,在项目开发中掌握性能调优中渲染优化相关技巧是非常重要的。渲染优化又可以从很多方面来入手,其中降低Drawcall是非常重要的手段之一。接下来从4个点来详细的讲解基于CocosCreator3.x如何做Drawcall的性能优化:为什么降低Drawcall能提升渲染性能;常用合......
  • Cocos Creator中的向量cc.Vec2和矩形cc.Rect
    前言在CocosCreator游戏开发中,经常需要使用向量和矩形,这篇文章我们来总结下其常见用法。一、Vec2二维向量 对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学习。 1.`letv1:cc.Vec2=......
  • Cocos Creator 「无侵入」资源加密方案
    前言CocosCreator打包后的素材资源,如:图片,声音等,默认是保持原始格式,只要遇到破解党,那么他们极有可能很简单就直接获取到这部分素材资源。针对这个问题,大部分同学都会有一种资源加密的需求,即对打包后的资源进行加密,让破解党不那么容易获取到资源。对啦!这里有个游戏开发交流小组......
  • fgui 怎么将"UI空间下的世界坐标"转换成"fgui空间下的世界坐标( global pos )" cocosc
    嗨~如果本文对你有帮助,点个推荐吧!这样能让文章在搜索中更靠前,帮助到更多有需要的人!首先通过坐标系转换一步步地进行计算我尝试过,但卡在了将屏幕坐标转换为fgui空间的全局坐标上。但发现了一个巧妙的做法。//随便的一个Cocoscreator的NodevaranyCCUINode=this._labe......
  • 在移动电话上点击网页链接时如何触发电话呼叫。
    内容来自DOChttps://q.houxu6.top/?s=在移动电话上点击网页链接时如何触发电话呼叫。我需要为移动设备构建一个网页。只有一件事我还没有弄清楚:如何通过点击文本来触发电话呼叫?是否有一个特殊的URL可以像mailto:标签用于电子邮件那样使用?不希望使用特定于设备的解决方......
  • 可以使用preventDefault()阻止默认行为,例如a链接的跳转,在a链接跳转中,需要先对a链接绑
    可以使用preventDefault()阻止默认行为,例如a链接的跳转,在a链接跳转中,需要先对a链接绑定点击事件,然后在a链接的事件对象中调用该方法即可下面三个事件都是事件对象的方法:stopPropagation()阻止事件冒泡。这个事件不会阻止定义在元素上的其他事件。stopImmediatePropagation()......
  • Cocos Creator动作系统和缓动系统总结
    动作系统就是可以在一定的时间内实现位移、旋转、缩放、跳动等各种动作。需要注意的是,动作系统跟CocosCreator编译器的动画系统不同,动作系统是面向程序员的API接口,而动画系统是通过编译器来设计,它们服务于不同的使用场景,动作系统通常适合做一些简单的位移、旋转等动作,而动画系......
  • Cocos Creator中Sprite组件使用详解
    在CocosCreator游戏开发中,Sprite组件是非常重要的组件之一,也是使用最频繁的组件之一。因此,必须对其非常熟悉。Sprite组件简介1:游戏中显示一个图片,通常我们把这个叫做”精灵”sprite2:cocoscreator如果需要显示一个图片,那么需要在节点上挂一个精灵组件,为这个组件指定要......
  • elementplus弹窗可拖拽draggable,点击空白处不消失close-on-click-modal,modal是否去掉
    <el-dialog:modal="false"v-model="dialogVisible"title=""width="30%"draggable:close-on-click-modal="false"class="message-dialog"></el-dialog&g......