使用SpriteKit和内置物理引擎移动和跳跃精灵

时间:2014-07-16 17:48:29

标签: ios objective-c sprite-kit game-physics

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

我已经通过了this platforming game tutorial,但我想使用内置的物理引擎而不是自己创建。我已经在网上搜索了好几天没有找到关于如何使用SpriteKit创建跳跃和移动平台游戏的好教程,所以我决定在这里问一下。我也尝试了很多不同的实现,但他们都感觉到了#34;错误。运动,跳跃或最常见的问题都是。

那么让精灵移动并在屏幕上跳跃的最佳方法是什么?在经典的平台游戏风格中,我想要的是#34;相机"沿x轴移动时跟随精灵。最好的方法是改变精灵的x值,然后立即将精灵的背景居中?或者只是移动背景?我如何获得良好的动态运动?现在感觉非常沉重,物理引擎在跳跃和同时向前/向后移动时会干扰运动。我怎么去跳?我只想要单跳,设置跳跃高度。然而,当精灵第一次接触地面时,我希望能够进行第二次跳跃(即使它弹跳),并达到相同的高度。

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

设置精灵速度
_sprite.physicsBody.velocity = CGVectorMake(forwardVel, _sprite.physicsBody.velocity.dy);

如果 _movingForward _movingBackward 都不为真,我速度降低/增加为0.0 + + - 4.0 dx速度,使其静止不动。然而,这感觉非常沉重,而且我注意到物理引擎会自动消除一些速度,好像有摩擦或其他东西。有没有更好的方法呢?最好只使用物理引擎。

跳跃也是如此。当点击屏幕的中间部分时,我将 bool _isJumping 设置为YES。在更新循环中,如果 _isJumping 为YES且 dy速度为0 ,我会使用

对精灵施加一个冲动
CGVectorMake(0.0f, 200.0f);

这感觉很好,但问题是精灵需要完全静止才能进行第二次跳跃。我希望精灵能够在接触地面时立即执行第二次跳跃,即使它有点反弹。但是,我不希望这会导致精灵跳得比上次更高。

我知道我的问题非常广泛,但是我的更新循环应该是什么的一些基本代码示例,以及关于我可以用来实现此效果的内置方法和函数的一些提示将非常感谢!我对gamedev很新,所以如果这是非常基本的话,我很抱歉。

提前致谢! :)

编辑1:短篇版本:

如何使用SpriteKit中的内置物理引擎,以便在用户输入时使精灵移动和跳跃。

3 个答案:

答案 0 :(得分:2)

好,但很长,问题!

Apple为我们提供了一种将相机置于播放器中心的极佳方式。你可以在这里阅读:apple docs。基本上,您可以指定您希望相机移动的字符位置的值。换句话说,如果角色水平移动,则可以使角色始终在角色后移动(从而使角色出现在屏幕中间)。您还可以指定如果他跳起来,相机不需要垂直跟随他(尽管如果您愿意,也可以阅读文档!)。

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

我还建议将跳跃作为一种冲动来实现。在精灵上添加恒定的重力,降低其摩擦力,使其不影响速度,当你需要角色跳起时,通过[sprite.physicsBody applyImpulse:CGVectorMake(dx,dy)]对物理身体施加冲动。这样,在很短的时间内施加一阵力,使角色看起来像跳跃。当施加脉冲时,你可以将canJump设置为NO并等待精灵的y位置通过重力返回到100以下(或你的地面所处的位置)。

为了前进和后退,你的方法很好。虽然_movingForwardTRUE,但您可以将速度设为具有正x幅度的向量,反之亦然。

答案 1 :(得分:0)

答案 2 :(得分:0)

我认为精灵套件中的平台游戏非常简单

尝试精灵套件碰撞系统来控制你的英雄的跳跃

假设你的游戏中有serval平台设置了那些平台的碰撞掩码和接触掩码现在sprite kit为你提供了控制物理的所有方法

  • (void)didBeginContact:(SKPhysicsContact *)联系 }

当两个物理体相互接触时调用(预解函数调用)

  • (void)didEndContact:(SKPhysicsContact *)联系 { }

当两个物理体相互接触时调用(后解决函数调用)

所以当你对一个身体施加冲动并将_jump设置为true时检查前或后并设置跳跃错误清除所有对你有魅力的力量