Sprite Kit: SKSpriteNode, управляемый движением устройства, выпадает за пределы экрана в углах

Я создаю игру SpriteKit, которая использует платформу CoreMotion для перемещения SKSpriteNode, userNode, по экрану. Для масштабирования я установил ResizeFill и использовал view.frame для хранения четырех границ представления в переменных:

//setting screens bounds
    var rightBound = CGFloat()
    var leftBound = CGFloat()
    var upperBound = CGFloat()
    var bottomBound = CGFloat()
    rightBound = view.frame.width - (userNode.size.width / 2)
    leftBound = CGRectGetMinX(view.frame) + (userNode.size.width / 2)
    upperBound = view.frame.height - (userNode.size.height / 2)
    bottomBound = CGRectGetMinY(self.frame) + (userNode.size.height / 2)

Чтобы попытаться сохранить userNode на экране, я создал функцию для запуска в функции обновления:

func keepUserNodeOnScreen(){
    if userNode.position.x >= rightBound{
        userNode.position.x = rightBound

    }
    else if userNode.position.x <= leftBound{
        userNode.position.x = leftBound
    }
    else if userNode.position.y >= upperBound{
        userNode.position.y = upperBound
    }
    else if userNode.position.y <= bottomBound{
        userNode.position.y = bottomBound
    }

}

Однако по какой-то причине, когда узел достигает углов представления, он выпадает из представления. Я также пробовал self.physicsBody = SKPhysicsBody(edgeLoopFromRect(view.frame)), но это тоже не сработало. Что может быть причиной этого?

Изменить: вот код генерации userNode:

    userNode.color = SKColor.redColor()
    userNode.size = CGSizeMake(15, 15)
    userNode.position = CGPointMake(view.frame.size.width / 2, view.frame.size.height / 2)
    userNode.physicsBody = SKPhysicsBody(rectangleOfSize: userNode.size)
    userNode.physicsBody?.dynamic = true
    userNode.physicsBody?.allowsRotation = false
    userNode.physicsBody?.categoryBitMask = userCategory
    userNode.physicsBody?.contactTestBitMask = bulletCategory
    self.addChild(userNode)

Вот код для перемещения userNode, настроенный для запуска в функции обновления:

func moveUserNode(){
    if motionManager.accelerometerAvailable == true{
        motionManager.deviceMotionUpdateInterval = 0.001

        motionManager.startDeviceMotionUpdatesToQueue(NSOperationQueue.currentQueue(), withHandler:{
            deviceManager, error in
            if self.gameOn == true{
                var roll: CGFloat = CGFloat(self.motionManager.deviceMotion.attitude.roll)
                var pitch: CGFloat = CGFloat(-self.motionManager.deviceMotion.attitude.pitch) + CGFloat(0.6)

                //Keep userNode on screen

                self.newPosition.x = self.userNode.position.x + CGFloat(roll) * 20
                self.newPosition.y = self.userNode.position.y + CGFloat(pitch) * 20
                self.userNode.position = self.newPosition

            }
            else if self.gameOn == false{
                self.motionManager.stopDeviceMotionUpdates()
            }
        })
    }
}

person ctdewaters    schedule 19.11.2014    source источник
comment
опубликуйте код, который создает границы и usernode   -  person LearnCocos2D    schedule 19.11.2014


Ответы (1)


В keepUserNodeOnScreen ваши операторы if/else не проверяют все возможные способы выхода userNode из экрана. Удаление всех операторов else решит эту проблему.

Альтернативный подход — добавить реберную петлю

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

и переместите userNode с помощью applyForce или applyImpulse вместо того, чтобы перемещать его, изменяя его свойство position. SpriteKit не обнаруживает коллизии, если положение узла изменяется напрямую.

person 0x141E    schedule 19.11.2014
comment
Удаление операторов else сработало! Спасибо. Я буду иметь в виду другое исправление для более позднего проекта. - person ctdewaters; 19.11.2014