KUOKUO的物理小游戏(三)

news/2024/7/10 1:42:43 标签: java, javascript, css, web, vue

摘要

KUOKUO的物理小游戏(一)

KUOKUO的物理小游戏(二)

时间过的真快,阔阔工作之余录制的物理小游戏视频教程也已经更新到了14集!可能这就是对技术的热爱吧!本文就对教程做下阶段性的总结!

正文

使用版本

CocosCreator 版本 2.3.4

按钮动作&工具类Util(第5集)

按钮的动作我没有使用按钮组件,而是使用了节点事件监听;使用解构简化事件类型的书写:

const { TOUCH_START, TOUCH_END, TOUCH_CANCEL } = cc.Node.EventType


this.startButton.on(TOUCH_START, () => {
    // 改变按钮节点的 scale
}, this)

改变节点的动作可以封装到一个工具类里:

javascript">export class Util {


    static clickDownTween(node: cc.Node | undefined) {
        if (!node) { return }
        cc.tween(node).to(0.1, { scale: 0.9 }).start()
    }


    static clickUpTween(node: cc.Node | undefined) {
        if (!node) { return }
        cc.tween(node).to(0.1, { scale: 1 }).start()
    }
}

优化后的代码:

this.startButton.on(TOUCH_START, () => {
    Util.clickDownTween(this.startButton)
}, this)

动作后回调(第6集)

触摸开始是让节点缩放,松手是放大回正常尺寸,但是如果不等动作完成后触发事件,会出现事件触发时,按钮还在进行放大的现象。理应在动作结束后进行事件的触发,对 Util.clickUpTween() 进行改造:

javascript">static clickUpTween(node: cc.Node | undefined, callback?: () => void) {
    if (!node) { return }
    cc.tween(node).to(0.1, { scale: 1 }).call(() => {
        callback && callback()
    }).start()
}

使用:

this.startButton.on(TOUCH_END, () => {
    Util.clickUpTween(this.startButton, () => {
        uiManager.gameStart()
    })
}, this)

uiMap与枚举(第7集)

我们有 6 个 UI 要进行管理,每个 UI 都应该有显示与隐藏的方法,故抽出其共有属性与方法,实现一个 UIBase,让 6 个 UI 脚本去继承 UIBase,然后要对于实例化后的进行管理,采用了一个 map 数据结构:

javascript">private uiMap = new Map<UIType, UIBase>()

UIType 是为了方便使用的枚举:

export enum UIType {
    ControlPanel,
    LevelInfo,
    LevelSelect,
    StartMenu,
    WinPanel,
    LossPanel
}

关卡选择界面与逻辑(第8-9集)

关卡选择界面主要涉及一个列表,我这里距离了六关,也可以多放些使用 Scrollview 做成滚动的。如何识别每个关卡按钮,可以使用下标的形式,在创建时就按照顺序,这样从上到下就是对于 node.children 这个数组的下标:

button.on(TOUCH_END, () => {
    Util.clickUpTween(button, () => {
        // 从 1 开始
        const level = index + 1
        // 传入参数
        uiManager.gameStart(level)
    })
}, this)

轮盘限位相似三角形原理(第10集)

轮盘这里注意两点,一个是触摸事件放在背景上,区域大点,方便定位;一个是限位处理,设置一个半径,如果手指触点到中心位置距离大于半径,根据相似原理乘以这个比例的倒数就会回到半径这个长度,然后把 x 和 y 乘以这个比率就是位置:

limitMidNodePos(pos: cc.Vec2): cc.Vec2 {
    const R = 130
    // 取当前位置长度,(x,y)=>len
    const len = pos.mag()
    // 计算 len 与 R 的关系,是内部还是外部,在外部,利用比例,限制回区域
    const ratio = len > R ? R / len : 1
    return cc.v2(pos.x * ratio, pos.y * ratio)
}

食物刚体旋转位移控制逻辑(第11-13集)

为了逻辑清晰,所有 UI 由 UIManager 管理,然后由其负责与 GameManager 通讯:

简单封装物理模块(第14集)

对于物理模块,封装这么五个方法:openPhysicsSystem() closePhysicsSystem() setRigidBodyStatic() setRigidBodyDynamic() setRigidBodyLinearVelocity() 顾名思义,分别是:开启物理系统、关闭物理系统、设置一个节点上的刚体类型为静态、设置一个节点上的刚体类型为动态、设置一个节点上的刚体线速度,以下为具体实现,都是比较简单的封装:

