Я создаю игру 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()
}
})
}
}