免责声明:我不是游戏开发商。 我编写与网络相关的东西以谋生,偶尔我做些有趣的游戏。 因此,请勿将其作为游戏开发指南,因为我可能做错了所有事情。
在习惯于Web开发的过程中,我通常尝试采用一种更具功能性的方法,因此我发现游戏开发既困难又怪异。 去年,我在《 Phaser 2》中玩了一些,之后又进行了辅导,还参加了Ludum Dare的参赛作品。 我发现体验还可以。 我很难用面向对象的方式来思考。 我还看到了某些通常被认为是错误模式的东西(例如全局变量或具有很多参数的函数),这些绝对对使开发人员感到愉悦无益。 并将其传递给您的回调! 像2014年的聚会。
因此,当我阅读有关Phaser 3的内容时,我感到非常兴奋,并且,在最近几天尝试之后,嗯……Phaser 2绝对更好,但我仍然不习惯那种编程范例。 而且,由于相对较新,因此相当缺乏文档和教程。
首先,我决定尝试设置一些基本的运动控制。 在我使用Phaser进行的其他几场游戏中,就像在网上找到的几乎每个示例一样,您都可以使用箭头键控制角色。 它非常容易编写代码,并且效果很好,并且甚至可以通过街机物理引擎获得加速和类似的东西。 但这会带来一个问题,如果您想在触摸设备上玩,我希望我的游戏可以在平板电脑上玩,而无需做大的工作或添加屏幕游戏手柄之类的丑陋事情。 因此,我决定尝试一个好方法,然后单击(或点击)控制系统。 应该很容易吧? 错误。
当使用箭头键控制角色时,运动的工作方式是实际上是在按下键的同时设置速度,并在释放键时将其重置为0。 您不在乎目的地。 像这样:
如果(leftKey){
this.body.setAccelerationX(-200)
} else if(rightKey){
this.body.setAccelerationX(200)
}其他{
this.body.setAccelerationX(0)
}
所以……我想发生的是角色以恒定的速度移动,直到到达我单击的位置为止(或直到它在路上找到障碍物,但以后会发生碰撞)。 仅将角色每帧移动n个像素就很诱人,但实际上我们不知道游戏以哪种帧速率执行。 经过更多的挖掘之后,我偶然发现了moveTo方法,这似乎正是我所要的。
this.input.on('pointerdown',指针=> {
this.physics.moveTo(this.survivor,pointer.downX,pointer.downY,速度)
})
但是之后…

因此,是的,正如文档中明确指出的那样, 显示对象到达目标坐标后就不会停止移动 。 所以现在我需要弄清楚如何停止角色。 由于moveTo设置了角色的速度,一旦到达目标,我要做的就是将其重置为0。 因此,我暂时存储了目的地,并在更新循环中继续检查角色是否已到达目的地。
// scene.js
this.input.on('pointerdown',指针=> {
this.survivor.setDestination(pointer.downX)
this.physics.moveTo(this.survivor,pointer.downX,pointer.downY,速度)
})
// survivor.js
setDestination(target){
this.target =目标
}
更新(){
如果(this.target){
const movingLeft = this.body.velocity.x <0
const movingRight = this.body.velocity.x> 0
如果(movingRight && this.body.x> = this.target ||
movingLeft && this.body.x <= this.target){
this.stop()
}
}
}
停 () {
this.body.velocity.x = 0
this.target = null
}

所以,是的,它起作用了,但是……这是最好的方法吗? 我还阅读了有关补间的内容 ,所以让我们看看这是否是更好的选择。 如果您不熟悉此概念,则补间(中间过渡的简称)是在两个图像或状态之间生成中间帧的过程。 因此,如果要将角色从其当前位置移动到单击的位置,我只需要添加一个补间,并根据需要覆盖的距离计算补间的持续时间(因为我不想如果角色行走50像素或500像素,则动画将花费相同的时间。 很简单:
this.input.on('pointerdown',指针=> {
const distance = Math.abs(this.survivor.body.x-pointer.downX)
const WalkingVelocity = 150
const持续时间=(距离/步行速度)* 100
this.tweens.add({
目标:这个幸存者,
x:pointer.downX,
持续时间
})
})
因此,补间似乎更简单。 只有一个问题:补间不是物理引擎的一部分。 这意味着角色将无法与障碍物碰撞,而无障碍的世界末日世界将是多么有趣。 因此,我将创建一个非常可怕的障碍,看看会发生什么。 我只是添加了另一个精灵对象,并将其设置为与幸存者相撞:

但是,如果我回到第一乐章…

即使有一种方法可以使对象与补间发生碰撞,但我认为仍然要坚持物理引擎处理与运动相关的所有事情,而将补间留给其他呈现性内容(如不透明度,颜色等)则更有意义。
我花了几个令人沮丧的时间尝试移动方块,但是我对这个过程感到非常满意。 现在,我对Phaser 3更加熟悉了,我有一个基本的运动系统,即使将来可能会改变它,也足以让我入门。