export class PhysicsManager {


    static openPhysicsSystem() {
        cc.director.getPhysicsManager().enabled = true
    }


    static closePhysicsSystem() {
        cc.director.getPhysicsManager().enabled = false
    }


    static setRigidBodyStatic(node: cc.Node) {
        const body = node.getComponent(cc.RigidBody)
        body.type = cc.RigidBodyType.Static
    }


    static setRigidBodyDynamic(node: cc.Node) {
        const body = node.getComponent(cc.RigidBody)
        body.type = cc.RigidBodyType.Dynamic
    }


    static setRigidBodyLinearVelocity(node: cc.Node, v: cc.Vec2) {
        const body = node.getComponent(cc.RigidBody)
        body.linearVelocity = v
    }
}

结语

KUOKUO 会坚持更新视频哦,哔哩哔哩求关注,视频链接为:

https://www.bilibili.com/video/BV1ck4y167mR

2020!我们一起进步!O(∩_∩)O~~


http://www.niftyadmin.cn/n/806333.html

相关文章

KMP算法两个扩展算法

学习笔记&#xff1a;http://blog.csdn.net/v_july_v/article/details/7041827 BM算法&#xff1a; KMP的匹配是从模式串的开头开始匹配的&#xff0c;而1977年1977年&#xff0c;德克萨斯大学的Robert S. Boyer教授和J Strother Moore教授发明了一种新的字符串匹配算法&#x…

武汉迷萌!3D《巅峰漂移》技术分享

《巅峰漂移》是由武汉迷萌基于 Cocos Creator 3D 研发的一款 3D 赛车漂移竞速微信小游戏。近日&#xff0c;Cocos 对《巅峰漂移》项目组进行了专访&#xff0c;疫情之下&#xff0c;武汉当地游戏 CP 现状如何&#xff1f;这么优质的 3D 小游戏创作工作流是怎样&#xff1f;又带…

如何做一个能赚钱的技术公众号?

晓衡上周去了趟苏州&#xff0c;有幸参考技术圈公众号主的聚会。回来后&#xff0c;有朋友问我有些什么收获&#xff0c;这此收获最大在于了解到了关于技术公众号是如何赚钱的逻辑。而且我也发现社区有越来越多的发者&#xff0c;开始尝试在公众号上发自己的技术文章。偶尔有伙…

伪句柄

一、什么是伪句柄 在使用很多函数的时候&#xff0c;我们都需要获得一个对象的句柄&#xff0c;而某些函数返回的是伪句柄。伪句柄本身不会打开内核对象的句柄表&#xff0c;因此内核对象的使用计数就不会增加。它本身就只指向调用它的主调进程或线程。会因为调用者的不同而改变…

我见过的,最易上手的Shader入门教程(图文)

自从接触了shader之后我便深深得爱上了它&#xff0c;因为它独特的编程思考方式冲击着我这十几年的惯性认知。在向各位大佬学习的过程中&#xff0c;每学到一个新的技巧&#xff0c;我都不禁感叹&#xff1a;“实在是妙&#xff01;”本文将整理一些个人常用的shader技巧/方法&…

Sharding-JDBC分库分表配置

依赖 <dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding‐jdbc‐spring‐boot‐starter</artifactId><version>4.0.0‐RC1</version> </dependency>水平分表 ###第一步&#xff1a;配置数据源…

高薪的工作和低薪有股权的初创公司,怎么选不后悔?

最近连着接到三个选择Offer的咨询&#xff0c;大概情况都是这样&#xff1a;A初创公司表示&#xff0c;虽然提供的薪水不高&#xff0c;但自己前景超好&#xff0c;很快就会上市&#xff0c;如果你干得好&#xff0c;上市前能拿到股票&#xff0c;回报超高。B公司发展稳定&…

线性表的链式表示和实现

和顺序表相比&#xff0c;链表存储结构在实现插入、删除的操作时&#xff0c;不需要移动大量数据元素 (但不容易实现随机存取线性表的第i 个数据元素的操作)。所以&#xff0c;链表适用于经常需要进行插入和删除操作的线性表&#xff0c;如飞机航班的乘客表等。 // c2-2.h 线性…