飞机打方块(三)特殊按钮制作

news2024/10/6 14:25:11

一、特殊按钮容器

1.新建PropController脚本,并绑定新建的特殊按钮容器节点

 GameController.ts

 @property({ type: cc.Node, displayName: "特殊按钮节点", tooltip: "特殊按钮节点,分别为全消无敌和菜单" })
    special_btn: cc.Node = null;

PropController.ts

const { ccclass, property } = cc._decorator;

@ccclass
export default class NewClass extends cc.Component {


    @property({ type: cc.Button, displayName: "道具按钮", tooltip: "道具按钮" })
    btn: cc.Button[] = [];

    @property({ type: cc.Label, displayName: "显示道具按钮还可以用几次的文字", tooltip: "显示道具按钮还可以用几次的文字" })
    time_lb: cc.Label[] = [];

    @property({ type: cc.Float, displayName: "道具按钮还可以用几次", tooltip: "道具按钮还可以用几次" })
    time: number[] = []

    update() {
        //每帧更新文字显示内容
        this.time_lb[0].string = this.time[0].toString();
        this.time_lb[1].string = this.time[1].toString();

        //如果没有使用次数了,禁用按钮
        if (this.time[0] <= 0) {
            this.btn[0].interactable = false;
        } else {
            this.btn[0].interactable = true;
        }

        if (this.time[1] <= 0) {
            this.btn[1].interactable = false;
        } else {
            this.btn[1].interactable = true;
        }
    }

    //按钮按下减少一次使用次数
    onbtn0() {
        this.time[0] -= 1;
    }

    onbtn1() {
        this.time[1] -= 1;
    }
}

 2.绑定Canvas

二、全消按钮 

1.新建按钮节点,绑定Btn_scale脚本

 

 

 GameController.ts

//移除所有障碍物函数
    remove_all_barrier() {
        //获取当前所有障碍物父节点的名字
        let name = this.barrier_parent.name;
        //销毁所有障碍物的父节点
        this.barrier_parent.destroy();
        //new出一个新的节点代替被销毁的节点
        let node = new cc.Node;
        //名字不变
        node.name = name;
        //父节点时canvas
        node.parent = this.canvas;
        //坐标是0,0
        node.position = cc.v3(0, 0);
        //所有障碍物父节点变量赋值
        this.barrier_parent = node;
    }

 2.绑定按钮事件

 三、无敌按钮

 1.新建按钮节点,绑定Btn_scale脚本

 

 GameController.ts

@property({ type: cc.Prefab, displayName: "显示无敌剩余时间的文字", tooltip: "显示无敌剩余时间的文字" })
    invincible_lb_pre: cc.Prefab = null;


@property({ type: cc.Float, displayName: "无敌持续时间", tooltip: "无敌持续时间" })
    invincible_time: number = 8;



//无敌函数
    invincible() {
        let self = this;
        //将飞机分组设为无敌
        this.plane.group = "invicible";

        //显示粒子特效
        this.plane.children[0].active = true;
        this.plane.children[1].active = true;

        this.scheduleOnce(function () {
            self.plane.group = "default";
            self.plane.children[0].active = false;
            self.plane.children[1].active = false;
        }, this.invincible_time);

        let lb = cc.instantiate(this.invincible_lb_pre);
        lb.parent = this.label_parent;
        this.scheduleOnce(function () {
            lb.destroy();
        }, this.invincible_time)
    }

Barrier.ts

//碰撞回调
    //当碰撞产生的时候调用other产生碰撞的另一个组件 self产生碰撞的自身的碰撞组件
    onCollisionEnter(other, self) {
        if (other.node.group == "bullet") {

            //获取GameController脚本
            let gc = cc.find("/Canvas").getComponent("GameController") as GameController;
            //获取Bullet脚本
            let c = other.getComponent("Bullet");

            //从脚本获取攻击力较少自身生命值
            this.reduce_num(c.ATK);
            // 如果可以加双倍分数
            if (gc.is_double == true) {
                //加分
                gc.add_score((c.ATK) * 2)
            }
            //如果不可以加双倍分数
            if (gc.is_double == false) {
                gc.add_score(c.ATK);
            }
            //销毁子弹
            other.node.destroy();
        }

        //发生了碰撞,无敌
        if (other.node.group == "invincible") {
            //获取GameController脚本
            let gc = cc.find("/Canvas").getComponent("GameController") as GameController;
            //如果可以加双倍分数
            if (gc.is_double == true) {
                //加双倍分
                gc.add_score(this.num * 2);
            }
            //如果不可以加双倍分
            else if (gc.is_double == false) {
                gc.add_score(this.num);
            }
            //自身销毁
            this.node.destroy()
        }

        //如果自身生命值小于0
        if (this.num <= 0) {
            //自身销毁
            this.node.destroy();
        }
    }

2.绑定按钮事件

 

 四、菜单按钮

1.新建节点

 1.新建按钮节点,绑定Btn_scale脚本

 

2.新建Menu节点 

 3.新建Game_Menu脚本,绑定Canvas

2.打开菜单功能

