【基于Cocos Creator 3.5的赛车游戏】8.引入触摸屏幕事件并简单的控制小车

news2024/12/23 16:53:01

转载知识星球 | 深度连接铁杆粉丝,运营高品质社群,知识变现的工具

项目地址:赛车小游戏-基于Cocos Creator 3.5版本实现: 课程的源码,基于Cocos Creator 3.5版本实现

上一张您已经对Cocos的坐标系有了了解。这一章我们将让小车能够自动的向您触控的点运动过去。所以为了达到这个目的,我们要接收触摸屏幕事件,再对小车的刚体组件施加一个由小车的坐标点指向触摸点的力。具体步骤如下:

一、实现一个触控类:

1.请在script文件夹下新建一个名为TouchInput的脚本文件,我们将会在这里完成对触控事件的接收。新建脚本后效果如下:

2.打开并初步编辑脚本文件

双击这个脚本文件,VS Code将会为您打开并编辑这个脚本文件,因为这个脚本文件只负责处理触控事件,不会挂载到某个节点上,所以它无需具备组件的特性,所以我们可以删掉他的“extend Componment”属性。而您要实现的游戏是个单人游戏,也就是说触控接收器只为由玩家操控的汽车节点提供触控事件处理服务,不会为别的节点例如电脑提供的NPC车辆提供服务,所以以单例模式运行即可。综上,TouchInput的初步代码为:

3.接收触摸事件

cocos中采用input常量中的on方法来注册事件,on方法一共有两个参数:第一个参数是要注册的事件类型,事件类型的枚举值都Input.EventType下;第二个参数是一个方法,当接收到对应事件后这个方法将会执行,这个方法的入参是框架已经为您封装好的事件的具体值,例如点击的是哪个坐标点等。现在您要实现的是点击屏幕来控制小车的运动,所以在控制器里首先您需要注册开始点击、结束点击、点击时手指移动以及点击时手指移动到触控区域外这四个函数,不过在处理时,我们可以把点击时手指移动到触控区域外也视为结束点击的逻辑。其次我们还需要记录当前是否玩家处于点击状态以及当前的触控点的坐标。具体代码如下:

import { _decorator, Component, Node, input, Input, Vec2 } from 'cc';
const { ccclass, property } = _decorator;

@ccclass('TouchInput')
export class TouchInput {

    private static singleiInstance: TouchInput = new TouchInput();

    touchX: number = 0;

    touchY: number = 0;

    inTouch: boolean = false

    static Instance() {
        return TouchInput.singleiInstance;
    };

    private constructor() { 

        
        input.on(Input.EventType.TOUCH_MOVE, (event)=>{
            this.inTouch = true
            var pos = new Vec2(event.getLocation())
            this.touchX = pos.x
            this.touchY = pos.y
            console.log('移动中 点击的X坐标: '+this.touchX+  ' 点击的Y坐标:'+this.touchY + ' 点击状态:'+this.inTouch)
        })
        input.on(Input.EventType.TOUCH_START,(event)=>{
            this.inTouch = true
            var pos = new Vec2(event.getLocation())
            this.touchX = pos.x
            this.touchY = pos.y
            console.log('开始点击 点击的X坐标: '+this.touchX+  ' 点击的Y坐标:'+this.touchY+ ' 点击状态:'+this.inTouch)
        })
        input.on(Input.EventType.TOUCH_CANCEL,(event)=>{
            this.inTouch = false
            console.log('点击结束 点击的X坐标: '+this.touchX+  ' 点击的Y坐标:'+this.touchY+ ' 点击状态:'+this.inTouch)
        })
        input.on(Input.EventType.TOUCH_END,(event)=>{
            this.inTouch = false
            console.log('点击结束 点击的X坐标: '+this.touchX+  ' 点击的Y坐标:'+this.touchY+ ' 点击状态:'+this.inTouch)
        })
    }
}




我们可以看到,我们在实例化类时自动执行的构造函数中注册了对应的事件,并且将是否处于触控状态以及点击的坐标保存到了TouchInput的成员变量中。

4.测试触摸接收事件:

保存好文件,然后点击运行按钮,在浏览器运行后打开开发者工具,然后在屏幕上点击任意位置,我们将会在控制台中看到对event的打印:

也许你可能会有疑问,为何感觉console.log打印出来的坐标和上一章说的无论是世界坐标系还是本地坐标系都匹配不上?这是因为点击事件返回的点是根据触控坐标系计算出来的,您可能会对又引入了一个坐标系感到很Angry,但是不要紧,只需要使用相机来转化一下就能把触控坐标转化为世界坐标,这个具体过程我们会在后面实现。

5.在控制汽车节点的CarControl脚本中引入并使用TouchInput:

双击CarControl来让VS Code编辑它,我们先清空下update方法中的语句,然后把添加一个TouchInput类型的成员变量,并且在start函数中让这个成员变量指向TouchInput的单例。具体效果如下:

6.分析小车向触控点运动的实现:

我们要实现的效果是小车向玩家点击屏幕的位置移动,所以在代码中的逻辑就是:在每一帧的update的函数中,先获取touchInput的inTouch字段来判断下是否处于触摸状态,如果处于触摸状态,就获取到触摸点,然后将触摸点转换为世界坐标,最后再给小车的刚体组件施加一个由当前小车刚体所在的节点的世界坐标点指向触摸点的世界坐标点的力。

7.引入camera组件:

上一步骤中说到,获取到触摸点后要将触摸点转换为世界坐标才能参与后续计算,camera类中提供了screenToWorld方法来完成了这种转换。所以我们要引入camera。和引入汽车节点的刚体组件时一样,我们先声明一个Camera类型的gameCamera成员变量并且为他添加上给Cocos Creator看的注解。也许你会问我为什么不直接叫camera而是叫gameCamera,这是因为后期要显示UI,所以可能不只有一个摄像头,所以这个就不采用比较笼统的camera的名字:

然后回到Cocos Creator中,指定这个变量指向Game场景下的Canvas下的Camera:

8.实现步骤6的逻辑:

逻辑非常简单,把6的步骤给翻译成代码就是了,直接上CarControl的代码:

import { _decorator, Component, Node, RigidBody2D, Vec3, Vec2, math, Camera } from 'cc';
import { TouchInput } from './TouchInput';
const { ccclass, property } = _decorator;

@ccclass('CarControl')
export class CarControl extends Component {

    @property({type: RigidBody2D})
    carRigidBody: RigidBody2D

    touchInput: TouchInput
    
    @property({type: Camera})
    gameCamera: Camera

    start() {
        console.log('------------start-----------------')
        this.touchInput = TouchInput.Instance()
    }

    update(deltaTime: number) {
       
        var inTouching: boolean = this.touchInput.inTouch
        if(!inTouching){
            return
        }

        var twPos: Vec3 =  new Vec3(this.gameCamera.screenToWorld(new Vec3(this.touchInput.touchX,this.touchInput.touchY)))
        var nwPos: Vec3 = this.carRigidBody.node.getWorldPosition()

        var force: Vec2 = new Vec2(-nwPos.x+twPos.x,-nwPos.y+twPos.y)
        this.carRigidBody.applyForceToCenter(force,true)


    }
}


9.在浏览器中运行并查看结果:

VS Code和Cocos Creator中各自保存好,然后点击运行,在浏览器中查看运行。因为目前没有设置小车的阻力,所以如果一直点击的话持续受力会越来越快,如果只点击一下则会做向点击方向的匀速直线运动。但是不管怎么了,只要点击一下发现小车向着您点击的点做匀速直线运动了就表明没问题了,效果:

10、debug

虽然我们已经看到了小车的受力已经没问题了,但是小车的根节点,也就Car节点并没有随着刚体发生移动:

这是为什么呢,因为在前面的章节中我们在挂载刚体时按照常理给挂载到了小车的CarSprite节点上,而现在我们看到,因为刚体受力而发生位移时只对刚体所在的节点及其子节点生效,所以,刚体应该挂载到Car节点上才对。所以现在需要您删除掉CarSprite上的刚体:

然后按照相同方式在Car上面新建一个刚体:

最后记得让Car节点挂载的CarControl节点的carRigidBody变量指向Car的刚体:

11.重新测试

保存好,然后点击运行按钮,在浏览器中观察效果:

我们可以看到,Car节点不再一直停在起始位置了。

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

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

相关文章

MFC-GetAdaptersAddresses获取网卡信息

需要:#pragma comment(lib, "IPHLPAPI.lib") GetAdaptersAddresses函数参数说明 ULONG bufferSize = 0;ULONG result = ::GetAdaptersAddresses(AF_UNSPEC, GAA_FLAG_INCLUDE_PREFIX, nullptr, nullptr, &bufferSize);/*参数1:ULONG Family 网络协议族,此参…

【linux】Linux wps字体缺失、加粗乱码解决

解决wps字体缺失问题 1、下载字体包 git clone https://github.com/iamdh4/ttf-wps-fonts.git2、创建单独放置字体的目录 mkdir /usr/share/fonts/wps-fonts3、复制字体到系统目录下 cp ttf-wps-fonts/* /usr/share/fonts/wps-fonts4、修改字体权限 chmod 644 /usr/share/f…

2023年Java毕业设计选题推荐,1000道创新创意Java毕业设计题目推荐,避免踩坑

大家好,我是程序员徐师兄,最近有很多同学咨询,说毕业设计了,不知道选怎么题目好,有哪些是想需要注意的。 确实毕设选题实际上对很多同学来说一个大坑, 每年挖坑给自己跳的人太多太多。选到合适的题目的话&…

python pycharm 下载 安装 (1)

pycharm 官网 JetBrains: 软件开发者和团队的必备工具 python 官网 Python Release Python 3.11.5 | Python.org 软件安装 pycharm python 终端安装 然后进行全局配置 打开pycahrm 可以在扩展里边搜索中文翻译 测试

