CocosCreator之KUOKUO带你做个RTS(一)cc.graphics实现选取框

本次引擎2.0.9

目标

RTS战略游戏中的选取框

实现

利用cc.graphics组件绘制,
确定范围后,children属性遍历。

最终效果

在这里插入图片描述
层级
在这里插入图片描述
记得绑定绘图组件
controlLayer.js脚本

cc.Class({
    extends: cc.Component,

    properties: {
        // 为了调用playerMng方法
        playerMng : require('playerMng')
    },

    onLoad () {
        // 绘图组件
        this.ctx = this.getComponent(cc.Graphics);
        // 点击起始点
        this.startPoint = cc.v2(0,0);
        // 点击结束点
        this.endPoint = cc.v2(0,0);
    },

    start () {
        // 监听鼠标事件
        this.node.on('mousedown',this.mouseDown,this);
        this.node.on('mousemove',this.mouseMove,this);
        this.node.on('mouseup',this.mouseUP,this);
    },

    mouseDown (event) {
        // 如果是鼠标左键
        if (event.getButton() == cc.Event.EventMouse.BUTTON_LEFT) {
            // 转化为中心坐标系
            let pos = this.node.convertToNodeSpaceAR(event.getLocation());
            // 赋值起始点
            this.startPoint.set(pos);
        }
    },

    mouseMove (event) {
        // 如果是鼠标左键
        if (event.getButton() == cc.Event.EventMouse.BUTTON_LEFT) {
            // 转化为中心坐标系
            let pos = this.node.convertToNodeSpaceAR(event.getLocation());
            let w = pos.x - this.startPoint.x;
            let h = pos.y - this.startPoint.y;
            this.ctx.clear();
            this.ctx.rect(this.startPoint.x,this.startPoint.y,w,h);
            this.ctx.stroke();
        }
    },

    mouseUP (event) {
        this.ctx.clear();
        // 记录结束点
        // 转化为中心坐标系
        let pos = this.node.convertToNodeSpaceAR(event.getLocation());
        this.endPoint.set(pos);
        
        // 对区域内坦克显示
        this.playerMng.mapForSign(this.startPoint,this.endPoint);
    },
    
});

这样,调用playerMng.js中的遍历及控制

playerMng.js脚本

cc.Class({
    extends: cc.Component,

    properties: {
        // 坦克预制体
        tank : cc.Prefab
    },

    start () {
        // 创造3个
        this.createOne(0,0);
        this.createOne(100,100);
        this.createOne(100,-200);
    },

    createOne (x, y) {
        let t = cc.instantiate(this.tank);
        t.parent = this.node;
        t.x = x;
        t.y = y;
    },

    mapForSign (startPoint, endPoint) {
        // 根据两点取框选范围
        let max_X = startPoint.x >= endPoint.x ? startPoint.x : endPoint.x;
        let min_X = startPoint.x < endPoint.x ? startPoint.x : endPoint.x;
        let max_Y = startPoint.y >= endPoint.y ? startPoint.y : endPoint.y;
        let min_Y = startPoint.y < endPoint.y ? startPoint.y : endPoint.y;
        // 遍历子节点
        for (let i = 0; i < this.node.children.length; i++) {
            if (this.node.children[i].x > min_X && this.node.children[i].x < max_X &&
                this.node.children[i].y > min_Y && this.node.children[i].y < max_Y) {
                // 在范围内
                let t = this.node.children[i].getComponent('tank');
                // 未被控制时显示光圈
                if (t.isCtrl == false) {
                    t.showSign();
                }
            } else {
                // 不在范围内
                let t = this.node.children[i].getComponent('tank');
                t.isCtrl = false;
                t.closeSign();
            }
        }
    }
});

预制体结构
在这里插入图片描述tank.js脚本

cc.Class({
    extends: cc.Component,

    properties: {
        // 光圈节点绘图组件
        ctx : cc.Graphics,
        // 是否被控制
        isCtrl : false
    },

    showSign () {
        this.ctx.circle(0,0,20);
        this.ctx.stroke();
    },

    closeSign () {
        this.ctx.clear();
    }
});

好了,第一部分完成!!!!
O(∩_∩)O~~

加我QQ群:(博客里面的项目,群文件里都有哦)
706176551
我们一起学习!
O(∩_∩)O~~
  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
回答: 在Cocos Creator中,常用的设计模式包括子弹工厂模式、单例模式和建造者模式。子弹工厂模式是通过工厂来创建子弹节点,根据提供的子弹种类、速度和方向来自动创建子弹节点并返回,实现了代码的精简和灵活性。\[1\]单例模式用于创建一个全局唯一的实例,可以在整个应用程序中共享和访问该实例,避免了多次实例化的问题。\[2\]建造者模式用于创建复杂的对象,通过将对象的构建过程分解为多个步骤,使得对象的构建更加灵活和可扩展。\[3\]这些设计模式在Cocos Creator中可以帮助开发者更好地组织和管理代码,提高开发效率和代码质量。 #### 引用[.reference_title] - *1* [CocosCreator进阶实战第四部分:工厂模式](https://blog.csdn.net/kuokuo666/article/details/103722679)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [设计模式---创建型模式(工厂模式、抽象工厂模式、单例模式、建造者模式、原型模式)](https://blog.csdn.net/sinat_36499762/article/details/115624011)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KUOKUO众享

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值