1.新建Label 

Game_Menu.ts

const { ccclass, property } = cc._decorator;
import gc from "./GameController"

@ccclass
export default class NewClass extends cc.Component {

    @property({ type: gc, displayName: "GameController脚本所在节点", tooltip: "GameController脚本所在节点" })
    gc: gc = null

    @property(cc.Node)
    canvas: cc.Node = null;

    @property({ type: cc.Node, displayName: "菜单节点", tooltip: "菜单节点" })
    menu_UI: cc.Node = null;

    @property({ type: cc.Node, displayName: "菜单按钮", tooltip: "菜单按钮" })
    menu_btn: cc.Node = null;

    //菜单在屏幕最上方的位置
    pos: cc.Vec3 = null;


    onLoad() {
        //将菜单移到屏幕最上方
        let t = (this.canvas.height / 2);
        let y = t + this.menu_UI.height;
        this.menu_UI.position = cc.v3(0, y);
        //获取下菜单在屏幕上的位置
        this.pos = this.menu_UI.position;
        //显示菜单
        this.menu_UI.active = true;
    }


    //打开菜单函数
    open_menu() {
        //动作和缓动
        let move = cc.moveTo(1, 0, 0).easing(cc.easeBackInOut());
        //执行
        this.menu_UI.runAction(move);
        //暂停游戏
        this.pause();
        //禁用按钮
        this.menu_btn.getComponent(cc.Button).interactable = false;
    }

    //暂停函数
    pause() {
        this.gc.is_barrier_move = false;
        this.gc.is_plane_move = false;
        this.gc.is_fire = false;
        this.gc.is_barrier_create = false;
    }

}

2.绑定按钮 

 

 3.关闭菜单功能

1.新建按钮容器Btn

 2.新建Close Button并绑定按钮事件

 

Game_Menu.ts

 //关闭菜单函数
    close_menu() {
        let self = this;
        //动作和缓动
        let move = cc.moveTo(1, cc.v2(this.pos)).easing(cc.easeBackOut());
        //启用按钮
        let f = cc.callFunc(function () {
            self.menu_btn.getComponent(cc.Button).interactable = true;
        });
        //两个结合在一起
        let action = cc.sequence(move, f);
        //执行
        this.menu_UI.runAction(action);
        //恢复游戏
        this.resume()
    }

    //恢复游戏函数
    resume() {
        this.gc.is_barrier_move = true;
        this.gc.is_plane_move = true;
        this.gc.is_fire = true;
        this.gc.is_barrier_create = true;
    }

 

 4.返回开始场景按钮功能

1.新建Back Button按钮节点,并绑定按钮事件

 

 

 GameController.ts

//返回开始场景函数
    back(){
        cc.director.loadScene("Start");
    }

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

三种生成树(STP,RSTP,MSTP)的基本配置(自我理解)

目录 一、为什么要使用生成树&#xff08;STP)&#xff1a; 二、由于设备冗余而导致的问题&#xff1a; 广播风暴&#xff1a; 三、802.1D生成树基本配置 四、802.1D生成树实验 实验拓扑&#xff1a; 实验配置&#xff1a; 配置完成后&#xff0c;在SW8上观察现象&…

[Docker] Windows 下基于WSL2 安装

Docker 必须部署在 Linux 内核的系统上。如果其他系统想部署 Docker 就必须安装一个虚拟 Linux 环境。 1. 开启虚拟化 进入系统BIOS&#xff08;AMD 为 SVM&#xff1b;Intel 为 Intel-vt&#xff09;改为启用(enable) 2. 开启WSL 系统设置->应用->程序和功能->…

前端 -- 基础 HTML基本语法 结构标签介绍

HTML 语法规范 基本语法概述 : HTML 标签是由尖括号包围的关键词&#xff0c;示例 &#xff1a; <html> HTML 标签通常是成对出现的&#xff0c;例如 <html > 和 < /html > &#xff0c; 我们称为双标签。 标签对中的第一个标签是 开始标签&#xff0c;…

docker搭建私有镜像harbor

docker安装搭建私有仓库 Harbor harbor用于存储和分布docker镜像企业级registry服务器的harbor使用的是官方的docker registry(v2命名是distribution)服务去完成。 安装harhor 启动harbor 6.

【算法日志】动态规划刷题:整数拆分,n节点的BST数量(day35)

