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

时间:2015-05-21 12:17:03

标签: ios swift sprite-kit collision skphysicsbody

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

玩家精灵在屏幕上有一个固定的位置,而等级从右向左滚动。现在,只要玩家精灵在平地上,碰撞就能完美地运行,玩家就会在地面上行走。但是,我也有一些倾斜的地形砖,我希望玩家遵循(例如,走上坡路)。但是当玩家到达倾斜的瓷砖时,他只是从它上面反弹,无法“攀爬”它。

screenshot

同样,当我从倾斜的瓷砖上方放下玩家时,他会从“山丘”上滑下来,而不是保持原位。

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

那么我怎样才能让玩家精灵跟随地面而不管它的形状如何?如何让玩家留在斜坡上而不是向下滑动呢?

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

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

感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

这更多地与您的游戏逻辑有关,而不是您的地图属性。你需要为你的玩家提供几种“状态”。例如,如果您的播放器处于空闲状态,则可以将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受到重力的影响,当它沿着斜坡移动时,它应该保持与地面接触。

答案 1 :(得分:0)

这是一个平铺地图平台游戏......

然后重力并不重要,将重力放到一个非常低的值,然后改变你跳跃的所有冲动,这与重力的变化有关......

OR,

可能,如果游戏不是随机生成的,你可以设置一条uibezier路径,如果他不再向山上移动,就把路径关掉。

但是如果他停在山中或从顶部开始,他仍会滑下来......

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

处摩擦