SpriteKit 物理:如何让玩家精灵跟随(倾斜的)地面

SpriteKit physics: How to make a player sprite follow the (sloped) ground

我正在用 SpriteKit 创建一个 tilemap 平台游戏。我为所有地砖的物理体分配了碰撞路径,并使它们成为非动态的。我为玩家分配了两个碰撞多边形:底部的圆形和顶部的矩形。

玩家精灵在屏幕上的位置固定,而关卡从右向左滚动。现在,只要玩家精灵在平坦的地面上,碰撞就会完美运行,玩家就会在地面上行走。但是,我也有一些我希望玩家跟随的倾斜地形图块(例如,走上坡路)。但是当玩家到达倾斜的方块时,他只是从上面弹开,无法 "climb" 它。

同样,当我将玩家从上方放到倾斜的瓷砖上时,他会滑下 "hill",而不是留在原地。

我将恢复和摩擦都设置为 0。

那么我怎样才能让玩家精灵跟随地面而不管它的形状,我怎样才能让玩家停留在倾斜的瓷砖上而不是滑下来?

我尝试使用 SKConstraints 并将 positionX 设置为常量值。起初它似乎有效,但后来玩家被卡在倾斜的瓷砖中间并最终掉下去了。

我还在播放器上尝试了不同形状的碰撞多边形(例如底部的矩形而不是圆形),但没有任何改变。

感谢任何帮助!

这是一个瓦片地图平台游戏...

那么重力就不重要了,把重力调到一个很低的值,然后改变你所有的跳跃冲动等等与重力变化的关系...

或者,

可能,如果游戏不是随机生成的,您可以设置一个 uibezierpath,如果他停止上山,则关闭该路径。

但是如果他停在半山腰或者从山顶开始,他还是会滑下去...

增加摩擦力(不将其设置为 0)可能会有所帮助。在 1 处尝试摩擦力?

这更多地与您的游戏逻辑有关,而不是您的地图属性。您的播放器需要有几个 "states"。例如,如果您的播放器处于空闲状态,您可以将 CGVector 设置为 0,0。这将阻止玩家向任何方向移动。

举几个运动的例子。假设您想让您的对象向右移动:

// move node's physics body to the right while leaving vertical movement as is
// 160 is just an example
myNode.physicsBody.velocity = CGVectorMake(160, self.physicsBody.velocity.dy);

// do not allow right movement to exceed 160
if(myNode.physicsBody.velocity.dx > 160)
    myNode.physicsBody.velocity = CGVectorMake(160, self.physicsBody.velocity.dy);

要向左移动,请反转 dx 值:

myNode.physicsBody.velocity = CGVectorMake(-160, self.physicsBody.velocity.dy);

if(myNode.physicsBody.velocity.dx < -160)
    myNode.physicsBody.velocity = CGVectorMake(-160, self.physicsBody.velocity.dy);

允许 myNode 受重力影响,并且在下坡时应保持与地面接触。