代码随想录刷题60Day 目录 前言 整数拆分 N个数节点的二叉搜索树数量 前言 今天问题的难点在于从问题中抽象出dp数组和状态转移方程。 整数拆分 int integerBreak1(int n) {vector<int> dp(n 1, 0);dp[1] 1;for (int i 2; i < n; i)for (int j 1; j < i; j…

工厂模式并不难理解

文章目录 工厂模式简单工厂模式简单工厂模式使用的场景 工厂方法模式工厂方法模式使用场景 抽象工厂模式抽象工厂模式使用场景 工厂模式 功能&#xff1a;将对象的创建交给工厂&#xff0c;我们只需要告诉工厂我们要什么对象就可以得到该对象。 目的&#xff1a;实现创建对象…

流媒体服务器SRS的搭建及QT下RTMP推流客户端的编写

一、前言 目前市面上有很多开源的流媒体服务器解决方案&#xff0c;常见的有SRS、EasyDarwin、ZLMediaKit和Monibuca。这几种的对比如下&#xff1a; &#xff08;本图来源&#xff1a;https://www.ngui.cc/zz/1781086.html?actiononClick&#xff09; 二、SRS的介绍 SRS&am…

SSRF 服务器端请求伪造

文章目录 SSRF(curl)网址访问通过file协议访问本地文件dict协议扫描内网主机开放端口 SSRF(file_get_content)网站访问http协议请求内网资源通过file协议访问本地文件 SSRF(Server-Side Request Forgery:服务器端请求伪造) 其形成的原因大都是由于服务端提供了从其他服务器应用…

FastJson在Java后端方面解析使用(二)

​ JSON现在常用来做前后端数据交互&#xff0c;两个蝴蝶飞只是简单的对JSON做一下讲解和简单使用。关于JSON,我还了解的远远不够。由于本人经验有限&#xff0c;嘴皮子不溜&#xff0c;所以学术性&#xff0c;概念性&#xff0c;底层性的知识点暂时不做介绍。文章中有错误之处…

教育行业选择CRM系统需具备的四大功能

教育行业的发展一波三折&#xff0c;要想在激烈的赛道脱颖而出&#xff0c;就需要有一套有效的CRM系统&#xff0c;来帮助教育机构提升招生效率、增加学员留存、提高教学质量。那么&#xff0c;教育行业的CRM系统要具备哪些功能&#xff1f; 招生管理&#xff1a; 教育机构的…

STM32入门——SPI通讯

江科大STM32学习记录 SPI通信 SPI&#xff08;Serial Peripheral Interface&#xff09;是由Motorola公司开发的一种通用数据总线四根通信线&#xff1a;SCK&#xff08;Serial Clock&#xff09;、MOSI&#xff08;Master Output Slave Input&#xff09;、MISO&#xff08;…

log4j2配置文件的加载顺序

文章目录 如果同时存在 log4j2-test.xml 和 log4j2.xml 文件 那么默认先加载 log4j2-test.xml&#xff0c;而不是log4j2.xml 官方文档介绍&#xff1a;https://logging.apache.org/log4j/2.x/manual/configuration.html 以下内容来自官方文档翻译&#xff1a; Log4j 2 的配置…

淘宝商品详情采集接口item_get-获得淘宝商品详情(可高并发线程)

获得淘宝商品详情页面数据采集如下&#xff1a; taobao.item_get 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;注册key账号接入secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff0…

动手学深度学习—深度卷积神经网络AlexNet(代码详解)

AlexNet 1. 学习表征1.1 缺少的成分&#xff1a;数据1.2 缺少的成分&#xff1a;硬件 2. AlexNet2.1 模型设计2.2 激活函数2.3 容量控制和预处理 3. 读取数据集4. 训练AlexNet ImageNet classification with deep convolutional neural networks 原文链接&#xff1a;https://d…

尚品汇项目(Day1)

项目结构介绍 vue-cli 脚手架初始化项目 node webpack 淘宝镜像 node_modules文件夹&#xff1a;项目依赖文件夹 public文件夹&#xff1a;一般放置静态资源&#xff08;图片&#xff09;&#xff0c;需要注意&#xff1a;放在public文件夹中的静态资源&#xff0c;webpac…

套接字属性设置

基本概念 设置套接字的选项对套接字进行控制除了设置选项外&#xff0c;还可以获取选项选项的概念相当于属性&#xff0c;所以套接字选项也可说是套接字属性有些选项&#xff08;属性&#xff09;只可获取&#xff0c;不可设置有些选项既可设置也可获取 选项级别 SOL_SOCKET的…

功能性需求与非功能性需求的区别

如果你曾经负责过软件项目开展的全过程&#xff0c;就会知道需求定义在项目后期的重要性。清晰、明确的需求定义不仅有助于有效地管理客户期望&#xff0c;也有助于指导项目的顺利开展。 在项目前期阶段&#xff0c;如果需求定义不清晰&#xff0c;就会导致项目范围和成果定义…

Prompt-“设计提示模板:用更少数据实现预训练模型的卓越表现,助力Few-Shot和Zero-Shot任务”

Prompt任务&#xff08;Prompt Tasks&#xff09; 通过设计提示&#xff08;prompt&#xff09;模板&#xff0c;实现使用更少量的数据在预训练模型&#xff08;Pretrained Model&#xff09;上得到更好的效果&#xff0c;多用于&#xff1a;Few-Shot&#xff0c;Zero-Shot 等…

java.net.UnknownHostException 解决方法

原文链接&#xff1a;https://blog.csdn.net/qq_39390545/article/details/108755289 以下为复盘这里笔记 一般原因 1.服务器没网&#xff0c;调不到公网域名&#xff0c;无法解析出IP&#xff0c;从而无法识别host&#xff0c;导致无法连接&#xff1b; 2.网络端口映射做了…