基于分布式系统结构下Nacos配置中心的应用

前言 在上一篇nacos初始中,已经描述过Nacos的基本知识,在这篇博客里记录的是Nacos配置中心的使用。 Nacos配置中心的作用 集中化配置管理:Nacos配置中心支持将应用程序的配置信息集中管理,包括常规的属性配置、文本配置、JSON配…

界面控件DevExtreme DateRangeBox组件发布,支持日期范围选择!

在最新的v23.1版本中,DevExpress官方已经正式发布了DevExtreme DateRangeBox小部件,支持所有JavaScript框架,包括Angular、React、Vue和jQuery。这个新的控件允许最终用户选择一个日期范围,该组件继承了DateBox组件的特性&#xf…

【笔记】简单算法查找、排序的思路和优化

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目…

李佳琦翻车,眉笔比黄金还贵?美妆品牌如何巧用AIGC降本增效?

又一个顶流翻车了。 9月10日,像往常一样,李佳琦站在镜头前,手中握着一支某国货品牌的眉笔,向消费者激情满满地进行介绍。却不曾想,下一秒却引发了风暴,仿佛随着键盘的敲击声一同汇聚,直指这位“…

如何使用ArcGIS中的Arcmap进行矢量和栅格数据裁剪?

在地理信息系统(GIS)中,我们经常需要处理各种空间数据,而矢量和栅格数据是最常见的两种数据类型。有时候,我们需要对数据进行裁剪,以提取出我们需要的特定区域的数据。本文将介绍如何使用ArcGIS中的Arcmap软件对矢量和栅格数据进行…

回溯系列--11个题

组合问题 第77题. 组合 题⽬链接:https://leetcode-cn.com/problems/combinations/ 给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。 ⽰例: 输⼊: n 4, k 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ] class Solution …

分享一下蛋糕店在微信小程序上可以实现什么功能

蛋糕店在微信小程序上可以实现的功能 微信小程序作为一种新型的商业模式,正逐渐成为各行各业拓展线上业务的重要手段。对于蛋糕店来说,开发微信小程序可以实现以下功能: 一、展示产品和服务 微信小程序可以作为蛋糕店的产品展示平台&#x…

树状数组总结

【使用总结】 经典用法:单点更新o(logn),区间查询/区间最大值(1~n,求sum),o(logn) 扩展用法:区间修改,如对[x,y]区间加上一个数k 模板题:力扣(LeetCode)官网 - 全球极…

操作指南 | 如何参与Moonbeam投票委托

投票委托允许没有时间或者专业度一般的用户能够在治理中拥有话语权。该功能加强了决策流程,并且确保更大范围地代表社区利益。 通过Moonbeam委托平台,你需要 $GLMR 和一个相兼容的钱包。此教程使用MetaMask示范。 如何参与投票委托 前往http://delega…

Python数据容器的总结

1、数据容器分类 数据容器(一共五个)可以从以下视角进行简单的分类: 是否支持下标索引 支持:列表、元组、字符串(序列类型) 不支持:集合、字典(非序列类型&#xff…

基于SSM的校园代购服务订单管理系统

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用Vue技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

日本SolarView Compact光伏发电测量系统 目录遍历漏洞复现(CVE-2023-40924)

日本SolarView Compact光伏发电测量系统 目录遍历漏洞复现CVE-2023-40924 一. 系统简介二.漏洞描述三.影响版本四.fofa查询语句五.漏洞复现六.POC&EXP七、修复建议 免责声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或…

使用java连接Libvirtd

基于springboot web 一、依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId>&l…

网站优化如何更新文章才有效果,有技巧的更新SEO优化文章

很多新手SEO人员都不太清楚网站为什么要每天更新文章&#xff1f;每天更新文章的主要目的是让新站更快地通过审核期&#xff0c;让老网站避免被降权。同时拥有更多的关键词排名&#xff0c;整体提升网站的流量。 提供新鲜和有用的内容&#xff1a;搜索引擎非常重视新鲜和有用的…

长胜证券:美科技股大跌,甲骨文一夜蒸发超3000亿

当地时间9月12日&#xff0c;美股三大股指跌落&#xff0c;其中&#xff0c;道指跌0.05%&#xff0c;标普指数跌0.57%&#xff0c;纳斯达克指数跌1.04%。本周商场重视通胀与顾客开支等经济数据。当天发布的数据显现&#xff0c;美国8月份线上商品价格创40个月最大降幅。美国房租…

四川Certum便宜多域名SSL证书

多域名SSL证书是一种安全协议&#xff0c;通过SSL/TLS协议对多个域名进行加密传输&#xff0c;实现网站的安全访问和数据传输。它不仅可以保护网站的信息安全&#xff0c;还可以提高网站的信任度和排名 。 而Certum是正规的SSL证书颁发机构&#xff0c;旗下SSL证书产品众多&…