ios - SpriteKit 物理 : How to make a player sprite follow the (sloped) ground

标签 ios swift sprite-kit collision skphysicsbody

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

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

screenshot

类似地,当我将玩家从上方放到倾斜的方 block 上时,他会滑下“山丘”,而不是留在原地。

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

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

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

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

感谢任何帮助!

最佳答案

这更多地与您的游戏逻辑有关,而不是您的 map 属性。您需要为您的播放器设置多个“状态”。例如,如果您的播放器处于空闲状态,您可以将 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 受到重力的影响,并且它在下坡时应保持与地面接触。

关于ios - SpriteKit 物理 : How to make a player sprite follow the (sloped) ground,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30373513/

相关文章:

ios - 如何在 Xcode Interface Builder 中显示占位符背景?

ios - UILocalnotification 在 iOS7 中不显示

ios - 原型(prototype) tableviewcell 内的 UIPickerView 没有选择指示器

ios - 使用 Apple 的 Reachability 在 Swift 中检查远程服务器的可达性

swift - 雪碧包 : How do you call touches began & in touches separately?

ios - SKPhysics : Made a rope, 为什么会坏?

ios - 页面 View 导航栏标题

xcode - 使用 Cocoapods 时 Xcode 7.3 中的奇怪错误

ios - 为视网膜显示创建具有抗锯齿功能的圆圈或圆盘

ios - 让玩家双跳 Sprite Kit Swift