如何使用已创建的SKSpriteNode创建与SpriteKit的碰撞?

时间:2017-04-02 21:07:56

标签: swift sprite-kit collision skspritenode

我希望pacman从它原来的位置重新开始,当它碰到眨眼,那就是移动。

考虑到我已宣布它们,我怎么能让它们发生碰撞呢?

你移动了pacman,但是只有眨眼的动作。我希望它像pacman游戏一样工作。

  public class PacmanScene: SKScene {

let playerSpeed: CGFloat = 40.0
var pacman: SKSpriteNode?
var playerTextures: [SKTexture] = []
var lastTouch: CGPoint? = nil
var blinky: SKSpriteNode?
var clyde: SKSpriteNode?
var inky: SKSpriteNode?
var pinky: SKSpriteNode?
override public init(size: CGSize) {
let pacmanTexture = SKTexture(imageNamed: "pacman01.png")
    pacman = SKSpriteNode(texture: pacmanTexture)
    pacman?.name = "pacman"

    pacman?.position = CGPoint(x:30, y:30)
    pacman?.zPosition = 1.0
    pacman?.physicsBody = SKPhysicsBody(texture: pacmanTexture, size: CGSize(width: (pacman?.size.width)!, height: (pacman?.size.height)!))
    pacman?.physicsBody?.allowsRotation = true
    pacman?.physicsBody?.affectedByGravity = false
    pacman?.physicsBody?.mass = 2
 let blinkyTexture = SKTexture(imageNamed: "blinky.png")
    blinky = SKSpriteNode(texture: blinkyTexture)
    blinky?.name = "blinky"

    blinky?.position = CGPoint(x: 15, y: 60)
    blinky?.zPosition = 1.0
    blinky?.physicsBody = SKPhysicsBody(texture: pacmanTexture, size: CGSize(width: (blinky?.size.width)!, height: (blinky?.size.height)!))
    blinky?.physicsBody?.allowsRotation = false
    blinky?.physicsBody?.affectedByGravity = false
    blinky?.physicsBody?.mass = 1000

    super.init(size: size)
    addChild(pacman!)
    addChild(blinky!)

   override public func didMove(to view: SKView) {

    let bmoveUp = SKAction.moveBy(x: 0, y: 450, duration: 4.0)

    let bmoveRight = SKAction.moveBy(x:20, y:0, duration: 1.0)

    let bmoveDown = SKAction.moveBy(x:0, y: -450, duration: 4.0)

   let bmoveLeft = SKAction.moveBy(x:-20, y:0, duration: 1.0)


    let bsequence = SKAction.sequence([bmoveUp, bmoveRight, bmoveDown, bmoveLeft])

    let bendlessAction = SKAction.repeatForever(bsequence)
    blinky?.run(bendlessAction)
 }

1 个答案:

答案 0 :(得分:0)

如果你做对了,你想要你的" blinky"关注你的" pacman"要做到这一点你必须找出pacman的位置,然后在你的blinky上添加一个SKAction来移动到那个位置。

尝试这样的事情

//Speed blinky moves
let blinkySpeed = 100

override func update(_ currentTime: TimeInterval) {
    // Called before each frame is rendered
    updateBlinky()
}

func updateBlinky() {
    //Set the point that blinky moves to
    let point = CGPoint(x: pacman.position.x, y: pacman.position.y)
    //Get the distance its got to travel
    let distance = distanceBetweenPoints(first: pacman.position, second: blinky.position)
    //Get the time is got to take from the speed and distance
    let time = distance / blinkySpeed
    //Create and run the action
    let action = SKAction.move(to: point, duration: TimeInterval(time))
    blinky.run(action)
}

//work out the distance between the sprites
func distanceBetweenPoints(first: CGPoint, second: CGPoint) -> Int {
    return Int(hypot(second.x - first.x, second.y - first.y))
}

最终结果将是这样的

The end result would be something like this

编辑:

好的,我想从你的问题中你已经有了" blinky"移动你只想检测碰撞。

首先,您需要将SKPhysicsContactDelegate添加到您的班级

public class PacmanScene: SKScene, SKPhysicsContactDelegate {

然后你需要为两个精灵添加一个类别位掩码,然后处理didBegin(_ contact:SKPhysicsContact)方法中的冲突。

我会做什么

//Create Physics category struct
struct PhysicsCategory {
    static let pacman : UInt32 = 0x1 << 1
    static var blinky : UInt32 = 0x1 << 2
}

然后在你设置pacman和blinky的地方设置类别位掩码

//Set the category bit mask for pacman
pacman?.physicsBody?.categoryBitMask = PhysicsCategory.pacman
//Set what categories you want to test contact
pacman?.physicsBody?.contactTestBitMask = PhysicsCategory.blinky
//Set what categories you want to collide with each other
pacman?.physicsBody?.collisionBitMask = PhysicsCategory.blinky

//Set the category bit mask for blinky
blinky?.physicsBody?.categoryBitMask = PhysicsCategory.blinky
//Set what categories you want to test contact
blinky?.physicsBody?.contactTestBitMask = PhysicsCategory.pacman
//Set what categories you want to collide with each other
blinky?.physicsBody?.collisionBitMask = PhysicsCategory.pacman

然后你需要实现didBegin(_ contact:SKPhysicsContact)方法来处理碰撞

func didBegin(_ contact: SKPhysicsContact) {
    //Work out which contact was pacman
    let other = contact.bodyA.categoryBitMask == PhysicsCategory.pacman ? contact.bodyB : contact.bodyA
    //Test what it hit
    switch other.categoryBitMask {

        case PhysicsCategory.blinky:
            print("pacman hit blinky")
            //Move pacman
            pacman?.position = CGPoint(x:30, y:30)

        default:
        break

    }
}

希望这有帮助