2017-04-02 4 views
0

Ich möchte den Pacman von seiner ursprünglichen Position neu starten, wenn es mit blinky kollidiert, das sich bewegt.Wie erstelle ich eine Kollision mit SpriteKit mit einem bereits erstellten SKSpriteNode?

Wie kann ich sie kollidieren lassen, wenn ich sie bereits erklärt habe?

Sie bewegen den Pacman, aber Blinky bewegt sich alleine. Ich möchte, dass es wie das Pacman-Spiel funktioniert.

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) 
} 

Antwort

0

Wenn iv bekam dieses Recht Sie Ihren „Blinky“ mögen, dass Ihre „Pacman“ folgen, dies zu tun würden Sie die Lage des Pacman zu erarbeiten haben dann eine SKAction zu Ihrem blinky hinzufügen zu dieser Position zu bewegen .

Probieren Sie etwas wie dieses

//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)) 
} 

Das Endergebnis wäre so etwas wie dieses

The end result would be something like this

bearbeiten sein:

Okay, ich aus Ihrer Frage denken Sie bereits haben "Blinky" Bewegen Sie wollen nur Kollisionen erkennen.

Zuerst müssen Sie die SKPhysicsContactDelegate Ihrer Klasse hinzuzufügen

public class PacmanScene: SKScene, SKPhysicsContactDelegate { 

Dann müssen Sie eine Kategorie Bitmaske in den sowohl die Sprites dann die Kollisionen in didBegin Griff (_ Kontakt: SKPhysicsContact) -Methode.

Was würde ich tun

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

Dann, wo Sie Pacman einrichten und Blinky legen Sie die Kategorie bitmask

//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 

Dann müssten Sie die didBegin implementieren (_ Kontakt: SKPhysicsContact) -Methode Um die Kollisionen zu behandeln

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 

    } 
} 

Hoffe, das hilft

Verwandte Themen