基于Cocos Creator开发的打砖块游戏

一、简介

  • Cocos简而言之就是一个开发工具,详见官方网站
  • TypeScript简而言之就是开发语言,是JavaScript的一个超集详解官网

今天我们就来学习如何写一个打砖块的游戏,很简单的一个入门级小游戏。

二、实现过程

2.1 布局部分

首先来一个整体的工程界面:

一看就很简单吧,就几个元素+脚本(之所以分开写是为了便于查错)。

再来一个游戏界面:很简洁有木有?当然啦,美观的工作需要各位小伙伴自行发挥啦。好了,下面进入正题…

首先,创建一个新的“世界”名字叫game。将场景设置为640X960

然后,你在这个世界花了1亿买了一块地皮,当然得有地契“BG”(在Canvas下新增一个空节点将大小改为640X960,或者你自己选择一张背景,拖在Canvas下设置大小就ok了,至于其他的就默认)

好了,有地皮了,你就可以“为所欲为”了。先添加砖块吧:

将砖块拖到Canvas下,然后拖回Texture就成了预制体(很简单有木有)。

至于大小什么的可以用代码控制。

因为是砖块,要和小球碰撞,所以要加上物理碰撞。

知识点

  • cc.RigidBodyType.Static:静态刚体,零质量,零速度,即不会受到重力或速度影响,但是可以设置他的位置来进行移动
  • cc.RigidBodyType.Dynamic:动态刚体,有质量,可以设置速度,会受到重力影响
  • cc.RigidBodyType.Kinematic:运动刚体,零质量,可以设置速度,不会受到重力的影响,但是可以设置速度来进行移动
  • cc.RigidBodyType.Animated:动画刚体,在上面已经提到过,从 Kinematic 衍生的类型,主要用于刚体与动画编辑结合使用

这里我们选择

  • Type:Static(静止),在那等着小球来碰撞。然后给他添加一个包围盒PhysicsBoxCollider
  • PhysicsBoxCollider 类型,摩擦力、弹性系数请自由发挥

再来是我们的主角:

同样的给他一个碰撞组件,Type: Dynamic;然后添加包围盒

下面就是托盘,也是Static

然后添加一个空节点,大小比BG小一些,他的作用其实就是“围墙”,避免小球或托盘飞出场景。同时添加碰撞组件和包围盒。

然后还有个foot_line,这个就是监测小球掉下去游戏结束。

还有个count ,后面再说这个计数。好了,罗里吧嗦的布局就完成了。

2.2 代码部分

