接上文,设置好人物以及地面的刚体后,下一步是让人物动起来。
设置键盘监听:
// 设置键盘监听
cc.systemEvent.on(cc.SystemEvent.EventType.KEY_DOWN, this.onKeyPressed, this);
cc.systemEvent.on(cc.SystemEvent.EventType.KEY_UP, this.onKeyReleased, this);
获取节点上的刚体组件:
// 获得节点上的刚体组件
this.heroRigidBody = this.node.getComponent(cc.RigidBody);
当键盘按下时:
onKeyPressed: function(event) {
let keyCode = event.keyCode;
if (this.state != STATE.DEAD)
{
switch(keyCode) {
// 向左走
case cc.macro.KEY.a:
this.direction = -1;
break;
// 向右走
case cc.macro.KEY.d:
this.direction = 1;
break;
}
}
},
当键盘弹起时:
onKeyReleased: function (event) {
let keyCode = event.keyCode;
if (this.state != STATE.DEAD)
{
switch(keyCode) {
case cc.macro.KEY.a:
case cc.macro.KEY.d:
this.direction = 0;
break;
}
}
},
通过以上步骤设置好人物移动的flag后,在update中进行判定:
update (dt) {
// 如果没有按下左键或者右键
if (this.direction != 0) {
this.on_player_walk(this.direction);
}
},
on_player_walk这个函数如下:
MOVE_SPEED需要在参数列表中定义,大小需要根据刚体的gravity(重力)、Friction(摩擦力)自行调整,一般在100~500之间比较合适。
on_player_walk: function(dir) {
// 取得之前获得的刚体组件的线速度
var v = this.heroRigidBody.linearVelocity;
// 改变其x方向的速度
v.x = this.MOVE_SPEED * dir;
// 将改变后的线速度赋值回去
this.heroRigidBody.linearVelocity = v;
// 这里是为了改变人物的面部朝向
this.node.scaleX = -dir;
},
值得注意的是,刚体不会受到setPosition()的影响,所以需要通过改变刚体的速度方式来移动。
除此之外,还可以使用cc.moveTo,cc.moveBy,cc.place等进行移动。
推荐一篇文章,该文章中详细说明了ccc的物理引擎以及碰撞回调,值得阅读:
https://www.write-bug.com/article/1807.html
此处你的人物应该可以进行左右移动了,下面我们让他能够跳跃:
在上述 的onKeyPressed中加入下面这几行代码:
on_player_jump 如下:
和人物的移动类似,此处我们改变刚体y方向的速度,jumpHeight参数也需要自行在参数列表中定义,大小需要随着gravity的改变而改变(重力越大,下落越快,跳的也更低),一般在500~1000
本篇文章中用到的代码参考了B站某教学视频(忘记是哪个了,如果需要加上出处,请联系我)。
希望大佬们多多留言,你们的留言是我写作的动力!