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

3
我当前正在为iOS开发一个平台游戏,并决定使用SpriteKit。
我已经完成了这个平台游戏教程,但我想使用内置的物理引擎而不是自己制作。我已经在网上搜索了几天,但没有找到一个关于如何使用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中的内置物理引擎使精灵根据用户输入移动和跳跃。

请缩小您的帖子范围,提出一个具有足够上下文(例如代码)的特定问题,以便理解您尝试做什么或其中的哪个子问题阻碍了您的进展。请专注于阻止您继续前进的一个子问题。 - undefined
3个回答

2

很好,但是问题有点长!

苹果公司为我们提供了一个巧妙的方法来将摄像头对准玩家。您可以在此处阅读相关信息:苹果文档。基本上,您可以指定角色位置的哪些值时需要移动摄像头。换句话说,如果您的角色水平移动,您可以使摄像头始终在角色后面移动(因此使角色出现在屏幕中央)。您还可以指定如果他跳起来,摄像头不需要垂直跟随他(尽管您可以选择这样做,请阅读文档!)。

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

我还建议将跳跃实现为冲量。在精灵上添加一个恒定的重力力量,降低其摩擦力以使其不影响速度,当您需要角色向上跳跃时,通过[sprite.physicsBody applyImpulse:CGVectorMake(dx,dy)]对物理体施加一个冲量。这样,一小段时间内施加了一股力量,使角色看起来像是在跳跃。当施加冲量时,您可以将canJump设置为NO并等待精灵的y位置再次被重力返回到100以下(或者您的地面所在位置)。

对于前进和后退,您的方法是正确的。当_movingForwardTRUE时,您可以将速度设为具有一些正x幅度的向量,反之亦然。


0

是的,那就是我在帖子中链接的教程。那是一个很棒的教程,但问题是他们正在制作自己的物理引擎。我更愿意使用内置于SpriteKit中的物理引擎 :) - undefined

0

我认为使用SpriteKit进行平台游戏开发相当容易。

尝试使用SpriteKit的碰撞系统来控制你的英雄跳跃。

假设你的游戏中有几个平台,设置这些平台的碰撞掩码和接触掩码,现在SpriteKit提供了所有这些方法来控制你的物理效果。

  • (void)didBeginContact:(SKPhysicsContact *)contact}

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

  • (void)didEndContact:(SKPhysicsContact *)contact { }

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

所以当你给一个物体施加冲量并将_jump设置为true时,检查预处理或后处理,并将jump设置为false,清除所有的力量,这将非常有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接