游戏开发实战之《冰火世界》(二)
笔者在上一篇《游戏开发实战之《冰火世界》(一)》中忘记介绍这个小游戏的玩法了,现在来补充一下冰火世界玩法
1:主角有2种状态,冰状态(蓝色)和火状态(红色),开场时默认状态为冰状态。
2:颜色块有2种,冰块(蓝色)和火块(红色)。
3:主角冰状态下只能吃冰块,火状态下只能吃火块,每吃一个增加能量值----顶部的能量条会增加,积分也增加。
4:主角可以利用跳跃避开不符合自身状态的颜色块,也可以用跳跃吃到够不着的颜色块,跳跃支持2段连续跳跃;主角可以利用切换状态(ps:来回切换冰火状态,但切换状态会消耗能量值)来吃到即将触碰到的不同颜色块。
5:随着时间流逝,颜色块移动速度会增加,主角触碰到不同颜色块则游戏结束。
上一篇介绍了主角的走路帧动画,这篇完成主角的切换状态和跳跃。创建一个player.js脚本挂在player节点上如下:
player.js脚本如下:
cc.Class({
extends: cc.Component,
properties: {
currState:0, //0为冰状态,1为火状态
jumpState:0, //0无跳跃,1处于1段跳跃状态,2处于2段跳跃状态
jumpHeight:0, //跳跃高度
grade:0, //分数
gradeLabel:{ //分数label
default:null,
type:cc.Label
}
},
jump:function()
{
let y=this.node.y
let jumpH=this.jumpState==1?this.jumpHeight:(this.jumpHeight+30)
let jump=cc.jumpBy(0.5,0,(this.flootY-y),jumpH,1)
let callback=cc.callFunc(function(){
this.jumpState=0
}.bind(this))
let spawn=cc.spawn(jump,cc.rotateBy(0.5,360))
this.node.stopAllActions()
if(this.jumpState==2)
{
this.node.runAction(cc.sequence(spawn,callback))
}
else
{
this.node.runAction(cc.sequence(jump,callback))
}
},
onJump:function()
{
if(this.jumpState==2) //目前仅支持连续跳跃2次
{
return
}
else if(this.jumpState==1)
{
this.jumpState=2
}
else if(this.jumpState==0)
{
this.jumpState=1
}
this.jump()
},
}
切回编辑器,设置一下跳跃高度jumpHeight:
笔者设为100,读者可以自己按照喜好设置。
其中onJump是跳跃按钮的回调函数,jumpState用来判断当前是一段跳跃还是二段跳跃,将跳跃按钮的回调函数设置为onJump:
emmm,这里实际上不是设置为onJump,因为一个游戏可能有多个操作,因此笔者分离出操作,新建operator节点,并在operator节点上挂了operator.js脚本,其内容如下:
cc.Class({
extends: cc.Component,
properties: {
m_player:{
default:null,
type:cc.Node //玩家
},
m_power:0, //当前能量值
m_changeStateNeedPower:0, //切换一次状态所需能量值
m_addPower:0, //得分一次获得的能量值
}
onClick:function(event,customData)
{
if(customData=="1") //跳跃
{
this.m_player.getComponent("player").onJump()
}
}
}
真正设为回调的是onClick,可以看到里面调用了主角的onJump函数。然后,需要把player节点传进来如:
好了,运行一下,看看跳跃和连续的二段跳跃是不是完成了?什么报错了?对,原因是this.flootY未定义。this.flootY是地板的高度,在player.js里面增加onload函数(ps:onload会被自动执行的哦):
onLoad () {
this.node.color=this.currState==0?new cc.Color(136,183,255):new cc.Color(240,139,175) //初始状态的颜色
this.flootY=this.node.y //因为一开始主角是站在地板上的,主角高度为地板高度
this.roleAni=this.node.getComponent(cc.Animation) //获取动画组件
this.run() //主角帧动画
}
看到了一个陌生的run函数?那就是上一篇完成的主角行走的帧动画:
run:function()
{
this.roleAni.play("run")
},
现在运行,不出意外主角已经可以1段跳跃和2段跳跃了。由于笔者是完成了游戏才写的教程,读者有问题可以留言提问。
那么,接下来切换状态,在player.js脚本中新增函数:
changeState:function() //切换状态
{
this.currState=this.currState==0?1:0
this.node.color=this.currState==0?new cc.Color(136,183,255):new cc.Color(240,139,175)
},
然后操作脚本里增加:
onClick:function(event,customData)
{
if(customData=="0") //切换状态
{
this.m_player.getComponent("player").changeState()
}
else if(customData=="1") //跳跃
{
this.m_player.getComponent("player").onJump()
}
}
把切换状态的按钮回调设置为:
注意传customEventData,跳跃的是1,切换状态为0。现在运行游戏,可以看到点击切换状态,主角的颜色会来回变化。