如何将SKPhysicsBody应用于贝塞尔曲线?

时间:2016-05-29 17:57:37

标签: swift sprite-kit

我正在创造一个摩托车越野赛游戏,我有一个弯曲的地面,玩家应该开车。我创建地面的代码如下所示:

    let path = UIBezierPath()
    let startPoint = CGPoint(x: 0.0, y: self.playerCamera.position.x + 50)
    let endPoint = CGPoint(x: self.frame.width, y: self.playerCamera.position.x + 50)

    path.moveToPoint(startPoint)
    path.addCurveToPoint(endPoint, controlPoint1: CGPoint(x: 200.0, y: 100), controlPoint2: CGPoint(x: 400.0, y: -100))


    let myShape = SKShapeNode()
    myShape.path = path.CGPath
    myShape.lineWidth = 20


    myShape.physicsBody = SKPhysicsBody(edgeLoopFromPath: path.CGPath)
    myShape.physicsBody?.categoryBitMask = CollisionCategories.Ground
    myShape.physicsBody?.contactTestBitMask = CollisionCategories.Player

    myShape.physicsBody?.dynamic = false
    myShape.physicsBody?.affectedByGravity = false
    myShape.physicsBody?.allowsRotation = false


    self.addChild(myShape)

我的问题是,玩家在曲线上行驶,好像它是一个矩形而不是跟随曲线。

如何将实际曲线或路径应用为PhyicsBody?

3 个答案:

答案 0 :(得分:1)

<强> SOLUTION:

我认为没有工具的帮助就不可能做到这一点。

请看一下:http://avionicsdev.esy.es/article.php?id=13&page=1

<强> TOOL:

您可以使用此工具达到预期效果:

http://insyncapp.net/SKPhysicsBodyPathGenerator.html

“这个工具将让我们绘制路径,然后返回代码,帮助我们将该路径绘制到Xcode中”(摘自第一个链接)

<强>方法:

您可能需要屏蔽UIBezierPath并将其转换为Sprite,但我不确定是否有必要。看看该工具的解释。

解决方案2:

更改游戏引擎。

在我看来,您或许可以找到实现目标的方法,但这不是一个简单而直接的解决方案。另一方面,其他游戏引擎更完整,应该为您提供所需的一切,而无需使用“技巧”来达到您想要的效果。

我希望我错了,SpriteKit确实比那更完整,但看起来并不像。

使用Unity而不是SpriteKit。

SpriteKit非常适合相对简单的游戏,但它有一定的局限性,你刚刚找到它。

Unity是一款功能齐全的游戏引擎,可以更好地满足您的需求。

或者看看Cocos2D:http://cocos2d.spritebuilder.com/如果你想继续使用Swift(你可能需要学习C#才能使用Unity)。

答案 1 :(得分:1)

我认为,如果没有第三方工具,我们就可以做到这一点。这段代码可能不是很漂亮或者你最引以为豪的东西,但它很容易和快速。

两个步骤。首先,将贝塞尔曲线转换为纹理: func texture(来自节点:SKNode) - &gt; SKTexture? https://developer.apple.com/reference/spritekit/skview/1520114-texture

然后,将纹理转换为物理实体: init(纹理:SKTexture, 尺码:CGSize) https://developer.apple.com/reference/spritekit/skphysicsbody/1519690-init

答案 2 :(得分:-1)

我认为你可以在任何引擎中创建任何类型的游戏,它的统一性无关紧要cocos2d cocos2dx sprite kit虚幻引擎spritekit。 spritekit是游戏的全功能引擎,可以查看这些方法

  • bodyWithTexture:尺寸:
  • bodyWithTexture:alphaThreshold:尺寸:

创建一个锯齿形山纹理并应用其中一种方法现在你可以看到一个弯曲路径的山体现在深呼吸,想想摩托车如何爬上山坡并上下移动解决方案是创建一个基于联合的自行车在其中施加扭矩力。