SKPhysics 与 Swift 和 SpriteKit

Posted

技术标签:

【中文标题】SKPhysics 与 Swift 和 SpriteKit【英文标题】:SKPhysics with Swift and SpriteKit 【发布时间】:2014-10-09 09:59:18 【问题描述】:

我正在尝试使用 Swift 编程语言创建一个 ios 游戏。 我想在屏幕上使用滑动手势让角色(玩家)上下左右移动

到目前为止一切顺利。但我想要一些物理。我希望播放器与屏幕边缘发生碰撞。 (后来我希望它与其他东西发生碰撞,但我需要先知道代码;)

问题:如何识别 2 个对象(玩家和屏幕边缘)之间的碰撞

   import SpriteKit

class GameScene: SKScene, SKPhysicsContactDelegate 

var player:SKSpriteNode = SKSpriteNode()
let moveUp = SKAction.moveByX(0, y:2000, duration:10.0) //it is set to 2000 because I want to see if it collides with the edge of the screen
let moveDown = SKAction.moveByX(0, y: -200, duration: 2.0)




// Define the bitmasks identifying various physics objects
let worldCategory:UInt32 = 0x1 << 0
let playerCategory:UInt32 = 0x1 << 1




override func didMoveToView(view: SKView) 





override init(size:CGSize) 
    super.init(size: size)
    self.backgroundColor = SKColor.whiteColor()
    player = SKSpriteNode(imageNamed: "Kundvagn1")
    player.position = CGPointMake(self.frame.size.width/2, player.size.height/2 + 20)
    self.addChild(player)


    player.runAction(moveUp)


    self.physicsWorld.gravity = CGVectorMake(0, 0)
    self.physicsWorld.contactDelegate = self




    player.physicsBody = SKPhysicsBody(rectangleOfSize: player.size)
    player.physicsBody?.dynamic = true //I dont think the question marks should be there, but Xcode doesn´t accept the code if there is no question marks there
    player.physicsBody?.categoryBitMask = playerCategory
    player.physicsBody?.contactTestBitMask = worldCategory
    player.physicsBody?.collisionBitMask = 0
    player.physicsBody?.usesPreciseCollisionDetection = true







func didBeginContact(contact: SKPhysicsContact!) 
    println("Collision")

【问题讨论】:

【参考方案1】:

假设您希望左右边缘遮挡,只需将两个SKShapeNode 矩形对象添加到您的场景中,将它们的高度设置为屏幕高度,并将它们放置在屏幕左右边缘之外。设置他们的物理体,你应该很高兴。

如果您希望屏幕的所有边缘都成为边界,则需要为您的场景设置一个基于线的物理体,详见此处:Add boundaries to an SKScene

【讨论】:

【参考方案2】:

我添加了这个,以防您需要 jonogilmour 的说明中的代码示例。在 viewController 中打开 ShowsPhysics = true 以查看物理。两边都应该是蓝色的。当然,如果您想要联系通知,您可以使用您的位掩码内容添加到此代码中。希望这会有所帮助!

 var leftEdge = SKNode()
    leftEdge.physicsBody = SKPhysicsBody(edgeFromPoint: CGPointZero, toPoint: CGPointMake(0.0, self.size.height))
    leftEdge.position = CGPointZero;
    self.addChild(leftEdge)

    var rightEdge = SKNode()
    rightEdge.physicsBody = SKPhysicsBody(edgeFromPoint: CGPointZero, toPoint: CGPointMake(0.0, self.size.height))
    rightEdge.position = CGPointMake(self.size.width, 0.0);
    self.addChild(rightEdge)

【讨论】:

我没有使用 rect 但 edgeFromPoint 它似乎适合手头的工作。

以上是关于SKPhysics 与 Swift 和 SpriteKit的主要内容,如果未能解决你的问题,请参考以下文章

可选展开 SKPhysics 错误

具有相同 SKPhysics 身体对象的多个精灵

用 SKPhysics(碰撞)拖动一个 SKSpriteNode(跟随你的手指动作)

SKPhysics体路径生成器

SKPhysics 到达某个位置后关闭 isDynamic

css sprit css