2017-05-08 1 views
1

최근에 내 게임에서 충돌 감지를 설정했는데 작동하지 않는 것 같습니다. Spritekit을 처음 접했을 때 나는 무엇이 일어나고 있는지 알고 싶습니다. 아래에서 나는 gamscene 클래스 인 didMoveToView, 뷰에서 볼을 생성하는 함수, My did begin contact 함수를 제공 할 것입니다. 내가 빨간 공과 빨간색 블록으로 작업 중이므로 충돌하는 것은 두 가지뿐입니다. 프로젝트에서보아야 할 사항이 있는지, 아래에 나와 있지 않은지 알려주십시오. 내가 블록에 물리 몸을 적용하고있는 categoryBitMaskSpriteKit, Swift에서 적절한 충돌 감지를 설정하는 방법 3

let redBallCategory: UInt32 = 0x1 << 0 
let greenBallCategory: UInt32 = 0x1 << 1 
let blueBallCategory: UInt32 = 0x1 << 2 
let yellowBallCategory: UInt32 = 0x1 << 3 

let redBlockCategory: UInt32 = 0x1 << 4 
let yellowBlockCategory: UInt32 = 0x1 << 5 
let greenBlockCategory: UInt32 = 0x1 << 6 
let blueBlockCategory: UInt32 = 0x1 << 7 


