【Cocos TypeScript 零基础 16.1】

目录

  • FlappyBird
    • 背景
    • 其他
    • 心得_刚体
    • audio部分

FlappyBird

本人没有按照老师的做法去做,大体差不多,
当然老师做的更精细,有些不会的还是参考老师的方法
参考部分

  1. 小鸟如何像真实物体一样的重力效果
  2. 点击如何使小鸟飞翔

省略部分
3. 小鸟多动画(飞机大战其实有做,单纯偷懒)
4. 小鸟死亡滚动(猜想是给一个边缘力使其旋转,或代码直接使其旋转)
5. 中间区域碰撞(我用的是计时的方法,老师用碰撞方法,碰撞不阻碍移动)
6. UI界面的省略(UI界面省略部分)
7. 奖牌的发放(只是多个判断就能实现,所以懒得做了)

增加部分
8. 音频控制

背景

我的背景部分包含了很多
在这里插入图片描述
目之所及全是背景
在这里插入图片描述
光是绑定在BG上的组件就有很多,还没有参数,参数都是在代码里自己改
废话不多说,上代码

import { _decorator, AudioClip, AudioSource, Component, director, instantiate, Label, Node, Prefab, randomRangeInt, Slider } from 'cc';
import { AudioMgr } from './AudioMgr';
import { ts_bird_att } from './ts_bird_att';
const { ccclass, property } = _decorator;@ccclass('ts_bg')
export class ts_bg extends Component {speed : number = 100    //  背景移动速度kj : number = 160       //  逃跑初始空间pi_rate : number = 2    //  障碍物生成时间间隔pi_time : number = 0    //  临时存储时间fen : number = -6end : boolean = false   //  游戏是否结束,控制背景移动set_bol : boolean = false@property(Node) ui : Node = null@property(Node) bg_day_1 : Node = null@property(Node) bg_day_2 : Node = null@property(Node) land_1 : Node = null@property(Node) land_2 : Node = null@property(Prefab) pipe_up : Prefab = null  //  理论上为了减小安装包大小材质要尽可能复用@property(Prefab) pipe_dw : Prefab = nullbg_arr : Node[] = []@property(AudioClip) aud_bg : AudioClip = null@property(AudioClip) aud_end : AudioClip = null@property(Label) fen_up : Label = null@property(Label) fen_now : Label = null@property(Node) ui_set : Node = null@property(Slider) ui_aud : Slider = nullstatic inthis: ts_bgstatic getinthis() : ts_bg{return this.inthis}start() {ts_bg.inthis = thisAudioMgr.inst.play(this.aud_bg , this.ui_aud.progress)this.bg_arr.push(this.bg_day_1,this.bg_day_2,this.land_1,this.land_2)}update(deltaTime: number) {this.on_bg_move(deltaTime)}on_bg_move(deltaTime: number){  //  背景移动函数if (this.end == true){return}let no : Nodefor (no of this.bg_arr){this.bg_move(no , deltaTime)}this.on_pipe_rate(deltaTime)}bg_move(no : Node , dt : number){   //  复用移动函数let np = no.getPosition()if (np.x <= -1280){np.x = 1280}no.setPosition(np.x - dt * this.speed , np.y)}on_pipe_rate(dt : number){  //  障碍生成函数this.pi_time += dtif (this.pi_time < this.pi_rate){return}const pi_up = instantiate(this.pipe_up)this.node.addChild(pi_up)let up_y = randomRangeInt(-500, -200)let pos = this.node.getPosition()pos.x = 640     //  在屏外生成,所以是固定的pi_up.setPosition(pos.x , up_y)this.bg_arr.push(pi_up)const pi_dw = instantiate(this.pipe_dw)this.node.addChild(pi_dw)//  这里特别注意 pipe我的高度是600,对半就是300,上下2个所以是600pi_dw.setPosition(pos.x , this.kj + up_y + 600)this.bg_arr.push(pi_dw)this.pi_time = 0this.fen += 1this.kj -= 1}on_del(no : Node){  //  删除数组成员函数for (let index = 0; index < this.bg_arr.length; index++) {if (no.uuid == this.bg_arr[index].uuid){this.bg_arr.splice(index,1)     //  删除数组里面的nodeno.destroy()        //  销毁此node}}}on_end(){   //  游戏结束函数//  控制音频AudioMgr.inst.stop()AudioMgr.inst.playOneShot(this.aud_end)//  控制触摸移动const bird = ts_bird_att.getinthis()bird.move = falsethis.end = true//  控制uithis.ui.active = truethis.fen_now.string = `当前得分 ${this.fen < 0 ? 0 : this.fen}`let fup = localStorage.getItem(`fen_up`)this.fen_up.string = `历史最高 ` + fupif (Number(fup) < this.fen){console.log(`新纪录`)localStorage.setItem(`fen_up`,this.fen.toString())}//this.scheduleOnce(function(){director.pause()},1)}on_reset(){     //  游戏重开函数director.resume()director.loadScene(`s1`)}on_set_aud(){AudioMgr.inst.play(this.aud_bg , this.ui_aud.progress)}on_set(){this.set_bol = !this.set_bolthis.ui_set.active = this.set_bolthis.set_bol ? director.pause() : director.resume()}
}