我们首先建一个game的游戏脚本,用来初始化一些节点(其实所有的代码都可以放在一个脚本里,但是遇到复制的程序的时候不便于查错,所以该分开写的还是要分开写。

首先呢,我们要加载一些节点变量。写代码的时候带上注释是好习惯哦!

我们来一个创建砖块的方法吧:

我采用的是中规中矩的生成方法,通过i和j控制行和列,然后在设置横向间距即可最后生成的结果为:(其他的样式,只要找到规律生成即可。)

再来我们看onload方法:

第二句先忽略。因为小球和砖块碰撞会产生效果,所以要开启物理碰撞(默认是关闭的)。托盘是根据手指移动的,所以要监听手指的移动:

知识点

我们这里用touch_move,接着需要

//获取点击的坐标并转换成节点坐标系坐标
let eposition = self.node.convertToNodeSpaceAR(event.getLocation());

然后设置托盘的位置即可。托盘是左右移动的,所以还需要控制他不能移出屏幕

//控制不能移除屏幕
let minx = -self.node.width / 2 + this.wall.width / 2;//最小坐标
let maxx = -minx;
if (this.wall.x > maxx) {
    this.wall.x = maxx;
}
if (this.wall.x < minx) {
    this.wall.x = minx;
}

场景开始加载的时候我们需要快速的生成好砖块,所以这用了定时器使用计时器

//自动生成砖块
self.schedule(function () { self.createbrick(); }, 0.2, 1);

第一个参数就是回调方法,第二个是时间间隔,每隔多少秒调用一次,第三个是执行次数,默认为0执行一次。

好了,初始代码完了,简单吧(其实还有些新增的东西,如障碍物和多个小球的生成,这个我们就后面再讲)。

然后我把脚本挂在Canvas上,并把相应的节点和组件拖进去。运行可以看到已经生成了砖块了吧。

再来我们看主角:ball,同样的给他创建一个脚本ball并挂在小球上。

这个脚本的作用主要是检测,碰撞检测。关于碰撞标签tag,按顺序给碰撞体添加即可。

onBeginContact(contact:cc.PhysicsContact,selfCollider:cc.PhysicsCollider,otherCollider:cc.PhysicsCollider):void{}

用碰撞的tag来区分与小球(self)碰撞的是哪个碰撞体。如果是托盘,那就给小球一个速度。如果是托盘没接住小球掉下去了,游戏结束我们就要跳转到结束界面(后面讲)。

接着就是砖块了:

这个呢主要就是加分用的。基本是完工了,很简单的有木有。

再来看结束的场景:

创建一个结束的场景Sence,同样的需要一个脚本overcount,脚本里需要处理的是:

  • 接收主场景传过来的分数并做展示,此处我直接把节点给传过来了
  • 重新开始按钮功能

第一个,分数节点,我们创建一个label节点但是因为要是常驻节点所以它和Canvas平级。

然后新建一个脚本挂在此节点上

onLoad () {
    cc.game.addPersistRootNode(this.node);
}

声明它为常驻节点。

Brick.ts:当小球和砖块碰撞的时候呢,分数+1,并且要销毁砖块。

if (otherCollider.tag == 0) {//球和砖块碰撞
    let gamecc = cc.director.getScene().getChildByName('count').getComponent(cc.Label);
    gamecc.string = String(Number(gamecc.string) + 1);
    this.node.destroy();

拿到分数后,ball.ts:

if(otherCollider.tag==5){//球和foot_line碰撞
    cc.director.getPhysicsManager().enabled = false;
    cc.find('Canvas').destroyAllChildren();
    cc.director.loadScene('over');       
}

如果小球掉下去了(托盘没接到),然后我们将小球的物理状态关掉,清除game场景下的所有节点并跳转到结束场景over。

Over场景中有一个重新开始的按钮overcount.ts:

需要做的就是获取分数并将分数复制给结束界面的Label,然后隐藏此常驻节点。

let gamecount = cc.director.getScene().getChildByName('count').getComponent(cc.Label);
gamecount.node.active = false;
this.overcount.string = gamecount.string;


self.again.on(cc.Node.EventType.TOUCH_START, function () {
        gamecount.string = String(0);
        cc.director.loadScene('game');
    }, self)

点击重新开始按钮,那么需要把分数置为0,当然还没完,前面我们是关闭了分数计数节点,现在需要打开Game.ts

onLoad() {
    let self = this;
    //开启分数节点
    cc.director.getScene().getChildByName('count').getComponent(cc.Label).node.active = true;

好了,到这你就可以让你的程序跑起来了。

2.3 新增功能

障碍物

障碍物很简单的,也是通过预制体,然后给它上面挂个label用来当小球碰到障碍物的时候,这个数值自减最后在总分数上加上这个分值。

创建一个bar脚本并挂在此节点上,Bar.ts

脚本的作用呢就是给障碍物一个常量,小球和障碍物每碰撞一次就减1,当小于1 的时候就给总发加上3分。

好了,大概就是这些了,项目其实很简单。多练、多写ヾ(◍°∇°◍)ノ゙

还有添加隐藏的小球,碰撞后生成多个小球!这个请小伙伴自行发挥了…

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

BigDecimal 详解

《阿里巴巴 Java 开发手册》中提到&#xff1a;“为了避免精度丢失&#xff0c;可以使用 BigDecimal 来进行浮点数的运算”。 浮点数的运算竟然还会有精度丢失的风险吗&#xff1f;确实会&#xff01; 示例代码&#xff1a; float a 2.0f - 1.9f; float b 1.8f - 1.7f; Sys…

使用git命令实现对gitee仓库的下载、更新、上传、上传更新操作。

博客内容为使用git命令实现对gitee仓库的下载、更新、上传、上传更新操作。 1、下载(检出) 使用 git clone 命令 项目仓库地址 eg: git clone https://gitee.com/zzzzzed/ChinessChess.git 如果本地已经下载了该项目则跳过该步骤。 注意使用 git clone 首次检出需要输入用户名…

攻防世界38-FlatScience-CTFWeb

攻防世界38-FlatScience-Web 点开这个here看到一堆pdf,感觉没用&#xff0c;扫描一下 试试弱口令先 源码里有&#xff1a; 好吧0.0 试试存不存在sql注入 根本没回显&#xff0c;转战login.php先 输入1’,发现sql注入 看到提示 访问后得源码 <?php ob_start(); ?>…

JavaWeb后端开发案例——苍穹外卖day01

day1遇到问题&#xff1a; 1.前端界面打不开&#xff0c;把nginx.conf文件中localhost:80改成81即可 2.前后端联调时&#xff0c;前端登录没反应&#xff0c;application.yml中默认用的8080端口被占用&#xff0c;就改用了8081端口&#xff0c;修改的时候需要改两个地方&…

常用中间件介绍

1. RabbitMQ RabbitMQ是一个基于AMQP&#xff08;Advanced Message Queuing Protocol&#xff0c;高级消息队列协议&#xff09;的开源消息代理软件&#xff0c;实现了面向消息的中间件。它支持消息持久化、队列、交换机&#xff08;Exchange&#xff09;和绑定&#xff08;Bin…

【HAProxy06】企业级反向代理HAProxy调度算法之其他算法

HAProxy 调度算法 HAProxy通过固定参数 balance 指明对后端服务器的调度算法&#xff0c;该参数可以配置在listen或backend选项中。 HAProxy的调度算法分为静态和动态调度算法&#xff0c;但是有些算法可以根据不同的参数实现静态和动态算法 相互转换。 官方文档&#xff1…

什么是 eCPRI,它对 5G 和 Open RAN 有何贡献?

这里写目录标题 eCPRI 协议平面&#xff1a;功能分解eCPRI与CPRI的区别CPRI具有以下特点&#xff1a;eCPRI具有以下特点&#xff1a;eCPRI 的优势 所需带宽减少 10 倍适用于 5G 和 Open RAN 的 eCPRI&#xff1a; 通用公共无线接口&#xff08;CPRI&#xff09;是一种行业合作&…

【网页设计】HTML5 和 CSS3 提高

目标 能够说出 3~5 个 HTML5 新增布局和表单标签能够说出 CSS3 的新增特性有哪些 1. HTML5 的新特性 注&#xff1a;该部分所有内容可参考菜鸟教程菜鸟教程 - 学的不仅是技术&#xff0c;更是梦想&#xff01; (runoob.com) HTML5 的新增特性主要是针对于以前的不足&#xf…

Dinky控制台:利用SSE技术实现实时日志监控与操作

1、前置知识 1.1 Dinky介绍 实时即未来,Dinky 为 Apache Flink 而生,让 Flink SQL 纵享丝滑。 Dinky 是一个开箱即用、易扩展,以 Apache Flink 为基础,连接 OLAP 和数据湖等众多框架的一站式实时计算平台,致力于流批一体和湖仓一体的探索与实践。 致力于简化Flink任务开…

如何判断 Hive 表是内部表还是外部表

在使用 Apache Hive 进行大数据处理时&#xff0c;理解表的类型&#xff08;内部表或外部表&#xff09;对于数据管理和维护至关重要。本篇文章将详细介绍如何判断 Hive 表是内部表还是外部表&#xff0c;并提供具体的操作示例。 目录 Hive 表的类型简介判断表类型的方法 方法…

破局数字化转型:企业转型实施中的挑战与解决之道

数字化转型的必然性与复杂性 面对快速变化的市场需求和技术革新&#xff0c;企业迫切需要通过数字化转型提升业务敏捷性、优化流程并加强客户体验。然而&#xff0c;转型过程并非易事&#xff0c;各种挑战使得转型进程复杂且风险重重。从技术选择、架构设计到变革管理&#xf…

3DTiles之i3dm介绍

3DTiles之i3dm介绍 3D Tiles 是一种用于高效存储和传输三维城市、建筑、地形、点云等空间数据的开放标准格式。i3dm&#xff08;Intel 3D Model&#xff09;是 3D Tiles 中用于表示三维模型&#xff08;如建筑物或其他对象&#xff09;的一个子格式。i3dm 格式的出现&#xff…

本地部署大模型?看这篇就够了,Ollama 部署和实战

写在前面 前几篇&#xff0c;分享的都是如何白嫖国内外各大厂商的免费大模型服务~ 有小伙伴问&#xff0c;如果我想在本地搞个大模型玩玩&#xff0c;有什么解决方案&#xff1f; Ollama&#xff0c;它来了&#xff0c;专为在本地机器便捷部署和运行大模型而设计。 也许是目…

前端学习八股资料CSS(二)

更多详情&#xff1a;爱米的前端小笔记&#xff0c;更多前端内容&#xff0c;等你来看&#xff01;这些都是利用下班时间整理的&#xff0c;整理不易&#xff0c;大家多多&#x1f44d;&#x1f49b;➕&#x1f914;哦&#xff01;你们的支持才是我不断更新的动力&#xff01;找…

使用@react-three/fiber,@mkkellogg/gaussian-splats-3d加载.splat,.ply,.ksplat文件

前言 假设您正在现有项目中集成这些包&#xff0c;而该项目的构建工具为 Webpack 或 Vite。同时&#xff0c;您对 Three.js 和 React 有一定的了解。如果您发现有任何错误或有更好的方法&#xff0c;请随时留言。 安装 npm install three types/three react-three/fiber rea…

麻将室灯控计时计费软件下载 佳易王棋牌计时电脑收银管理系统操作教程

一、概述 【软件资源下载在文章最后】 麻将室灯控计时计费软件下载&#xff0c;棋牌计时电脑收银管理系统操作教程 核心功能‌&#xff1a; ‌计时计费‌&#xff1a;实时显示开台时间及使用时长&#xff0c;‌销售商品‌&#xff1a;商品可与桌子绑定最后结账&#xff0c;或…

【时间之外】IT人求职和创业应知【35】-RTE三进宫

目录 新闻一&#xff1a;京东工业发布11.11战报&#xff0c;多项倍增数据体现工业经济信心提升 新闻二&#xff1a;阿里云100万核算力支撑天猫双11&#xff0c;弹性计算规模刷新纪录 新闻三&#xff1a;声网CEO赵斌&#xff1a;RTE将成为生成式AI时代AI Infra的关键部分 认知…

基于BILSTM及其他RNN序列模型的人名分类器

数据集Kaggle链接 NameNationalLanguage | Kaggle 数据集分布: 第一列为人名,第二列为国家标签 代码开源地址 Kaggle代码链接 https://www.kaggle.com/code/houjijin/name-nationality-classification Gitee码云链接 人名国籍分类 Name Nation classification: using BI…

hive中windows子句的使用

概述 1&#xff0c;windows子句是对窗口的结果做更细粒度的划分 2、windows子句中有两种方式 rows &#xff1a;按照相邻的几行进行开窗 range&#xff1a;按照某个值的范围进行开窗 使用方式 (rows | range) between (UNBOUNDED | [num]) PRECEDING AND ([num] PRECEDING…

云渲染:服务器机房与物理机房两者有什么区别

云渲染选择服务器机房与物理机房两者主要区别在哪里呢&#xff1f; 服务器机房和物理机房作为云渲染的基础设施&#xff0c;各自扮演着不同的角色。 服务器机房的特点 服务器机房&#xff0c;通常指的是那些专门用于托管服务器的设施&#xff0c;它们可能位于云端&#xff0c…