2015-02-26 2 views
2

Я использую встроенный физический движок Sprite Kit в игре, которую я пишу. Чтобы проверить, находится ли персонаж на земле, я использую функцию bodyAlongRayStart()SKScenephysicsWorld, чтобы проверить тела под нижним левым и нижним правыми углами символа (эта функция принадлежит к класс персонажа):PhysicsWorld.bodyAlongRayStart() создает фантомный println (читает «Шанс») - переопределяет функцию println?

func isInAir(sceneRef:GameScene) -> Bool { 
    var isInAir:Bool = false 

    let distance:CGFloat = 32 // how far from the origin we should check 

    // define where the rays start and end 
    let bottomLeftRayStart:CGPoint = CGPoint(x: self.position.x - (self.hitbox.size.width/2), y: self.position.y - (self.hitbox.size.height/2)) 
    let bottomLeftRayEnd:CGPoint = CGPoint(x: self.position.x - (self.hitbox.size.width/2), y: (self.position.y - (self.hitbox.size.height/2) - distance)) 
    let bottomRightRayStart:CGPoint = CGPoint(x: self.position.x + (self.hitbox.size.width/2), y: self.position.y - (self.hitbox.size.height/2)) 
    let bottomRightRayEnd:CGPoint = CGPoint(x: self.position.x + (self.hitbox.size.width/2), y: (self.position.y - (self.hitbox.size.height/2) - distance)) 

    // Are there any bodies along the lines? 
    var bottomLeftBody:SKPhysicsBody! = sceneRef.physicsWorld.bodyAlongRayStart(bottomLeftRayStart, end:bottomLeftRayEnd) 
    var bottomRightBody:SKPhysicsBody! = sceneRef.physicsWorld.bodyAlongRayStart(bottomRightRayStart, end:bottomRightRayEnd) 

    // no bodies found 
    if bottomLeftBody == nil && bottomRightBody == nil { 
     isInAir = true 
    } else { 
     // if one of the rays finds a wall (floor) or slope, we're not in the air 
     if (bottomLeftBody != nil && (bottomLeftBody!.categoryBitMask == _entityType.wall.rawValue || bottomLeftBody!.categoryBitMask == _entityType.slope.rawValue)) || (bottomRightBody != nil && (bottomRightBody.categoryBitMask == _entityType.wall.rawValue || bottomRightBody!.categoryBitMask == _entityType.slope.rawValue)) { 
      isInAir = false 
     } 
    } 
    return isInAir 
} 

Этот код называется в update() функции сцены (хотя я, вероятно, следует переместить его в didSimulatePhysics() ...) и она отлично работает! Однако раздражает то, что Свифт в своей бесконечной мудрости решает распечатать Chance на консоли каждый раз, когда он обнаруживает тело вдоль луча.

С одним персонажем на сцене это не слишком беспокоит, но я скоро добавлю врагов (которые работают одинаково, но будут иметь разные функции для обработки их движения), и все эти println() вызовы замедляют работу симулятора. Я не вижу способа подавить это; вызов происходит из библиотеки классов, которую я не могу изменить.

Есть ли надежный способ переопределить стандартную функцию println(), по-настоящему? Что-то вроде этого:

func println(object: Any) { 
    #if DEBUG 
     Swift.println(object) 
    #endif 
} 

И если да, то где, в моем проекте, я должен положить его? В настоящее время он находится в AppDelegate.swift, но другие библиотеки (и функция bodyAlongRayStart()) по-прежнему печатают на консоли, даже когда я меняю флаг ...

ответ

3

Я отправил эту ошибку Apple. Они сказали мне, что это исправлено в следующей версии Xcode. Если вы действительно прослушиваете, вы можете скачать Xcode 6.3 beta.

+1

Не исправлено в 6.2 (последняя версия)> :( – MassivePenguin

+1

Действительно, это отстой. Apple рекомендовала мне получить бета-версию 6.2. Сказано, что там было исправлено. Это очень раздражает, так как он спамает консоль = \ – hamobi

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