大三学生的游戏开发之旅-Cocos Creator微信小游戏实战(球球合成-2048)项目开发思路解析/方案

本文主要是介绍大三学生的游戏开发之旅-Cocos Creator微信小游戏实战(球球合成-2048)项目开发思路解析/方案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在上一篇文章中提到参加了一个小游戏竞赛,这篇文章就来讲解这个项目的基本思路(主要提供开发思路及部分代码),


这个项目主要就是一个2048的改版,玩家使用小飞船来左右移动控制生成小球,并在玩家手指离开屏幕时小球掉落,与场上其他小球进行合成(当小球合成到2048时,消除小球),目前主要是合成玩法(有个在职策划小哥哥推荐把这个项目做成解压+关卡玩法,但由于时间关系,最终没有实现,有兴趣的可以自己试试)。下面为这个项目的小程序码,感兴趣的可以去试一试(体验一下),希望为更多开发者提供良好思路。

        


1:微信方面

在和微信开发者工具搭配使用方面主要使用微信的云开发和微信授权登录,用户分享转发等功能,其中,创建全屏登录按钮的部分代码如下。

                let width = window.wx.getSystemInfoSync().screenWidth;//获取设备宽屏幕let height = window.wx.getSystemInfoSync().screenHeight;//获取设备屏幕高var button = wx.createUserInfoButton({type: 'text',text: '',style: {left:0,//距左0top:0,//距顶0width:width,//按钮宽度height:height,//按钮高度}});button.show();

2:新手教程

新手教程主要用到了一个本地缓存的功能,玩家第一次进入游戏时,判断一个本地缓存数据是否存在(由于玩家首次进入,肯定是不存在的啦),不存在则新手教程开启,当玩家做出了指定操作的时候(玩家手指离开屏幕成功生成一个小球后),往本地缓存写入一个数据,那么,当下次玩家游戏的时候会进行该本地缓存数据判断,这个时候,本地存在该数据,则新手教程关闭,新手教程的节点随之销毁。

2.1:判断是否存在本地缓存数据

