cocos creator 3.8 合成大西瓜Demo 11
界面上的Node节点: 背景 警戒线 三面墙 初始位置节点 水果容器
先分组吧,墙 地板 水果
创建预制体 先挂一个脚本 刚体碰撞器先弄上再说
import { _decorator, Component, Node } from 'cc';
const { ccclass, property } = _decorator;@ccclass('FruitData')
export class FruitData extends Component {//水果的Id 区分哪一种水果的fruitId: number = 0;//水果的碰撞次数 主要记录水果的状态用的contactNum: number = 0;//是否合成isSynthesis: boolean = false;
}
再建一个脚本,开始折腾走起
@property({ type: Node, displayName: "水果生成的位置" })fruitStart: Node = null;//大小随便,位置合理就行,不行就大小[0,0]@property({ type: Node, displayName: "水果的父节点" })fruitRoot: Node = null;//水果容器@property({ type: [Prefab], displayName: "水果的预制体" })fruitPrefabs: Prefab[] = [];//一堆水果的预制体//存储临时节点,方便计算用currentFruit: Node = null;@property({ type: Node, displayName: "警告" })WarnningLine: Node = null;
开始游戏了
start() {//创建一个随机水果,前两前三的this.createRadomFruit();//加上触摸监听 看api好像input比node监听使用范围广input.on(Input.EventType.TOUCH_START, this.onTouchStart, this);input.on(Input.EventType.TOUCH_END, this.onTouchEnd, this);}
创建水果了
createRadomFruit() {const fruitId: number = Math.floor(Math.random() * 3);const fruitNode: Node = instantiate(this.fruitPrefabs[fruitId]);fruitNode.setPosition(this.fruitStart.position);//禁用刚体,用来监听移动事件后再开启fruitNode.getComponent(RigidBody2D).enabled = false;fruitNode.getComponent(RigidBody2D).gravityScale = 2;//赋值fruitNode.getComponent(FruitData).fruitId = fruitId;fruitNode.getComponent(FruitData).contactNum = 0;//监听碰撞const collider2D: Collider2D = fruitNode.getComponent(Collider2D);collider2D.on(Contact2DType.BEGIN_CONTACT, this.onBeginContact, this);fruitNode.setParent(this.fruitRoot);//用一个临时的Node来存储这个节点,方便操作this.currentFruit = fruitNode;}
两个监听
//收到点击事件后,水果位置平移onTouchStart(event: EventTouch) {//放置连续点击if (!this.currentFruit) return;//可以看看这个https://blog.csdn.net/weixin_44053279/article/details/129568612//获取 UI 坐标系下的触点位置const touchPos = event.getUILocation();//记住 是父节点 可以搜一下坐标空间转换const parentPos = this.fruitRoot.getComponent(UITransform).convertToNodeSpaceAR(v3(touchPos.x, touchPos.y, 0));//这是个节点位置 position现在是个静态的 拿不到.xconst fruitPos = this.currentFruit.getPosition();fruitPos.x = parentPos.x;// 防止穿透,还是用tween动画吧// this.currentFruit.setPosition(fruitPos);tween(this.currentFruit).to(.3, { position: fruitPos }).start();}onTouchEnd(event: EventTouch) {//放置连续点击if (!this.currentFruit) return;this.currentFruit.getComponent(RigidBody2D).enabled = true;this.currentFruit = null;//延时一下 生成下一个this.scheduleOnce(this.createRadomFruit, 2);//用来检测是否超过预期位置没this.scheduleOnce(this.checkGameOver, 2);}
碰撞检测
//3.8 .d.ts中没给监听的参数//https://forum.cocos.org/t/topic/158425onBeginContact(selfCollider: Collider2D, otherCollider: Collider2D, contact: IPhysics2DContact | null) {const selfFruitData = selfCollider.getComponent(FruitData);const otherFruitData = otherCollider.getComponent(FruitData);if (otherCollider.group === Math.pow(2, 1)) {selfCollider.getComponent(FruitData).contactNum += 1;otherCollider.getComponent(FruitData).contactNum += 1;}if (otherCollider.group === Math.pow(2, 3)) {selfCollider.getComponent(FruitData).contactNum += 1;}if (otherCollider.group !== Math.pow(2, 1)) return;//Id相同 未合成 否则也返回if (selfFruitData.fruitId !== otherFruitData.fruitId) return;if (selfFruitData.isSynthesis || otherFruitData.isSynthesis) return;selfFruitData.isSynthesis = true;otherFruitData.isSynthesis = true;//合成后的新水果const synthesisFruitId = selfFruitData.fruitId + 1;const synthesisFruitPos = selfCollider.node.position;//https://blog.csdn.net/loveyoulouyou/article/details/127583198this.scheduleOnce(() => {otherCollider.getComponent(RigidBody2D).enabled = false;selfCollider.getComponent(RigidBody2D).enabled = false;tween(otherCollider.node).to(.2, { position: synthesisFruitPos }).to(.2, { scale: new Vec3(1.2, 1.2, 1) }).parallel().call(() => {//碰撞后立即实例化会报错,给一个延时器,tween动画都可以this.createSynthesisFruit(synthesisFruitId, synthesisFruitPos);}).call(() => {selfCollider.node.destroy();otherCollider.node.destroy();}).start();}, 0.1);};
合成的逻辑
createSynthesisFruit(synthesisFruitId: number, synthesisFruitPos: Vec3) {const SynthesisNode: Node = instantiate(this.fruitPrefabs[synthesisFruitId]);//刚体碰撞 回弹可能造成穿透效果synthesisFruitPos.y += 10;SynthesisNode.setPosition(synthesisFruitPos);SynthesisNode.getComponent(RigidBody2D).enabled = false;SynthesisNode.getComponent(FruitData).contactNum = 0;SynthesisNode.getComponent(RigidBody2D).gravityScale = 2;//赋值SynthesisNode.getComponent(FruitData).fruitId = synthesisFruitId;//监听碰撞SynthesisNode.getComponent(Collider2D).on(Contact2DType.BEGIN_CONTACT, this.onBeginContact, this);SynthesisNode.setParent(this.fruitRoot);this.scheduleOnce(() => {//立即改变刚体状态也会报错,给一个延时SynthesisNode.getComponent(RigidBody2D).enabled = true;SynthesisNode.getComponent(FruitData).contactNum += 1;if (synthesisFruitId === this.fruitPrefabs.length - 1) {// if (synthesisFruitId === 3) {console.log("=====================胜利了=====================");this.reStartGame();}}, .1);}
检测是否要结束游戏
//遍历所有水果,比较高度checkGameOver() {const warnningLinePos = this.WarnningLine.getPosition();for (let i = 0; i < this.fruitRoot.children.length; i++) {const element = this.fruitRoot.children[i];//水果没下落呢if (element.getComponent(FruitData).contactNum === 0) continue;if (element.getPosition().y >= warnningLinePos.y - 300) {console.log("=====================游戏警告=====================");}if (element.getPosition().y >= warnningLinePos.y) {console.log("=====================游戏结束=====================");break;}}}
重新开始
//重新开始reStartGame() {this.fruitRoot.removeAllChildren();this.createRadomFruit();}
就这样了,没写其它的逻辑,刚体有点乱,不要立即改变一些东西,总之就是要么用计时器,要么tween一下。
相关文章:
cocos creator 3.8 合成大西瓜Demo 11
界面上的Node节点: 背景 警戒线 三面墙 初始位置节点 水果容器 先分组吧,墙 地板 水果 创建预制体 先挂一个脚本 刚体碰撞器先弄上再说 import { _decorator, Component, Node } from cc; const { ccclass, property } _decorator;ccclass(FruitData) e…...
Vue前端开发-动态插槽
不仅父组件可以通过插槽方式访问并控制子组件传入的数据,而且可以控制传入父组件时插槽的名称,从而使不同的插槽根据名称的不同,使用场景也不同,例如在一个小区详细页中,可以根据小区类型,调用不同名称的详…...
使用easyexcel导出复杂模板,同时使用bean,map,list填充
背景 在使用easyexcel导出时,如果遇到一个模板中同时存在 一部分是实体类中的字段,另外部分是列表的字段,需要特殊处理一下,比如下面的模板: 这里面 user, addr 是实体类(或者map)…...
最大值(Java Python JS C++ C )
题目描述 给定一组整数(非负),重排顺序后输出一个最大的整数。 示例1 输入:[10,9] 输出:910 说明:输出结果可能非常大,所以你需要返回一个字符串而不是整数。 输入描述 数字组合 输出描述 最大的整数 示例1 输入 10 9输出 910解题思路 题目要求 是:给定一…...
17.5k Star,ThingsBoard 一款开源、免费、功能全面的物联网 IoT 平台 -慧知开源充电桩平台
项目介绍 ThingsBoard是一个开源、免费、功能全面、灵活易用的物联网(IoT)平台,专注于数据收集、处理、可视化以及设备管理。它提供了一个全面的解决方案,用于构建和管理物联网应用。支持从各种设备收集数据,通过内置…...
《C++ 与神经网络:自动微分在反向传播中的高效实现之道》
在深度学习蓬勃发展的今天,神经网络成为了众多领域的核心技术驱动力。而反向传播算法作为训练神经网络的关键手段,其背后的自动微分技术的高效实现尤为重要,特别是在 C 这样追求性能与内存控制极致的编程语言环境下。 神经网络通过大量的参数…...
【CSS】设置文本超出N行省略
文章目录 基本使用 这种方法主要是针对Webkit浏览器,因此可能在一些非Chrome浏览器中不适用。 基本使用 例如:设置文本超出两行显示省略号。 核心代码: .ellipsis-multiline {display: -webkit-box; -webkit-box-orient: vertical; /* 设置…...
open-instruct - 训练开放式指令跟随语言模型
文章目录 关于 open-instruct设置训练微调偏好调整RLVR 污染检查开发中仓库结构 致谢 关于 open-instruct github : https://github.com/allenai/open-instruct 这个仓库是我们对在公共数据集上对流行的预训练语言模型进行指令微调的开放努力。我们发布这个仓库,并…...
DI依赖注入详解
DI依赖注入 声明了一个成员变量(对象)之后,在该对象上面加上注解AutoWired注解,那么在程序运行时,该对象自动在IOC容器中寻找对应的bean对象,并且将其赋值给成员变量,完成依赖注入。 AutoWire…...
TDengine在debian安装
参考官网文档: 官网安装文档链接 从列表中下载获得 Deb 安装包; TDengine-server-3.3.4.3-Linux-x64.deb (61 M) 进入到安装包所在目录,执行如下的安装命令: sudo dpkg -i TDengine-server-<version>-Linux-x64.debNOTE 当…...
【C#设计模式(15)——命令模式(Command Pattern)】
前言 命令模式的关键通过将请求封装成一个对象,使命令的发送者和接收者解耦。这种方式能更方便地添加新的命令,如执行命令的排队、延迟、撤销和重做等操作。 代码 #region 基础的命令模式 //命令(抽象类) public abstract class …...
XGBoost库介绍:提升机器学习模型的性能
XGBoost库介绍:提升机器学习模型的性能 在机器学习领域,模型的准确性和训练效率是最为关注的两大因素。特别是在处理大量数据和复杂任务时,传统的机器学习算法可能无法满足高效和准确性的需求。XGBoost(eXtreme Gradient Boostin…...
网络安全构成要素
一、防火墙 组织机构内部的网络与互联网相连时,为了避免域内受到非法访问的威胁,往往会设置防火墙。 使用NAT(NAPT)的情况下,由于限定了可以从外部访问的地址,因此也能起到防火墙的作用。 二、IDS入侵检…...
SpringMVC——SSM整合
SSM整合 创建工程 在pom.xml中导入坐标 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_…...
Windows系统电脑安装TightVNC服务端结合内网穿透实现异地远程桌面
文章目录 前言1. 安装TightVNC服务端2. 局域网VNC远程测试3. Win安装Cpolar工具4. 配置VNC远程地址5. VNC远程桌面连接6. 固定VNC远程地址7. 固定VNC地址测试 前言 在追求高效、便捷的数字化办公与生活的今天,远程桌面服务成为了连接不同地点、不同设备之间的重要桥…...
【ubuntu24.04】GTX4700 配置安装cuda
筛选显卡驱动显卡驱动 NVIDIA-Linux-x86_64-550.135.run 而后重启:最新的是12.6 用于ubuntu24.04 ,但是我的4700的显卡驱动要求12.4 cuda...
Spring Boot 动态数据源切换
背景 随着互联网应用的快速发展,多数据源的需求日益增多。Spring Boot 以其简洁的配置和强大的功能,成为实现动态数据源切换的理想选择。本文将通过具体的配置和代码示例,详细介绍如何在 Spring Boot 应用中实现动态数据源切换,帮…...
MySQL技巧之跨服务器数据查询:进阶篇-从A服务器的MySQ数据库复制到B服务器的SQL Server数据库的表中
MySQL技巧之跨服务器数据查询:进阶篇-从A服务器的MySQ数据库复制到B服务器的SQL Server数据库的表中 基础篇已经描述:借用微软的SQL Server ODBC 即可实现MySQL跨服务器间的数据查询。 而且还介绍了如何获得一个在MS SQL Server 可以连接指定实例的MyS…...
大语言模型LLM的微调中 QA 转换的小工具 xlsx2json.py
在训练语言模型中,需要将文件整理成规范的文档,因为文档本身会有很多不规范的地方,为了训练的正确,将文档进行规范处理。代码的功能是读取一个 Excel 文件,将其数据转换为 JSON 格式,并将 JSON 数据写入到一…...
CFD 在生物反应器放大过程中的作用
工艺工程师最常想到的一个问题是“如何将台式反应器扩大到工业规模的反应器?”。这个问题的答案并不简单,也不容易得到。例如,人们误以为工业规模的反应器的性能与台式反应器相同。因此,扩大规模的过程并不是一件容易的事。必须对…...
Axios与FastAPI结合:构建并请求用户增删改查接口
在现代Web开发中,FastAPI以其高性能和简洁的代码结构成为了构建RESTful API的热门选择。而Axios则因其基于Promise的HTTP客户端特性,成为了前端与后端交互的理想工具。本文将介绍FastAPI和Axios的结合使用,通过一个用户增删改查(C…...
美畅物联丨如何通过ffmpeg排查视频问题
在我们日常使用畅联AIoT开放云平台的过程中,摄像机视频无法播放是较为常见的故障。尤其是当碰到摄像机视频不能正常播放的状况时,哪怕重启摄像机,也仍然无法使其恢复正常的工作状态,这着实让人感到头疼。这个时候,可以…...
基于OpenCV视觉库让机械手根据视觉判断物体有无和分类抓取的例程
项目实例,在一个无人封闭的隔绝场景中,根据视觉判断物件的有无,通过机械手 进行物件分类提取,并且返回状态结果; 实际的场景是有一个类似采血的固件支架盘,上面很多采血管,采血管帽颜色可能不同…...
QChart数据可视化
目录 一、QChart基本介绍 1.1 QChart基本概念与用途 1.2 主要类的介绍 1.2.1 QChartView类 1.2.2 QChart类 1.2.3QAbstractSeries类 1.2.4 QAbstractAxis类 1.2.5 QLegendMarker 二、与图表交互 1. 动态绘制数据 2. 深入数据 3. 缩放和滚动 4. 鼠标悬停 三、主题 …...
转换的艺术:如何在JavaScript中序列化Set为Array、Object及逆向操作
先认识一下Set 概念:存储唯一值的集合,元素只能是值,没有键与之对应。Set中的每个值都是唯一的。 特性: 值的集合,值可以是任何类型。 值的唯一性,每个值只能出现一次。 保持了插入顺序。 不支持通过索引来…...
万能门店小程序管理系统存在前台任意文件上传漏洞
免责声明: 本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在…...
详解Rust泛型用法
文章目录 基础语法泛型与结构体泛型约束泛型与生命周期泛型与枚举泛型和Vec静态泛型(const 泛型)类型别名默认类型参数Sized Trait与泛型常量函数与泛型泛型的性能 Rust是一种系统编程语言,它拥有强大的泛型支持,泛型是Rust中用于实现代码复用和类型安全…...
移远通信携手紫光展锐,以“5G+算力”共绘万物智联新蓝图
11月26日,2024紫光展锐全球合作伙伴大会在上海举办。作为紫光展锐重要的合作伙伴,移远通信应邀参会。 在下午的物联网生态论坛上,移远通信产品总监胡勇华作题为“5G与算力双擎驱动 引领智联新未来”的演讲,深度剖析了产业发展的趋…...
Mybatis:Mybatis快速入门
Mybatis的官方文档是真的非常好!非常好! 点一下我呗:Mybatis官方文档 MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可…...
微信小程序用户登录页面制作教程
微信小程序用户登录页面制作教程 前言 在微信小程序的开发过程中,用户登录是一个至关重要的功能。通过用户登录,我们可以为用户提供个性化的体验,保护用户数据,并实现更复杂的业务逻辑。本文将为您详细讲解如何制作一个用户登录页面,包括设计思路、代码示例以及实现细节…...
做美甲批发的都上什么网站/关键词批量调词软件
标记说明Ag形语素 形容词性语素。形容词代码为a,语素代码g前面置以A。a形容词 取英语形容词adjective的第1个字母。ad副形词 直接作状语的形容词。形容词代码a和副词代码d并在一起。an名形词 具有名词功能的形容词。形容词代码a和名词代码n并在一起。b区…...
石碣做网站/长沙网络推广
圆盘扭转传递矩阵法 三圆盘系统的自由扭振 1.边界条件 边界条件: 即第1个圆盘左侧的扭矩与第3个圆盘右侧的扭矩为0 2.通过传递矩阵计算出每个圆盘的状态变量 第i个圆盘左端与右端的传递关系为:点传递矩阵 第i个轴左端与右端的传递关系为:场…...
网店设计流程/win7系统优化软件
1、数组式队列 特点:先进先出 利用数组实现的对列 #include<stdio.h>#define MAXSIZE 10 //队列大小int buf[MAXSIZE]; int tail0; int front0;//队列是否为空 bool IsEmpty() {if(tailfront)//当头尾相等时表示队列为空return true;elsereturn false; } /…...
网站的更新与维护/百度推广开户流程
系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录系列文章目录前言一、功能二、安装并运行rviz1.安装rviz2.运行rviz三、界面介绍四、数据可视化原理及步骤1.原理2.步骤(1࿰…...
软件工程师招聘信息网站/郑州seo优化推广
CMM简介张友生 (本文转载自软件工程专家网www.21cmm.com) CMM是软件过程能力成熟度模型(Capacity Maturity Model)的简称,是卡内基-梅隆大学软件工程研究院为了满足美国联邦政府评估软件供应 商能力的要…...
重庆做企业网站/杭州网络排名优化
有时候我们在桌面上新建一个文件夹,大家都知道新建文件夹的位置是系统根据桌面上最后一个默认排序的,想把这个文件夹放在自己容易辨识的地方,可能是右下角,可能是右上角,那这个拖拽是怎么实现的呢? 一、我们…...