刚体问题后面会讲
这里只讲一下,障碍物的生成
下障碍物高度 + 逃逸空间 + 上障碍物高度 = 可视高度
写到这里的时候想了一下,我这里有个BUG
我没有写限制小鸟的高度(下方会发生碰撞,游戏结束)
游戏一开始小鸟一直飞高就不会碰到障碍物,这是个bug(加了两行代码搞定)

其他

小鸟代码

import { _decorator, Collider2D, Component, Contact2DType, Input, input, math, Node, RigidBody, RigidBody2D } from 'cc';
import { ts_bg } from './ts_bg';
const { ccclass, property } = _decorator;@ccclass('ts_bird_att')
export class ts_bird_att extends Component {static inthis : ts_bird_attstatic getinthis() : ts_bird_att {return this.inthis}move : boolean = truestart() {ts_bird_att.inthis = thisinput.on(Input.EventType.TOUCH_START , this.on_ts , this)   //  开启触摸监听const col = this.getComponent(Collider2D)if (col){col.on(Contact2DType.BEGIN_CONTACT , this.on_bc , this)}else {console.log(`碰撞开启异常`)}//const rig = this.getComponent(RigidBody2D)}on_ts(){    //  触摸函数if (this.move == false) {return}const pos = this.node.getPosition()if (pos.y >= 300){return}const rig = this.getComponent(RigidBody2D)let fc = new math.Vec2(0 , 6)   //  Y坐标移动 点击向上的速度rig.linearVelocity = fc     //  给刚体施加一个力}on_bc(me : Collider2D , oth : Collider2D){    //  碰撞函数console.log(`bird碰撞`,oth.name)ts_bg.getinthis().on_end()}update(deltaTime: number) {}
}

障碍物代码

import { _decorator, Component, Node } from 'cc';
import { ts_bg } from './ts_bg';
const { ccclass, property } = _decorator;@ccclass('ts_pipe_att')
export class ts_pipe_att extends Component {start() {}update(deltaTime: number) {const pos = this.node.getPosition()if (pos.x <= -640){     //  如果移动超出屏幕外则删除ts_bg.getinthis().on_del(this.node)}}
}

场景结构
在这里插入图片描述
audio部分
之前写过_点击跳转

心得_刚体

在这里插入图片描述
这是个地板刚体属性(鼠标在左侧不动时会有中文提示,为cocos点赞)
在这里插入图片描述
作为一个地板肯定是静态的,意味着不受外力干扰
动态的话,碰撞起来也挺有趣的,可以试一下
在这里插入图片描述
重力为0的话它才会固定在某个位置上,
大于0的值会导致刚体有向下的重力
小于0不会导致向上漂浮

在这里插入图片描述
而小鸟的话则需要有重力,这样才会下坠
碰撞 sensor 是不能勾选的
在这里插入图片描述

audio部分

在这里插入图片描述
其实就是创建了一个滑动器
并把函数绑定上去就好了
在这里插入图片描述
再编写相应代码

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CHARMM-GUI EnzyDocker: 一个基于网络的用于酶中多个反应状态的蛋白质 - 配体对接的计算平台

❝ "CHARMM-GUI EnzyDocker for Protein−Ligand Docking of Multiple Reactive States along a Reaction Coordinate in Enzymes"介绍了 CHARMM-GUI EnzyDocker&#xff0c;这是一个基于网络的计算平台&#xff0c;旨在简化和加速 EnzyDock 对接模拟的设置过程&…

腿足机器人之六- 前向运动学

腿足机器人之六- 前向运动学 刚体运动学基础坐标系定义旋转矩阵与欧拉角齐次变换矩阵&#xff08;平移旋转的统一表示&#xff09; 运动链建模串联运动链结构&#xff08;从基座到末端的关节连接&#xff09;标准Denavit-Hartenberg&#xff08;D-H&#xff09;参数法改进D-H参…

uni-app发起网络请求的三种方式

uni.request(OBJECT) 发起网络请求 具体参数可查看官方文档uni-app data:请求的参数; header&#xff1a;设置请求的 header&#xff0c;header 中不能设置 Referer&#xff1b; method&#xff1a;请求方法&#xff1b; timeout&#xff1a;超时时间&#xff0c;单位 ms&a…

【linux】更换ollama的deepseek模型默认安装路径

【linux】更换ollama的deepseek模型默认安装路径 文章目录 【linux】更换ollama的deepseek模型默认安装路径Ollama 默认安装路径及模型存储路径迁移ollama模型到新的路径1.创建新的模型存储目录2.停止ollama3.迁移现有模型4.修改 Ollama 服务配置5.重启ollama6.验证迁移是否成功…

「软件设计模式」装饰者模式(Decorator)

深入解析装饰者模式&#xff1a;动态扩展功能的艺术&#xff08;C实现&#xff09; 一、模式思想与应用场景 1.1 模式定义 装饰者模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;它通过将对象放入包含行为的特殊封装对象中&#xff0c;动态地…

java项目打包成docker镜像步骤

java项目打包成docker镜像步骤 1.使用maven把java文件打包成可执行的jar包2. 打包成Dockerfile3. 把jar包和DockerFile两个文件上传到服务器上。4. 制作镜像5.启动容器 1.使用maven把java文件打包成可执行的jar包 2. 打包成Dockerfile # 先从dockerhub找到对应版本的openjdk的…

后台管理系统-项目初始化

认识vue-admin **核心交付:** 为什么要基于现成架子二次开发 什么是二次开发:基于已有的代码(项目工程,脚手架)开进行新功能的开发 所以看懂已有的框架中的既有代码,变得很重要了 1. 背景知识 后台管理系统是一种最常见的应用模式,不同的管理系统之间有很多相似的地方…

【Scrapy】Scrapy教程6——提取数据

前一小节我们拿到了页面的数据,那页面中那么多内容,我们想要其中的部分内容,该如何获取呢?这就需要对我们下载到的数据进行解析,提取出来想要的数据,这节就讲讲如何提取数据。 引入 我们编辑保存下来的shouye.html文件看下,发现这是什么鬼,全是如下图的代码。 没错…

RabbitMQ 的工作模式

目录 工作模式 Simple&#xff08;简单模式&#xff09; Work Queue&#xff08;工作队列&#xff09; Publish/Subscribe&#xff08;发布/订阅&#xff09; Exchange&#xff08;交换机&#xff09;? Routing&#xff08;路由模式&#xff09; Topics&#xff08;通配…

Copilot Next Edit Suggestions(预览版)

作者&#xff1a;Brigit Murtaugh&#xff0c;Burke Holland 排版&#xff1a;Alan Wang 我们很高兴向你介绍在本次 Visual Studio Code 发布中&#xff0c;关于 GitHub Copilot 的三个预览功能&#xff1a; Next Edit Suggestions&#xff08;NES&#xff09;Copilot Edits 的…

[qt5学习笔记]Application Example示例程序源码解析

开发环境问题 vs2022下直接打开ui、ts文件失败 解决办法如下图&#xff0c; 设置designer独立运行。估计是嵌入运行存在些许bug。 同理&#xff0c;ts编辑工具linguist也存在这个问题。 qrc rc的编辑嵌入编辑都正常&#xff0c;但分离式更稳定可靠。 qt creator编译失败 原…

RabbitMQ介绍以及基本使用

文章目录 一、什么是消息队列&#xff1f; 二、消息队列的作用&#xff08;优点&#xff09; 1、解耦 2、流量削峰 3、异步 4、顺序性 三、RabbitMQ基本结构 四、RabbitMQ队列模式 1、简单队列模式 2、工作队列模式 3、发布/订阅模式 4、路由模式 5、主题模式 6、…

【数据可视化-17】基于pyecharts的印度犯罪数据可视化分析

&#x1f9d1; 博主简介&#xff1a;曾任某智慧城市类企业算法总监&#xff0c;目前在美国市场的物流公司从事高级算法工程师一职&#xff0c;深耕人工智能领域&#xff0c;精通python数据挖掘、可视化、机器学习等&#xff0c;发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…

基于SpringBoot+Vue的在线电影购票系统的设计与实现

获取源码&#xff1a;SpringBootVue的在线电影购票系统: 用户&#xff1a;登录、注册、忘记密码、主页、猜你想看、电影详情、选座购票、正在热映、即将上映、影院、排行榜、影视快报、平台公告、个人中心、我的收藏、想看、改签、评论、排行等功能管理员&#xff1a;登录、首页…

LabVIEW无刷电机控制器检测系统

开发了一种基于LabVIEW的无刷电机控制器检测系统。由于无刷电机具有高效率、低能耗等优点&#xff0c;在电动领域有取代传统电机的趋势&#xff0c;而无刷电机的核心部件无刷电机控制器产量也在不断增长。然而&#xff0c;无刷电机控制器的出厂检测仍处于半自动化状态&#xff…

C#功能测试

List 内部元素为引用 src[0]为"11" List<Source> src new List<Source>(); src.Add(new Source() { Name "1", Age 1, Description "1" }); src.Add(new Source() { Name "2", Age 2, Description "2"…

八种单例模式详解

亲爱的朋友们&#xff0c;大家好&#xff01; 今天是 CSDN博客之星 投票的开始日&#xff01;非常感谢你们在过去的时间里给予我无私的支持和鼓励&#xff0c;这一路走来&#xff0c;正是因为有你们的帮助&#xff0c;我才能不断进步&#xff0c;走得更远。 目前&#xff0c;…

STM32 PWM脉冲宽度调制介绍

目录 背景 PWM 模式 影子寄存器和预装载寄存器 PWM对齐模式 PWM 边沿对齐模式 向上计数配置 向下计数的配置 PWM 中央对齐模式 程序 第一步、使能GPIOB组、AFIO、TIM3外设时钟 第二步、输出通道端口配置​编辑 第三步、定时器配置产生频率 第四步、PWM输出配置 第…

Java面试第二山!《计算机网络》!

在 Java 面试里&#xff0c;计算机网络知识是高频考点&#xff0c;今天就来盘点那些最容易被问到的计算机网络面试题&#xff0c;帮你轻松应对面试&#xff0c;也方便和朋友们一起探讨学习。 一、HTTP 和 HTTPS 的区别 1. 面试题呈现 HTTP 和 HTTPS 有什么区别&#xff1f;在…

deepseek-v3在阿里云和腾讯云的使用中的差异

随着deepseek在各大云商上线&#xff0c;试用了下阿里云和腾讯云的deepseek服务&#xff0c;在回答经典数学问题9.9和9.11谁大时&#xff0c;发现还是有差异的。将相关的问题记录如下。 1、问题表现 笔者使用的openai的官方sdk go-openai。 因本文中测验主要使用阿里云和腾讯…