2015-02-02 2 views
0

Я начинаю новую игру и имею странную проблему сразу с места в карьер. В моей функции didMoveToView я следующее положить границы на моих спрайтов в кадре (весь экран)иногда спрайты не отскакивают от границы физики

self.physicsBody=SKPhysicsBody(edgeLoopFromRect: self.frame) 

Следующий код добавляет SKSpriteNode в точке касания и добавляет rotatebyangle действие с повтором навсегда

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) { 
    /* Called when a touch begins */ 

    for touch: AnyObject in touches { 
     let location = touch.locationInNode(balloonWorld) 
     let nodeAtPoint = self.nodeAtPoint(location) 
     if(nodeAtPoint.name == nil) { 
      let location = touch.locationInNode(self) 

      let randNum:Int = Int.random(min: 0, max: 7) 

      var stringColor:String = (balloonColors.objectAtIndex(randNum) as String) 

      stringColor = stringColor.stringByReplacingOccurrencesOfString("face", 
       withString :"") 

      let sprite = Balloon(theColor:stringColor) 


      //let spriteFileName:String = balloonColors.objectAtIndex(randNum) as String 
      //let sprite = SKSpriteNode(imageNamed:spriteFileName) 


      sprite.xScale = 0.5 
      sprite.yScale = 0.5 
      sprite.position = location 
      sprite.zPosition = SceneLevel.hero.rawValue 
      balloonWorld!.addChild(sprite) 
      let action = SKAction.rotateByAngle(CGFloat(-M_PI), duration:1) 

      sprite.runAction(SKAction.repeatActionForever(action)) 


     } else { 
      nodeAtPoint.removeFromParent() 
      println(nodeAtPoint.name) 
     } 
    } 
} 

Я установки balloonWorld следующим образом:

balloonWorld = SKNode() 
self.addChild(balloonWorld!) 

Моя проблема заключается в том, что иногда воздушный шар спрайты не будет отскакивать от края, но только продолжайте идти по краю, чтобы его больше не видели.

Любые предложения?

Спасибо, Кен

по запросу вот код для настройки физических тел

воздушный шар:

class Balloon: SKNode { 

    // properties 


    var myColor:String? 
    var objectSprite:SKSpriteNode? 

    required init(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 

    init(theColor:String){ 
     super.init() 
     self.myColor=theColor 

     let imageFileName = "\(theColor)face" 
     let objectSprite:SKSpriteNode = SKSpriteNode(imageNamed:imageFileName) 
     objectSprite.physicsBody = SKPhysicsBody(circleOfRadius: objectSprite.size.height/2.0) 
     objectSprite.physicsBody?.affectedByGravity = true 
     objectSprite.name = theColor + " balloon" 
     addChild(objectSprite) 
    } 
} 

Я не создал физику тела на границе, как я хотя мне нужна была линия self.physicsBody = SKPhysicsBody(edgeLoopFrom Rect : self:frame), так как граница имеет тот же фрейм.

Я попытался добавить следующее, но это не изменило поведение:

let borderShape=SKShapeNode(rect: CGRectMake(self.frame.origin.x+2, self.frame.origin.y+2, self.frame.size.width-4, self.frame.size.height-4)) 
borderShape.fillColor=SKColor.clearColor() 
borderShape.strokeColor=SKColor.blackColor() 
borderShape.lineWidth=1 
borderShape.physicsBody?.categoryBitMask=BodyType.boundary.rawValue 
borderShape.zPosition=SceneLevel.border.rawValue 
borderShape.physicsBody=SKPhysicsBody(edgeLoopFromRect: borderShape.frame) 

balloonWorld!.addChild(borderShape) 
+1

Опубликовать код, в котором вы устанавливаете физические тела для границ и воздушных шаров. Имейте в виду, что если вы хотите правильного поведения при столкновении, вы не должны перемещать воздушные шары, используя SKAction moveTo/By – LearnCocos2D

+0

rakeshbs - класс воздушного шара находится в отдельном быстром файле, поэтому ваши действия редактирования не работают – macgeezer

ответ

0

LearnCocos2D (Steffen Itterheim) указал мне в правильном направлении в своем комментарии. Я использовал moveTo/moveBy, и физический движок не справился бы с этим. Как только я просто сделал ходы, основанные на импульсах, все работало нормально.

Thanks Steffen

0

Создать перечисление различать два типа спрайтов:

enum ColliderType { 
    case sprite1 = 1 
    case sprite2 = 2 
} 

Вам нужно добавить контакт и столкновение битовую маску так:

borderShape.physicsBody?.contactTestBitMask = ColliderType.sprite2.rawValue 

Также добавьте collisionBitMask:

borderShape.physicsBody?.collisionBitMask = ColliderType.sprite2.rawValue 

Сделайте то же самое для sprite2 и установить его collisionBitMask и это contactTestBitMask быть RawValue из sprite1. Убедитесь, что вы установили этот класс, чтобы быть в contactDelegate, так что вы получите предупреждение, хотя функция, которая будет оповещать вас, когда два объекта столкнулся:

self.physicsWorld?.contactDelegate = self 


func didBeginContact(contact: SKPhysicsContact) { 

[handle the contact however you would like to here] 

} 

Я надеюсь, что это помогает!

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