2016-12-14 3 views
2

Я делаю игру с птицами. Кажется, у меня проблема, когда моя птица проходит каждую стену/собирает монету. Есть 2 проблемы. 1 игра задерживается на миллисекунду после сбора. 2 У моей птицы, кажется, есть 2 или даже 3 столкновения, каждый раз создавая счет 2 или 3, я не могу обдумать это!Столкновение обнаружено несколько раз.

Моя птица представляет собой 5 текстурных анимаций, с физическим телом, которое обертывает вокруг своей сложной формы с текстурой: bird.texture! тип кода.

Я пытаюсь понять это в течение 4 дней, и теперь его перерывы на моем приложении большое время! Пожалуйста, помогите !!!

func createScene(){ 

let bird1 = SKTexture(imageNamed: "1") 
let bird2 = SKTexture(imageNamed: "2") 
let bird3 = SKTexture(imageNamed: "3") 
let bird4 = SKTexture(imageNamed: "4") 
let bird5 = SKTexture(imageNamed: "5") 



let birdAnimation = SKAction.repeatForever(SKAction.animate(with: [bird1, bird2, bird3, bird4, bird5], timePerFrame: 0.1)) 
let flyForever = SKAction.repeatForever(birdAnimation) 

bird = SKSpriteNode(texture: bird1) 
bird = CGSize(width: 65, height: 65) 
bird = CGPoint(x: self.frame.width/1.5 - bird, y: self.frame.height/2) 
bird(flyForever, withKey: "birdFly") 

bird = SKPhysicsBody(texture: bird.texture!, size: CGSize(width: bird.size.width, height: bird.size.height)) 


bird.physicsBody?.categoryBitMask = physicsCategory.bird 
bird.physicsBody?.collisionBitMask = physicsCategory.ground | physicsCategory.wall 
bird.physicsBody?.contactTestBitMask = physicsCategory.ground | physicsCategory.wall | physicsCategory.score 
bird?.affectedByGravity = false 
bird.physicsBody?.isDynamic = true 


self.addChild(bird) 


func didBegin(_ contact: SKPhysicsContact) { 
let firstBody = contact.bodyA 
let secondBody = contact.bodyB 

if firstBody.categoryBitMask == physicsCategory.score && secondBody.categoryBitMask == physicsCategory.bird{ 



    score += 1 
    scoreLabel.text = "\(score)" 
    firstBody.node?.removeFromParent() 

    run(SKAction.playSoundFileNamed("tap.caf", waitForCompletion: false)) 

    if score > UserDefaults().integer(forKey: "HIGHSCORE") { 
     saveHighScore() 


    } 

} 
else if firstBody.categoryBitMask == physicsCategory.bird && secondBody.categoryBitMask == physicsCategory.score{ 

    score += 1 
    scoreLabel.text = "\(score)" 
    secondBody.node?.removeFromParent() 

    run(SKAction.playSoundFileNamed("tap.caf", waitForCompletion: false)) 

    if score > UserDefaults().integer(forKey: "HIGHSCORE") { 
     saveHighScore() 


    } 

} 


func createWalls(){ 



let scoreNode = SKSpriteNode(imageNamed: "bird") 
scoreNode.size = CGSize(width: 40, height: 40) 
scoreNode.position = CGPoint(x: self.frame.width + 25, y: self.frame.height/2) 
scoreNode.physicsBody = SKPhysicsBody(rectangleOf: scoreNode.size) 
scoreNode.physicsBody?.affectedByGravity = false 
scoreNode.physicsBody?.isDynamic = false 
scoreNode.physicsBody?.categoryBitMask = physicsCategory.score 
scoreNode.physicsBody?.collisionBitMask = 0 
scoreNode.physicsBody?.contactTestBitMask = physicsCategory.bird 

ответ

0

я вроде нашел ответ на этот вопрос, хотя он не совершенен ... physicsBody моей птицы была изменена с

bird = SKPhysicsBody(texture: bird.texture!, size: CGSize(width: bird.size.width, height: bird.size.height)) 

в

let path = CGMutablePath() 
    path.addLines(between: [CGPoint(x: -8, y: -28), 
        CGPoint(x: -30, y: 9), CGPoint(x:-11, y: 14), CGPoint(x: -10, y: 27), 
        CGPoint(x: 26, y: 22), CGPoint(x: 32, y: 20), 
        CGPoint(x: 30, y: 14), CGPoint(x: 23, y: -17), CGPoint(x: 15, y: -31)]) 
    path.closeSubpath() 
    bird.physicsBody = SKPhysicsBody(polygonFrom: path) 

Новый путь Я создал гораздо более простой путь, который в основном имел квадратный фронт. Таким образом, это не позволяло фигуре столкнуться с моим scoreNode дважды. Это могут быть не очень четкие инструкции, но если у кого-то есть те же проблемы, не стесняйтесь спрашивать! Это был самый большой набор из моих приложений для птичек!

Смежные вопросы