Я использую встроенный физический движок Sprite Kit в игре, которую я пишу. Чтобы проверить, находится ли персонаж на земле, я использую функцию bodyAlongRayStart()
SKScene
physicsWorld
, чтобы проверить тела под нижним левым и нижним правыми углами символа (эта функция принадлежит к класс персонажа):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()
) по-прежнему печатают на консоли, даже когда я меняю флаг ...
Не исправлено в 6.2 (последняя версия)> :( – MassivePenguin
Действительно, это отстой. Apple рекомендовала мне получить бета-версию 6.2. Сказано, что там было исправлено. Это очень раздражает, так как он спамает консоль = \ – hamobi