碰撞检测Swift

碰撞检测Swift

问题描述:

我试图做一个游戏,蠕虫在屏幕上移动并在每次触摸时旋转并吃苹果。我很难编码蠕虫和苹果之间的碰撞检测。我需要它,以便当蠕虫在Apple上方时,Apple节点随机产生其他地方。碰撞检测Swift

这里是我的代码:

// 
// GameScene.swift 
// Final Project 
// 
// Created by Adam Hackett on 2015-10-22. 
// Copyright (c) 2015 Adam Hackett. All rights reserved. 
// 

import SpriteKit 
import AVFoundation 

var movingDirection = "left" 

let worm = SKSpriteNode(imageNamed: "worm") 
let apple = SKSpriteNode(imageNamed: "Apple") 

// vector helper operations 
func + (left: CGPoint, right: CGPoint) -> CGPoint { 
    return CGPoint(x: left.x + right.x, y: left.y + right.y) 
} 

func - (left: CGPoint, right: CGPoint) -> CGPoint { 
    return CGPoint(x: left.x - right.x, y: left.y - right.y) 
} 

func * (point: CGPoint, scalar: CGFloat) -> CGPoint { 
    return CGPoint(x: point.x * scalar, y: point.y * scalar) 
} 

func/(point: CGPoint, scalar: CGFloat) -> CGPoint { 
    return CGPoint(x: point.x/scalar, y: point.y/scalar) 
} 

#if !(arch(x86_64) || arch(arm64)) 
    func sqrt(a: CGFloat) -> CGFloat { 
     return CGFloat(sqrtf(Float(a))) 
    } 
#endif 

extension CGPoint { 
    func length() -> CGFloat { 
     return sqrt(x*x + y*y) 
    } 

    func normalized() -> CGPoint { 
     return self/length() 
    } 
} 

struct PhysicsCategory { 
    static let None  : UInt32 = 0 
    static let All  : UInt32 = UInt32.max 
    static let Apple : UInt32 = 0b1  // 1 
    static let Worm: UInt32 = 0b10  // 2 

} 




class GameScene: SKScene, SKPhysicsContactDelegate { 



    override func didMoveToView(view: SKView) { 

     backgroundColor = SKColor.whiteColor() 
     //----------------APPLE START-----------------// 
     let sizeX = UInt32(CGRectGetMaxX(self.frame)) 
     let randomX = CGFloat(arc4random_uniform(sizeX)) 

     let sizeY = UInt32(CGRectGetMaxY(self.frame)) 
     let randomY = CGFloat(arc4random_uniform(sizeY)) 

     apple.position = CGPointMake(randomX, randomY) 
     addChild(apple) 

     let appleCategory: UInt32 = 0x1 << 0 
     //------------APPLE FINISH--------------------// 



     //------------------WORM START---------------// 
     worm.position = CGPointMake(self.size.width/2, self.size.height/2) 
     self.addChild(worm) 
     let wormCategory: UInt32 = 0x1 << 1 
     //-----------------WORM FINISH---------------// 


     //PHYSICS 
     physicsWorld.gravity = CGVectorMake(0, 0) 
     physicsWorld.contactDelegate = self 
     worm.physicsBody = SKPhysicsBody(circleOfRadius: worm.size.width/2) 
     worm.physicsBody?.dynamic = true 
     worm.physicsBody?.categoryBitMask = PhysicsCategory.Worm 
     worm.physicsBody?.contactTestBitMask = PhysicsCategory.Apple 
     worm.physicsBody?.collisionBitMask = PhysicsCategory.None 
     worm.physicsBody?.usesPreciseCollisionDetection = true 
     apple.physicsBody = SKPhysicsBody(rectangleOfSize: apple.size) // 1 
     apple.physicsBody?.dynamic = true // 2 
     apple.physicsBody?.categoryBitMask = PhysicsCategory.Apple // 3 
     apple.physicsBody?.contactTestBitMask = PhysicsCategory.Worm // 4 
      apple.physicsBody?.collisionBitMask = PhysicsCategory.None // 5 

     func projectileDidCollideWithMonster(worm:SKSpriteNode, apple:SKSpriteNode) { 
      print("Hit") 
      apple.removeFromParent() 




     } 

     func didBeginContact(contact: SKPhysicsContact) { 

      // 1 
      var firstBody: SKPhysicsBody 
      var secondBody: SKPhysicsBody 
      if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask { 
       firstBody = contact.bodyA 
       secondBody = contact.bodyB 
      } else { 
       firstBody = contact.bodyB 
       secondBody = contact.bodyA 
      } 

      // 2 
      if ((firstBody.categoryBitMask & PhysicsCategory.Worm != 0) && 
       (secondBody.categoryBitMask & PhysicsCategory.Apple != 0)) { 
        projectileDidCollideWithMonster(firstBody.node as! SKSpriteNode, apple: secondBody.node as! SKSpriteNode) 
      } 

     } 











    } 

    func random() -> CGFloat { 
     return CGFloat(Float(arc4random())/0xFFFFFFFF) 
    } 

    func random(min min: CGFloat, max: CGFloat) -> CGFloat { 
     return random() * (max - min) + min 
    } 


    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
     /* Called when a touch begins */ 


     // change the direction the object should move 
     if (movingDirection == "left") { 
      movingDirection = "down" 
     } 
     else if (movingDirection == "down") { 
      movingDirection = "right" 
     } 
     else if (movingDirection == "right") { 
      movingDirection = "up" 
     } 
     else if (movingDirection == "up") { 
      movingDirection = "left" 
     } 

     print(movingDirection) 
     let rotateWorm = SKAction.rotateByAngle(CGFloat(M_PI_2), duration:0.0) 
     worm.runAction(rotateWorm) 

    } 

    override func update(currentTime: NSTimeInterval) { 
     /* Called before each frame is rendered */ 

     // need to set it to something for the sequence below 
     // so setting it to a nothing action 
     var moveWorm:SKAction = SKAction.moveByX(0.0, y: 0.0, duration: 0.0) 

     // change the direction the object should move 
     if (movingDirection == "left") { 
      moveWorm = SKAction.moveByX(-1.0, y: 0.0, duration: 0.01) 
     } 
     else if (movingDirection == "down") { 
      moveWorm = SKAction.moveByX(0.0, y: -1.0, duration: 0.01) 
     } 
     else if (movingDirection == "right") { 
      moveWorm = SKAction.moveByX(1.0, y: 0.0, duration: 0.01) 
     } 
     else if (movingDirection == "up") { 
      moveWorm = SKAction.moveByX(0.0, y: 1.0, duration: 0.01) 
     } 

     worm.runAction(moveWorm) 
     if (worm.position.x < -worm.size.width/2.0 || worm.position.x > self.size.width+worm.size.width/2.0 
      || worm.position.y < -worm.size.height/2.0 || worm.position.y > self.size.height+worm.size.height/2.0) 
     { 
      let reveal = SKTransition.flipHorizontalWithDuration(0.5) 
      let gameOverScene = GameOver(size: self.size, won: false) 
      self.view?.presentScene(gameOverScene, transition: reveal) 

     } 
    } 


} 

究竟是你的问题?你需要给你的蠕虫和苹果一个物理机构,并检查接触碰撞。一旦发生碰撞重生蠕虫。

您可以阅读这应有助于 http://www.techotopia.com/index.php/A_Swift_iOS_8_Sprite_Kit_Collision_Handling_Tutorial

+0

嘿!问题是添加物理体并检测到碰撞,我尝试使用来自该方的代码,但它不起作用。 – Adam