maskBtn() {var playerP = cc.sys.localStorage.getItem('oldPlayer');//拿出本地缓存的数据if(playerP==1){//如果本地缓存的数据存在且为指定数据this.hand.destroy()//新手教程节点销毁}else{this.hand.active=true;//新手教程节点开启(刚开始进入为关闭)}},

2.2:若不存在本地缓存数据,则在touchEnd后,往本地写入数据

onTouchEnd() {this.hand.destroy();//新手指引销毁if(!playerP){//如果是新用户var p = 1;cc.sys.localStorage.setItem('oldPlayer',p);//写入数据};var playerP = cc.sys.localStorage.getItem('oldPlayer');console.log(playerP);//打印一下看是否正确}},

3:飞船移动

在玩家控制飞船的左右移动事件中,主要是开始触摸屏幕,移动以及结束触摸操作,在开始移动时,飞船下生成小球,移动过程中获取触摸点的位置变化然后引起飞船的位置变化,触摸结束将小球重力缩放设置为1(小球会向下掉落),并将掉落的小球绑定到另一父节点上。在这些操作中,可能会存在飞船飞出屏幕左右边缘的情况,于是用一个scene()函数控制飞船处于屏幕内。

3.1:飞船移动控制

onTouchStart(e) {if (this.state == 1) {// console.log("start");//记录数值this.thisNum = this.nextNum.string;//初始化球this.initBallNode();// 球赋值this.ballNode.getComponent('ballNode').updatestr(this.thisNum)//positionthis.ballNode.setPosition(e.getDelta());//-44this.ballNode.y = -44}},
onTouchEnd() {if (this.state == 1) {//开启重力this.ballNode.getComponent('ballNode').initGra(2)// console.log("end");/**数值更新 */this.updateNum();//换绑父节点this.ballNodeFall();//获取最大的数值for (var a = 0; a < gNumArr.length; a++) {this.arr = Math.max.apply(null, gNumArr)}// console.log(gNumArr)// console.log(this.arr)if (this.arr == 8) { x = 1 }//  一个小球生成机制if (this.arr == 16) { x = 2 }if (this.arr == 32) { x = 3 }if (this.arr >= 64) { x = 4 }// console.log(x)this.hand.destroy();//新手指引销毁if(!playerP){//如果是新用户var p = 1;cc.sys.localStorage.setItem('oldPlayer',p);};var playerP = cc.sys.localStorage.getItem('oldPlayer');// console.log(playerP);}},
onTouchMove(e) {if (this.state == 1) {// console.log("move");//区域控制this.scene();this.plane.setPosition(e.getDelta());//positionthis.ballNode.setPosition(e.getDelta());this.ballNode.y = -44}},

3.2:scene()函数

scene() {let PX = this.player.position.x;let PY = this.player.position.y;let BX = (cc.find("bg"), this.node).width / 2 - this.player.width / 2;if (PX < -BX) {this.player.runAction(cc.moveTo(0, -BX, PY));}if (PX > BX) {this.player.runAction(cc.moveTo(0, BX, PY));}},

4:小球合成

在小球碰撞合成的过程中,我使用的是引擎自带的碰撞组件(强烈不建议),建议各位开发者能自己写碰撞的一定要自己写,由于我自己还是学生(还很菜,不会自己写碰撞组件),所以就只能用引擎自带的了,这也就导致游戏存在一些问题,比如当场景中小球过多会引起“抖动”,小球合成视觉效果差(可能也和我没有美术有关,哈哈哈哈哈哈哈哈哈),各位开发者可以试着将它做成一种融合效果。言归正传,在这里,是进行判断两个碰撞体上Label节点上的数字是否相等,相等则进行小球合成操作,分数进行累加,小球合成以及消失动画(没有美术,动画有亿点点丑)。然后这里还存在一个小球合成后,小球的大小,颜色要进行更新,以及若合成的小球是场中最大的球,要将这个球的数据保存下来(后续要进行小球生成机制)。

onBeginContact: function (contact, selfCollider, otherCollider) {// console.log('begin')if(otherCollider.node.group == 'default'){let selfNum = selfCollider.node.getChildByName('thisNum').getComponent(cc.Label)// let self = selfCollider.node.getPosition();// console.log(self)let otherNum = otherCollider.node.getChildByName('thisNum').getComponent(cc.Label)var selfAnim = selfCollider.node.getComponent(cc.Animation);var otherAnim = otherCollider.node.getComponent(cc.Animation);//小球累加if(selfNum.string == otherNum.string){selfNum.string = selfNum.string*2//碰撞球数据更新// otherNum.string = 0;//被碰撞球数据清零//分数scorevar score = cc.find("Canvas/bg/score/scoreLabel").getComponent(cc.Label)this.s=selfNum.stringscore.string=Number(this.s)+Number(score.string)/*var gameScript = cc.find("Canvas/bg").getComponent('game')gameScript.updateScore(selfNum.string);*///最大数据更新/存入最大数据this.max = Math.max.apply(null,gNumArr)if(Number(this.s)>this.max){gNumArr.push(Number(this.s))}/*** 2048销毁*/if(Number(this.s)==2048){this.node.destroy();// boomNum+=1;}//Scale大小,颜色for(var i = 0;i<gBall.length;i++){if(selfNum.string==gBall[i].pro){this.node.setScale(gBall[i].scale)this.node.color=gBall[i].color;}};cc.audioEngine.playEffect(this.toucheffect,false);//动画播放selfAnim.playAdditive('self')otherAnim.playAdditive('other')// otherCollider.destroy()setTimeout(() => {otherCollider.node.destroy()}, 300);}}},

5:球大小及颜色的操作

球的大小和颜色这里用一个全局数组进行保存,然后通过小球Label组件上的数据和数组中的pro进行比较,然后获得颜色和大小。

5.1:数组代码

window.gBall=[{pro:2,color:new cc.Color(129,236,236),scale:0.55},{pro:4,color:new cc.Color(0, 206, 201),scale:0.6},{pro:8,color:new cc.Color(122,255,116),scale:0.65},{pro:16,color:new cc.Color(162,155,254),scale:0.7},{pro:32,color:new cc.Color(108,92,231),scale:0.75},{pro:64,color:new cc.Color(255,116,224),scale:0.8},{pro:128,color:new cc.Color(255,116,160),scale:0.85},{pro:256,color:new cc.Color(255,116,116),scale:0.9},{pro:512,color:new cc.Color(255,39,39),scale:0.95},{pro:1024,color:new cc.Color(16, 172, 132),scale:1.0},{pro:2048,color:new cc.Color(150,89,60),scale:1.05},
]

5.2:合成的主要部分

          //Scale/colorfor(var i = 0;i<gBall.length;i++){if(selfNum.string==gBall[i].pro){this.node.setScale(gBall[i].scale);//Scalethis.node.color=gBall[i].color;//color}};

6:球生成机制

在飞船移动生成小球的时候,存在一定的生成机制(当场上存在8才会生成小球4,存在16才会生成小球8.........),即需要判断当前场上存在的最大的小球的Label数据(生成即存放),然后才能随机生成新数据的小球。数据存入时一定存在一个判断,否则数组数据会非常多,不利于小球生成的数据获取。

6.1:数据存入

                //最大数据更新/存入最大数据this.max = Math.max.apply(null,gNumArr)//获取数组最大数据if(Number(this.s)>this.max){//若最大数据小于当前生成球的数据gNumArr.push(Number(this.s))//将当前球的数据存入数组}

6.2:小球生成机制

        //获取最大的数值for (var a = 0; a < gNumArr.length; a++) {this.arr = Math.max.apply(null, gNumArr)//获取数组内最大数据}// console.log(gNumArr)// console.log(this.arr)if (this.arr == 8) { x = 1 }if (this.arr == 16) { x = 2 }if (this.arr == 32) { x = 3 }if (this.arr >= 64) { x = 4 }

6.3:小球生成

updatestr(str){// console.log('data')this.Num.string = strfor(var a = 0;a<gBall.length;a++){if(this.Num.string==gBall[a].pro){this.node.setScale(gBall[a].scale)this.node.color=gBall[a].color;}};},

使用math函数求得(x+1)的2次方即可完成小球生成机制。

7:分数保存

在死亡(小球超出一定高度)后,游戏会进行分数保存,将用户所得的分数保存到本地并显示当前用户的最高分,这里不做过多解释,就是一个数据保存以及基本的判断。

saveScore() {//当前分数var currentScore = this.score.string;var scoreData = {'score': currentScore};var preData = cc.sys.localStorage.getItem('score');//获取数据var highScore = cc.sys.localStorage.getItem('topScore');//获取数据if (!highScore || parseInt(highScore) < parseInt(currentScore)) {//若不存在或最高分小于当前分数cc.sys.localStorage.setItem('topScore', currentScore);//存入数据}if (!preData) {preData = [];preData.unshift(scoreData);} else {preData = JSON.parse(preData);if (!(preData instanceof Array)) {preData = [];}preData.unshift(scoreData);}cc.sys.localStorage.setItem('currentScore', currentScore);//存入cc.sys.localStorage.setItem('score', JSON.stringify(preData));//存入console.log(preData)console.log(highScore)if (highScore < currentScore) {highScore = currentScore;}//最高分this.topScore.string = highScore;preTopScore = highScore;//当前分this.nowScore.string = currentScore;},

8:道具

最后一个也就是我们的道具,炸弹道具,道具的主要功能即当小球高度偏高时销毁屏幕中所有的小球,功能较为简单(也可以加入其他道具,如万能小球(可以与任意球合成)扔掉当前小球(随机新生成一个小球)),在这里程序部分也比较简单,即销毁其中一个节点下的所有子节点。由于这里我没有其他的炸弹生成机制,因此,道具只存在1个或0个的情况,如果想把生成2048后获得一个炸弹,这里可以做成自加自减的方式。

boomTouch() {if (this.state == 1) {if (boomNum > 0) {console.log('boom')boomNum = 0;// boomNum-=1;this.ballNodeDown.destroyAllChildren()} else {this.videoPlay()console.log('视频广告')}}},

 

这篇关于大三学生的游戏开发之旅-Cocos Creator微信小游戏实战(球球合成-2048)项目开发思路解析/方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/284208

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

W外链微信推广短连接怎么做?

制作微信推广链接的难点分析 一、内容创作难度 制作微信推广链接时,首先需要创作有吸引力的内容。这不仅要求内容本身有趣、有价值,还要能够激起人们的分享欲望。对于许多企业和个人来说,尤其是那些缺乏创意和写作能力的人来说,这是制作微信推广链接的一大难点。 二、精准定位难度 微信用户群体庞大,不同用户的需求和兴趣各异。因此,制作推广链接时需要精准定位目标受众,以便更有效地吸引他们点击并分享链接

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

高效+灵活,万博智云全球发布AWS无代理跨云容灾方案!

摘要 近日,万博智云推出了基于AWS的无代理跨云容灾解决方案,并与拉丁美洲,中东,亚洲的合作伙伴面向全球开展了联合发布。这一方案以AWS应用环境为基础,将HyperBDR平台的高效、灵活和成本效益优势与无代理功能相结合,为全球企业带来实现了更便捷、经济的数据保护。 一、全球联合发布 9月2日,万博智云CEO Michael Wong在线上平台发布AWS无代理跨云容灾解决方案的阐述视频,介绍了

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof