2016-04-02 37 views
0

Sorunumla ilgili hiçbir şey yapamayacağımı düşündüğüm tüm örneklere baktım. SKPhysicsContactDelegate'im var ve ben de self.physicsworld.contactDelegate = kendimi ekledim. Düşünebildiğim her şeyi yaptım. İşte projemin tüm kodu.didBeginContact işlevi çağrılmadı

// 
// GameScene.swift 
// arrow jump 
// 
// Created by Joy Cafiero on 3/29/16. 
// Copyright (c) 2016 3rd Dimension Studios inc. All rights reserved. 
// 

import SpriteKit 

var timer = NSTimer() 
var condition = 1 
var arrow = SKSpriteNode() 
var man = SKSpriteNode() 
var bg = SKSpriteNode() 
var ground = SKSpriteNode() 
var buttonRight = SKSpriteNode() 
var buttonLeft = SKSpriteNode() 
var buttonJump = SKSpriteNode() 
let moveGrounRight = SKAction.moveByX(200, y: 0, duration: 1) 
let repeatMoveGroundRight = SKAction.repeatActionForever(moveGrounRight) 
let moveGrounLeft = SKAction.moveByX(-200, y: 0, duration: 1) 
let repeatMoveGroundLeft = SKAction.repeatActionForever(moveGrounLeft) 
let runningMan1 = (SKTexture (imageNamed: "running man1.png")) 
let runningMan2 = (SKTexture (imageNamed: "running man2.png")) 
let runningMan3 = (SKTexture (imageNamed: "running man3.png")) 
let runningMan4 = (SKTexture (imageNamed: "running man4.png")) 
let runningMan5 = (SKTexture (imageNamed: "running man5.png")) 
let runningMan6 = (SKTexture (imageNamed: "running man6.png")) 
let nuetralMan = (SKTexture (imageNamed: "running man nuetral.png")) 
let jumpingMan1 = (SKTexture (imageNamed: "jumping man1")) 
let jumpingMan2 = (SKTexture (imageNamed: "jumping man2")) 
let jumpingMan3 = (SKTexture (imageNamed: "jumping man3")) 

let animation = SKAction.animateWithTextures([ runningMan1, runningMan2,  runningMan3, runningMan4, runningMan5, runningMan6], timePerFrame: 0.15) 
let jumpingAnimation = SKAction.animateWithTextures([jumpingMan1, jumpingMan2,   jumpingMan3], timePerFrame: 0.1) 
let nuetralAnimation = SKAction.animateWithTextures([nuetralMan], timePerFrame: 0.05) 
let repeatAnimation = SKAction.repeatActionForever(animation) 

let manGroup:UInt32 = 0x1 << 1 
let groundGroup:UInt32 = 0x1 << 2 
let arrowGroup:UInt32 = 0x1 << 3 


class GameScene: SKScene, SKPhysicsContactDelegate { 

override func didMoveToView(view: SKView) { 
    /* Setup your scene here */ 

    self.physicsWorld.contactDelegate = self 
    self.physicsWorld.gravity = CGVectorMake(0, -5) 

    man = SKSpriteNode(texture: nuetralMan) 
    man.position = CGPointMake(CGRectGetMidX(self.frame),  CGRectGetMidY(self.frame)) 
    man.size = CGSize(width: man.size.width * 2, height: man.size.height * 2) 
    man.zPosition = 15 
    man.physicsBody = SKPhysicsBody(rectangleOfSize: man.size) 
    man.physicsBody?.dynamic = true 
    man.physicsBody?.allowsRotation = false 
    man.physicsBody?.categoryBitMask = manGroup 
    man.physicsBody?.contactTestBitMask = groundGroup | arrowGroup 

    self.addChild(man) 

    let bgTexture = (SKTexture(imageNamed: "wild west landscape.png")) 

    bg = SKSpriteNode(texture: bgTexture) 
    bg.size = CGSize(width: self.frame.width, height: self.frame.height) 
    bg.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame) + 100) 
    bg.zPosition = -1 
    self.addChild(bg) 

    let groundtexture = (SKTexture(imageNamed: "sandy ground.png")) 

    ground = SKSpriteNode(texture: groundtexture) 
    ground.size = CGSize(width: CGRectGetMaxX(self.frame), height: ground.size.height) 
    ground.position = CGPointMake(CGRectGetMidX(self.frame), 0) 
    ground.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(self.frame.width, ground.size.height-255)) 
    ground.physicsBody?.dynamic = false 
    ground.zPosition = 20 
    ground.physicsBody?.categoryBitMask = groundGroup 
    ground.physicsBody?.contactTestBitMask = manGroup 


    self.addChild(ground) 

    timer = NSTimer.scheduledTimerWithTimeInterval(3, target: self, selector: Selector("timerUpdate"), userInfo: nil, repeats: true) 

    buttonRight.color = SKColor.redColor() 
    buttonRight.position = CGPointMake(200, 200) 
    buttonRight.size = CGSize(width: 100, height: 100) 
    buttonRight.zPosition = 25 

    self.addChild(buttonRight) 

    buttonLeft.color = SKColor.redColor() 
    buttonLeft.position = CGPointMake(100, 200) 
    buttonLeft.size = CGSize(width: 100, height: 100) 
    buttonLeft.zPosition = 25 

    self.addChild(buttonLeft) 

    buttonJump.color = SKColor.greenColor() 
    buttonJump.position = CGPointMake(CGRectGetMaxX(self.frame) - 200, 200) 
    buttonJump.size = CGSize(width: 100, height: 100) 
    buttonJump.zPosition = 25 

    self.addChild(buttonJump) 


} 

func timerUpdate() { 
    let random = Int(arc4random_uniform(3)) 
    var timeIncrease:NSTimeInterval = 0 
    var randomArrow = [self.frame.height/20 + CGRectGetMidY(self.frame) - 65, self.frame.height/20 + self.frame.height/20 + CGRectGetMidY(self.frame) - 65, self.frame.height/20 + self.frame.height/20 + self.frame.height/20 + CGRectGetMidY(self.frame) - 65, self.frame.height/20 + self.frame.height/20 + self.frame.height/20 + CGRectGetMidY(self.frame) - 65] 
    timeIncrease = timeIncrease + 7 
    let arrowTexture = (SKTexture(imageNamed: "arrow.png")) 
    let movingArrow = SKAction.moveByX(-self.frame.size.width, y: 0, duration: 10-timeIncrease) 
    let removeArrows = SKAction.removeFromParent() 
    let repeatmoveArrows = SKAction.sequence([movingArrow, removeArrows]) 
    arrow = SKSpriteNode(texture: arrowTexture) 
    arrow.size = CGSize(width: arrow.size.width, height: arrow.size.height) 
    arrow.position = CGPointMake(CGRectGetMaxX(self.frame), randomArrow[random]) 
    arrow.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(arrowTexture.size().width - 100, arrow.size.height/2)) 
    arrow.physicsBody?.dynamic = false 
    arrow.zPosition = 10 
    arrow.physicsBody?.categoryBitMask = arrowGroup 
    arrow.physicsBody?.contactTestBitMask = manGroup 
    arrow.runAction(repeatmoveArrows) 

    self.addChild(arrow) 

} 


override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
    /* Called when a touch begins */ 
    for touch: AnyObject in touches { 
     let location = touch.locationInNode(self) 
     if buttonRight.containsPoint(location) { 
      man.xScale = 1 
      man.runAction(repeatMoveGroundRight, withKey: "MoveRight") 
      man.runAction(repeatAnimation, withKey: "Run") 
     } 

     if buttonLeft.containsPoint(location) { 
      man.xScale = -1 
      man.runAction(repeatMoveGroundLeft, withKey: "MoveLeft") 
      man.runAction(repeatAnimation, withKey: "Run") 
     } 

     if buttonJump.containsPoint(location) { 
      if(condition == 1) { 
      man.physicsBody?.velocity = CGVectorMake(0, 0) 
      man.physicsBody?.applyImpulse(CGVectorMake(0, 400)) 
      man.runAction(jumpingAnimation) 
       condition = 0 
      } 
     } 


} 
} 

override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) { 
     for touch: AnyObject in touches { 
     let location = touch.locationInNode(self) 
     if buttonRight.containsPoint(location) { 
      man.removeActionForKey("MoveRight") 
      man.removeActionForKey("Run") 
      man.texture = nuetralMan 
     } 
     if buttonLeft.containsPoint(location) { 
      man.removeActionForKey("MoveLeft") 
      man.removeActionForKey("Run") 
      man.texture = nuetralMan 
     } 

    } 
} 


override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) { 
    for touch: AnyObject in touches { 
     let location = touch.locationInNode(self) 
     if buttonRight.containsPoint(location) { 
      man.removeActionForKey("MoveRight") 
      man.removeActionForKey("Run") 
      man.texture = nuetralMan 
     } 
     if buttonLeft.containsPoint(location) { 
      man.removeActionForKey("MoveLeft") 
      man.removeActionForKey("Run") 
      man.texture = nuetralMan 
     } 

    } 

    func didBeginContact(contact: SKPhysicsContact) { 

     var firstBody: SKPhysicsBody 
     var secondBody: SKPhysicsBody 
     var thirdBody: SKPhysicsBody 

     if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask { 
      firstBody = contact.bodyA 
      secondBody = contact.bodyB 
     } else { 
      firstBody = contact.bodyB 
      secondBody = contact.bodyA 
     } 

     if contact.bodyA.categoryBitMask < contact.bodyB.categoryBitMask { 
      firstBody = contact.bodyA 
      thirdBody = contact.bodyB 
     } else { 
      firstBody = contact.bodyB 
      thirdBody = contact.bodyA 
     } 


     if firstBody.categoryBitMask == manGroup || secondBody.categoryBitMask == groundGroup { 
      print("contact") 
      condition = 1 
      man.texture = nuetralMan 

     } 

     if firstBody.categoryBitMask == manGroup || thirdBody.categoryBitMask == arrowGroup { 
      print("dead") 
     } 
    } 


func update(currentTime: CFTimeInterval) { 
    /* Called before each frame is rendered */ 
} 
} 
} 

Bazı şeyler didBeginContact yönteminde yazdırmaya çalıştım ancak hiçbir şey olmuyor. Bunu çözmek için 3 gün harcadım. Ayrıca tüm kategoriBitMasks ve CollisionTestBitMask bildiğim kadarıyla doğru şekilde ayarlanmış. Herhangi bir yardım çok takdir edilir.

+0

oklarınız yanlış bir dinamiğe sahiptir, bu yüzden adam ok yönünde hareket etmediği sürece, kayıt olmayacaktır – Knight0fDragon

+0

Evet adam okları zıplamak zorundadır, bu yüzden oyuncu çarptığında evet okla vurulacaktır bu yüzden oklar dinamik olmamak sorun değil. MoveByX SKAction, okların ekran boyunca hareket etmesine neden olur ve NSTimer onları 5 saniyelik bir hızda ortaya çıkarır. Bu gerçekten sorun değil, sorun benim didBeginContact fonksiyonu çalışmıyor ve neden emin değilim. –

cevap

1

didBeginContact() tanımınız, touchEnded() işlevine gömülüdür.

override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) { 
    for touch: AnyObject in touches { 
     // for touches loop (skipped) 
    } 
} // Add this closing brace 

    func didBeginContact(contact: SKPhysicsContact) { 
     // contact body (skipped) 
    } 

Ve ayrıca güncellemeden sonra ekstra ayracı silmeniz gerekir(): Eğer canlandırıcı düzeltmek, bu yardımcı olabilir yardımcı

// ...skipped 

func update(currentTime: CFTimeInterval) { 
    /* Called before each frame is rendered */ 
} 
// } // get rid of this one 
} 

Umut.

+0

Vay be şükür çok ahbap bile bana ne kadar yardım ettiğinizi bile bilmediğiniz gibi size yeterince teşekkür edip edemeyeceğimi bile bilmiyorum. Sen gerçek bir kahramansın. –