OGeek|极客世界-中国程序员成长平台

标题: ios - 使用 SpriteKit 和内置物理引擎移动和跳跃 Sprite [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-12 10:49
标题: ios - 使用 SpriteKit 和内置物理引擎移动和跳跃 Sprite

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

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

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

我现在是这样的:屏幕分为三个部分,最左边是后退,中间是跳跃,最右边是前进。点击任一侧时,我将 bool _movingForward/_movingBackward 设置为适当的值。在 update-loop 中,我通过将 dx 速度增加/减少 +/- 15 来更改 sprite 向前/向后速度。如果速度大于 ma​​xVelocity,我将其设置为 最大速度。然后我通过

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

如果 _movingForward_movingBackward 都不为真,我将 降低/增加 速度到 0.0 到 +/- 4.0 到dx 速度,使其静止。但是,这感觉很重,我注意到物理引擎会自动带走一些速度,就好像有摩擦或其他东西一样。有没有更好的方法来做到这一点?最好只使用物理引擎。

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

对 Sprite 施加脉冲
CGVectorMake(0.0f, 200.0f);

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

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

提前致谢!

编辑 1:短版:

如何使用 SpriteKit 中的内置物理引擎根据用户输入进行 Sprite 移动和跳跃。



Best Answer-推荐答案


好,但很长,问题!

Apple 为我们提供了一种将相机对准玩家的绝妙方法。你可以在这里阅读:apple docs .基本上,发生的事情是您可以指定您希望相机移动的字符位置的哪些值。换句话说,如果您的角色水平移动,您可以让相机始终跟随角色移动(因此使角色出现在屏幕中间)。您还可以指定如果他跳起来,相机不需要垂直跟随他(尽管如果您愿意,可以阅读文档!)。

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

我还建议将跳跃作为一种冲动来实现。在 Sprite 上添加一个恒定的重力,降低它的摩擦力,这样它就不会影响它的速度,当你需要角色跳起来时,通过执行 [sprite.physicsBody applyImpulse:CGVectorMake (dx,dy)]。通过这种方式,在很短的时间内施加了一股力量,使角色看起来像是在跳跃。施加脉冲时,您可以将 canJump 设置为 NO 并等待 Sprite 的 y 位置通过重力返回到 100 以下(或地面所在的任何位置) .

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

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






欢迎光临 OGeek|极客世界-中国程序员成长平台 (http://ogeek.cn/) Powered by Discuz! X3.4