我已经完成了这个平台游戏教程,但我想使用内置的物理引擎而不是自己制作。我已经在网上搜索了几天,但没有找到一个关于如何使用SpriteKit创建具有跳跃和移动功能的平台游戏的好教程,所以我决定在这里提问。我也尝试了许多不同的实现方式,但它们都感觉“不对”。要么运动有问题,要么跳跃有问题,或者最常见的两者兼而有之。
那么,在屏幕上让精灵移动和跳跃的最佳方法是什么?在经典的平台游戏风格中,我希望“相机”在沿着x轴移动时跟随精灵。最好的方法是改变精灵的x值,然后立即将背景居中于精灵吗?还是只移动背景?如何使运动看起来流畅?现在感觉非常笨重,物理引擎会干扰跳跃和同时向前/向后移动的运动。跳跃应该怎么做?我只想要单次跳跃,有一个固定的跳跃高度。但是,当精灵第一次接触地面时,我想能够执行第二次跳跃(即使它正在弹跳),并达到同样的高度。
我现在拥有的是这样的:屏幕分为三个部分,最左边的是向后移动,中间的是跳跃,最右边的是向前移动。当点击任意一侧时,我将一个布尔变量 _movingForward/_movingBackward 设置为相应的值。在 update-loop 中,通过增加/减少 dx 速度 +/- 15 来改变精灵的前进/后退速度。如果速度大于一个 maxVelocity,则将其设置为该 max velocity。然后我通过设置精灵的速度来控制它。
_sprite.physicsBody.velocity = CGVectorMake(forwardVel, _sprite.physicsBody.velocity.dy);
如果既不是_movingForward也不是_movingBackward为真,我会通过将速度增加/减少4.0到dx速度的方式将速度降至0.0,使其停止。然而,这种方法感觉非常笨重,我注意到物理引擎会自动减少一些速度,就像有摩擦力一样。有没有更好的方法?最好只使用物理引擎。
对于跳跃也是同样的道理。当点击屏幕中间部分时,我将一个名为_isJumping的布尔变量设置为YES。在更新循环中,如果_isJumping为YES并且dy速度为0,我会向精灵施加一个冲量。
CGVectorMake(0.0f, 200.0f);
这感觉很好,但问题在于精灵在执行第二次跳跃之前需要完全静止。我希望精灵能够在接触地面时立即执行第二次跳跃,即使它在弹跳一点。但是,我不希望这会导致精灵比上一次跳得更高。
我知道我的问题非常广泛,但是一些基本的代码示例,以及一些关于我可以使用哪些内置方法和函数来实现这种效果的提示将不胜感激!我对游戏开发还很陌生,所以如果这很基础,我很抱歉。
提前感谢! :)
编辑1:简短版本:
如何使用SpriteKit中的内置物理引擎使精灵根据用户输入移动和跳跃。