当前位置: 移动技术网 > 移动技术>移动开发>IOS > 荐 cocoscreator摘星星补充-添加结束游戏

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

2020年07月15日  | 移动技术网移动技术  | 我要评论

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

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

上一篇添加了开始按钮,今天来添加游戏失败的简单界面;
由于没有合适的素材,并且毕竟只是练习,为了掌握相关技巧,所以就不特意出图了,直接使用现有素材,简单的添加个gameover的游戏结束文本;在层级管理器中创建渲染节点,选择label;在属性检查器中,修改string属性为GameOver,同设置分数时一样的套用font样式,在color中改变字体颜色;最后拖拽节点到场景中希望出现的位置,我这里希望gameover时从场景上方移动到场景中央,所以位置放在了-5,350;
在这里插入图片描述
在主场景中添加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会出现但是有点不对劲,这跟嚼了炫迈似的根本停不下来。。。
在这里插入图片描述
屡了一下,定位问题应该是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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网