override func didMove(to view: SKView) { 

    physicsWorld.contactDelegate = self 

의 번호를 정의하는 경우

import SpriteKit 
import GameplayKit 

class GameScene: SKScene, SKPhysicsContactDelegate { 



var greenBlock = SKSpriteNode() 
var redBlock = SKSpriteNode() 
var yellowBlock = SKSpriteNode() 
var blueBlock = SKSpriteNode() 

var greenBall = SKSpriteNode() 
var redBall = SKSpriteNode() 
var yellowBall = SKSpriteNode() 
var blueBall = SKSpriteNode() 
var ball = SKSpriteNode() 

var ballSpeedTop = CGVector(dx: 0, dy: 5) 
var ballSpeedBottom = CGVector(dx: 0, dy: -5) 

이입니다.

redBlock = self.childNode(withName: "redBlock") as! SKSpriteNode 
    redBlock.physicsBody?.categoryBitMask = redBlockCategory 
    redBlock.physicsBody?.collisionBitMask = redBallCategory 
    redBlock.physicsBody?.contactTestBitMask = redBallCategory 


    yellowBlock = self.childNode(withName: "yellowBlock") as! SKSpriteNode 
    greenBlock = self.childNode(withName: "greenBlock") as! SKSpriteNode 
    blueBlock = self.childNode(withName: "blueBlock") as! SKSpriteNode 

    redBlock.physicsBody?.affectedByGravity = false 
    redBlock.physicsBody?.isDynamic = true 

    greenBlock.physicsBody?.affectedByGravity = false 
    greenBlock.physicsBody?.isDynamic = true 

    blueBlock.physicsBody?.affectedByGravity = false 
    blueBlock.physicsBody?.isDynamic = false 

    yellowBlock.physicsBody?.affectedByGravity = false 
    yellowBlock.physicsBody?.isDynamic = false 

    initializeGame() 

    print("hello") 





} 


    func initializeGame(){ 


    Timer.scheduledTimer(timeInterval: TimeInterval(randomBetweenNumbers(firstNum: 2, secondNum: 4)), target: self, selector: #selector(topBall), userInfo: nil, repeats: true) 

    Timer.scheduledTimer(timeInterval: TimeInterval(randomBetweenNumbers(firstNum: 2, secondNum: 4)), target: self, selector: #selector(bottomBall), userInfo: nil, repeats: true) 



} 

// 위에 볼 Spawner를

func topBall() -> SKSpriteNode { 

    let ball: SKSpriteNode?; 


    if Int(randomBetweenNumbers(firstNum: 0, secondNum: 2)) == 0 { 


     ball = SKSpriteNode(imageNamed: "redBall") 
     ball?.name = "redBall" 
     ball!.physicsBody?.categoryBitMask = redBallCategory 
     ball!.physicsBody?.collisionBitMask = redBlockCategory 
     ball!.physicsBody?.contactTestBitMask = redBlockCategory 


    } else { 


     ball = SKSpriteNode(imageNamed: "greenBall") 
     ball?.name = "greenBall" 




    } 




    ball!.size = CGSize(width: 30, height: 30) 
    ball!.anchorPoint = CGPoint(x: 0.5, y: 0.5) 
    ball!.position = CGPoint(x: 0, y: 0) 

    ball!.physicsBody = SKPhysicsBody(circleOfRadius: ball!.size.height/2) 
    ball!.physicsBody?.affectedByGravity = false 
    ball!.physicsBody?.isDynamic = true 

    ball!.zPosition = 2 


    self.addChild(ball!) 

    ball!.physicsBody?.applyImpulse(ballSpeedTop) 

    return ball! 


} 

접촉 기능

func didBegin(_ contact: SKPhysicsContact) { 


    if (contact.bodyA.categoryBitMask == redBallCategory && contact.bodyB.categoryBitMask == redBlockCategory){ 

     print("touched red block") 

    } else if (contact.bodyB.categoryBitMask == redBallCategory && contact.bodyA.categoryBitMask == redBlockCategory){ 

     print("touched a red block") 
    } 






} 

UPDATE ::: 내가 잘못하지만 내 문제는 기술적으로 아직 해결되지는 어디에서 발견했다. RedBall 카테고리 비트 마스크 등이 두 볼에 모두 적용된다는 것을 의미하는 if 문 외부에 redBall의 속성을 적용 했으므로 redBall 카테고리 비트 마스크가 생성 될 때 redBall 범주 비트 마스크를 적용하고 다른 categorybitmask 녹색 공이 생겨 났을 때. 내가 일을 가지고 있지만, 문제는 내가 그것을 녹색 또는 적색 어떠했는지에 따라 공을 개별 categorybitmasks을 적용 할 것을 얼마나

func topBall() -> SKSpriteNode { 

    let ball: SKSpriteNode?; 


    if Int(randomBetweenNumbers(firstNum: 0, secondNum: 2)) == 0 { 


     ball = SKSpriteNode(imageNamed: "redBall") 
     ball?.name = "redBall" 


    } else { 


     ball = SKSpriteNode(imageNamed: "greenBall") 
     ball?.name = "greenBall" 




    } 




    ball!.size = CGSize(width: 30, height: 30) 
    ball!.anchorPoint = CGPoint(x: 0.5, y: 0.5) 
    ball!.position = CGPoint(x: 0, y: 0) 

    ball!.physicsBody = SKPhysicsBody(circleOfRadius: ball!.size.height/2) 
    ball!.physicsBody?.affectedByGravity = false 
    ball!.physicsBody?.isDynamic = true 
    ball!.physicsBody?.categoryBitMask = redBallCategory 
    ball!.physicsBody?.collisionBitMask = redBlockCategory 
    ball!.physicsBody?.contactTestBitMask = redBlockCategory 


    ball!.zPosition = 2 


    self.addChild(ball!) 

    ball!.physicsBody?.applyImpulse(ballSpeedTop) 

    return ball! 


} 

이다. 당신이 양산 볼의 이미지와 이름을 설정 동일한 코드 블록에서 해당 category, collisioncontactTest 비트 마스크를 저장 한 다음 physicsbody에 실제 값을 설정하는 이러한 임시 변수를 사용하는

+0

코드/문제를 정확하게 질문에 답하는 것이 도움이 될 가능성이 큽니다. – nathan

답변

0

사용 임시 변수 :

var categoryBitMask: UInt32 
    var collisonBitMask: UInt32 
    var contactTestBitMask: Uint32 

    if Int(randomBetweenNumbers(firstNum: 0, secondNum: 2)) == 0 { 
     ball = SKSpriteNode(imageNamed: "redBall") 
     ball?.name = "redBall" 
     categoryBitMask = redBallCategory 
     collisionBitMask = redBlockCategory 
     contactTestBitMask = redBlockCategory 

    } else { 
     ball = SKSpriteNode(imageNamed: "greenBall") 
     ball?.name = "greenBall" 
     categoryBitMask = greenBallCategory 
     collisionBitMask = greenBlockCategory 
     contactTestBitMask = greenBlockCategory 
    } 

    ball!.size = CGSize(width: 30, height: 30) 
    ball!.anchorPoint = CGPoint(x: 0.5, y: 0.5) 
    ball!.position = CGPoint(x: 0, y: 0) 

    ball!.physicsBody = SKPhysicsBody(circleOfRadius: ball!.size.height/2) 
    ball!.physicsBody?.affectedByGravity = false 
    ball!.physicsBody?.isDynamic = true 
    ball!.physicsBody?.categoryBitMask = categoryBitMask 
    ball!.physicsBody?.collisionBitMask = collisionBitMask 
    ball!.physicsBody?.contactTestBitMask = contactTestBitMask 
관련 문제