我目前正在为iOS开发平台游戏,并决定使用SpriteKit。

我经历过this platforming game tutorial,但是我想使用内置的物理引擎而不是自己制作。我已经在网上搜索了好几天,却找不到关于如何使用SpriteKit创建具有跳跃和移动性的平台游戏的优秀教程,因此我决定在这里提出问题。我也尝试了许多不同的实现,但是它们都“感觉”错误。运动或跳跃有问题,或者多数情况下两者都有。

那么,使精灵在屏幕上移动和跳跃的最佳方法是什么?在经典的平台游戏风格中,我希望“相机”在沿x轴移动时跟随精灵。最好的方法是更改​​精灵的x值,然后立即将背景居中放置在精灵上吗?还是只是移动背景?以及如何获得良好的动态运动?现在感觉非常沉重,物理引擎在同时跳跃和前进/后退时会干扰运动。我该如何跳?我只想设置跳跃高度的单人跳。但是,当精灵第一次接触地面时,我希望能够执行第二次跳跃(即使在弹跳时),并达到相同的高度。

我现在所拥有的是:屏幕分为三个部分,最左边是用于向后移动,中间是用于跳跃,最右边是用于向前移动。轻按任一侧时,我将 bool _movingForward / _movingBackward 设置为适当的值。在更新循环中,我通过将 dx速度增加/降低+/- 15 来更改精灵的前进/后退速度。如果速度大于 maxVelocity ,则将其设置为最大速度。然后我将精灵速度设置为

_sprite.physicsBody.velocity = CGVectorMake(forwardVel, _sprite.physicsBody.velocity.dy);

如果 _movingForward _movingBackward 都不成立,则我的速度降低/增加dt速度的0.0 +/- 4.0,以使其静止。但是,这感觉很沉重,我注意到物理引擎会自动消除一些速度,就好像有摩擦或其他东西一样。有更好的方法吗?最好仅使用物理引擎。

跳跃也是如此。点击屏幕的中间部分时,我将 bool _isJumping 设置为YES。在更新循环中,如果 _isJumping 为YES且 dy速度为0 ,则对具有
CGVectorMake(0.0f, 200.0f);

感觉不错,但是问题是在我可以执行第二次跳转之前,精灵必须完全静止。我希望精灵在碰到地面后能够立即执行第二次跳跃,即使它反弹了一点。但是,我不希望这导致子画面比上一次跳得更高。

我知道我的问题很广泛,但是对于我的更新循环应该是什么样的基本代码示例,以及有关可以用来实现这种效果的内置方法和函数的一些技巧,将不胜感激!我是gamedev的新手,如果这是非常基本的内容,我们深感抱歉。

提前致谢! :)

编辑1:简短版本:

我如何使用SpriteKit中的内置物理引擎使Sprite随用户输入而移动和跳跃。

最佳答案

很好,但是很长的问题!

Apple为我们提供了一种将相机对准播放器中心的好方法。您可以在这里阅读有关信息:apple docs。基本上,会发生什么,您可以指定希望摄像机移动到哪个字符位置值。换句话说,如果角色水平移动,则可以使摄像机始终在角色之后移动(因此使角色出现在屏幕中间)。您还可以指定如果他跳起来,则相机不需要垂直跟随他(尽管您愿意,也可以阅读文档!)。

要检查播放器是否在地面上,可以在update方法中设置一个canJump的布尔值。例如,if (sprite.position.y < 100) canJump = YES。当然,您必须检查与地面对应的位置,并添加一个点使其更平滑。如果您的角色从地面弹跳(并且您不希望它反弹),则可以更改其.physicsBody.restituion属性,该属性基本上是其弹跳性。如果将属性设置为0,则精灵在降落后不会弹回。

我还建议将跳跃作为冲动来实施。在精灵上施加恒定的重力,降低其摩擦力,以使其不影响其速度,并且当您需要角色跳跃时,通过执行[sprite.physicsBody applyImpulse:CGVectorMake(dx,dy)]向PhysicalBody施加脉冲。这样,在较短的时间范围内就会施加一阵力,使角色看起来像跳跃一样。施加脉冲后,可以将canJump设置为NO,并等待重力将精灵的y位置返回到100以下(或地面处于的任何位置)。

对于前进和后退,您的方法很好。当_movingForwardTRUE时,您可以使速度为具有x正值的向量,反之亦然。

关于ios - 使用SpriteKit和内置的物理引擎移动和跳跃 Sprite ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24787425/

10-11 14:56