欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

荐 cocoscreator摘星星补充-添加结束游戏

程序员文章站 2022-07-03 18:18:43
文档中摘星星的demo课后练习如下:加入简单的开始菜单界面,在游戏运行的一开始显示开始按钮,点击按钮后才会开始游戏为游戏失败加入简单的菜单界面,游戏失败后点击按钮才会重新开始限制主角的移动不能超过视窗边界为主角的跳跃动作加入更细腻的动画表现为星星消失的状态加入计时进度条收集星星时加入更华丽的效果为触屏设备加入输入控制上一篇添加了开始按钮,今天来添加游戏失败的简单界面;由于没有合适的素材,并且毕竟只是练习,为了掌握相关技巧,所以就不特意出图了,直接使用现有素材,简单的添加个gameove...

文档中摘星星的demo课后练习如下:

  • 加入简单的开始菜单界面,在游戏运行的一开始显示开始按钮,点击按钮后才会开始游戏
  • 为游戏失败加入简单的菜单界面,游戏失败后点击按钮才会重新开始
  • 限制主角的移动不能超过视窗边界
  • 为主角的跳跃动作加入更细腻的动画表现
  • 为星星消失的状态加入计时进度条
  • 收集星星时加入更华丽的效果
  • 为触屏设备加入输入控制

上一篇添加了开始按钮,今天来添加游戏失败的简单界面;
由于没有合适的素材,并且毕竟只是练习,为了掌握相关技巧,所以就不特意出图了,直接使用现有素材,简单的添加个gameover的游戏结束文本;在层级管理器中创建渲染节点,选择label;在属性检查器中,修改string属性为GameOver,同设置分数时一样的套用font样式,在color中改变字体颜色;最后拖拽节点到场景中希望出现的位置,我这里希望gameover时从场景上方移动到场景*,所以位置放在了-5,350;
荐
                                                        cocoscreator摘星星补充-添加结束游戏
在主场景中添加gameover属性并关联;

	GameOver:{
       default: null,
       type: cc.Label
    }

之后就是修改脚本了,在game脚本中找到上次写的gameover事件,添加gameover节点的动作;

	gameOver: function () {
        this.player.stopAllActions(); //停止 player 节点的跳跃动作
        let label = this.node.getChildByName('gameOver');
        let MoveTo = cc.moveTo(.5, cc.v2(0, 0))
        label.runAction(MoveTo);
    },

这里我一开始使用的是像改变分数时一样直接使用this.GameOver.runAction预览时才发现对于label节点并不存在runAction方法,在文档上又不知道用什么关键词去解决问题,最后还是百度了很久,一通瞎试,发现通过getChildByName可以获取到node节点,这属于野路子,并不清楚是否应该这么写,有朋友晓得请留言,我会及时修改;
保存后预览,游戏结束后发现,gameover会出现但是有点不对劲,这跟嚼了炫迈似的根本停不下来。。。
荐
                                                        cocoscreator摘星星补充-添加结束游戏
屡了一下,定位问题应该是gamevoer事件触发是在update中判断的,而update是每帧都会调用,所以这飕飕疯跑就说的通了,祭出写web的方法直接加了个flag,后来琢么着,这无中生有搞出来个全局变量有点不合适,想了前两天忘记在哪看到的enabled属性;可以直接把game主逻辑停掉,这样update就不会重复调用gameover属性了;

	this.enabled = false;

在gameover\startEvent中对应的添加enabled属性的0/1;这个毛病就治好了;下边需要在弹出gameover时再搞一个重新开始的按钮,同样的图省事,就直接使用现成的开始按钮了;之前在startEvent中添加了play按钮的事件,并把他的opacity改成了0,那就直接在gameover中把opacity再改成255让他显示出来不就好了;
事实再次打脸。。opacity这个属性打一开始用的就不对,居然犯了这么明显的一个错误,opacity=0不是display:none啊,透明度为0了,元素还在,点击哪个区域的话仍然可以触发startEvent事件;又是一通搜,发现active可以简单快速的控制节点是否激活,于是把opacity都修改为

	this.BtnStart.active = true;

预览了下,仍然存在两个问题:

  1. 有时角色会在gameover后,明明已经stopAllActions的情况下仍然可以贴地蠕动,而且keydown和可以keyup事件监听仍然存在;
  2. 每次游戏结束通过play按钮再次开始游戏时,会生成新的星星;

解决办法:
3. 索性同样enabled处理;
4. 把游戏结束时老的star销毁掉;

这俩度没什么难点以及嘎七碼八的api,心细点哪里出错改哪里就好了,直接吧修改后的代码贴上来了

	startEvent: function () {
        this.enabled = true;
        this.timer = 0;
        this.starDuration = 0;
        this.score = 0;
        this.groundY = this.ground.y + this.ground.height / 2;
        this.spawnNewStar();
        this.BtnStart.active = false;
        this.player.getComponent('player').startMove();
        this.node.getChildByName('gameOver').setPosition(-5,350);
        this.player.getComponent('player').enabled = true;
        this.player.getComponent('player').onLoad();
    },
	gameOver: function () {
        this.player.stopAllActions(); //停止 player 节点的跳跃动作
        let label = this.node.getChildByName('gameOver');
        let MoveTo = cc.moveTo(.5, cc.v2(0, 0))
        label.runAction(MoveTo);
        this.node.getChildByName('star').destroy();
        this.BtnStart.active = true;
        this.enabled = false;
        this.player.setPosition(6.629, -115.225);
        this.player.getComponent('player').enabled = false;
    },

写的时候不觉得,但是贴过来一看,臃肿的一批,应该还可以进行很大程度的优化,让我想起了刚开始工作时写的${’#id’}.parent().parent().parent().parent();总会有个parentUntil,只是现在还没掌握;事需缓图,慢慢来吧,哈哈。

本文地址:https://blog.csdn.net/I1326/article/details/107336936