Я сделал платформенную игру и указал камеру на основном проигрывателе node.
Я просмотрел документ Apple, который можно найти здесь: Apple
Существует около 6 платформ, с пробелом self.frame.size.height / 4.5
между ними, которые должны обновляться каждый раз, когда они находятся под dy = -15
в верхней части экрана, чтобы сделать его бесконечным циклом.
У меня есть Player node, который получает импульс каждый раз при касании экрана (игрок прыгает вверх и вниз). Вся игра перемещается только на y-Axis
.
Камера, которую я создал, ориентирована на Игрока, каждый раз, когда Игрок прыгает, платформы поднимаются вниз, и Игрок поднимается вверх. Однако это только вид, а не позиция реального мира. Это означает, что данные позиции в SpawnPlatforms
всегда одинаковы, потому что они не двигаются, только вид, который придерживается игрока, перемещается вверх и вниз.
Я хочу, чтобы камера на моем проигрывателе node, которая перемещается по оси y, и пока она идет дальше, платформы также должны двигаться вниз, на данный момент изменяется только представление, и я не могу работайте с обновленным: метод для обновления платформ. Как это изменить?
Изменить. Я получил свой код, работающий с обновлением в Update:Method
, но это все еще не отвечает на мой первоначальный вопрос, как перемещать весь мир с помощью камеры, а не только камера.
override func didMoveToView(view: SKView) {
/* Setup your scene here */
self.physicsWorld.contactDelegate = self
self.anchorPoint = CGPoint(x: 0, y: 0.30)
backgroundColor = SKColor(red: 81.0/255.0, green: 192.0/255.0, blue: 201.0/255.0, alpha: 1.0)
self.World = SKNode()
self.World.name = "World"
addChild(World)
self.Camera = SKNode()
self.Camera.name = "Camera"
self.World.addChild(Camera)
SpawnPlatforms()
SpawnPlayer()
}
func SpawnPlatforms() {
Platform0 = SKSpriteNode (color: SKColor.greenColor(), size: CGSize(width: self.frame.size.width , height: 25))
Platform0.position = CGPoint(x: self.frame.size.width / 2, y: -36)
Platform0.zPosition = 1
Platform0.physicsBody = SKPhysicsBody(rectangleOfSize:Platform0.size)
Platform0.physicsBody?.dynamic = false
Platform0.physicsBody?.allowsRotation = false
Platform0.physicsBody?.restitution = 0
Platform0.physicsBody?.usesPreciseCollisionDetection = true
Platform0.physicsBody?.categoryBitMask = Platform0Category
Platform0.physicsBody?.collisionBitMask = PlayerCategory
Platform0.physicsBody?.contactTestBitMask = PlayerCategory
World.addChild(Platform0)
....//Same code for the other Platforms1-5
}
func SpawnPlayer(){
Player = SKSpriteNode (imageNamed: "Image.png")
Player.size = CGSize(width: 64, height: 64)
Player.position = CGPoint(x: self.frame.size.width / 2, y: 0)
Player.zPosition = 2
Player.physicsBody = SKPhysicsBody(rectangleOfSize:CGSize(width: 35, height: 50))
Player.physicsBody?.dynamic = true
Player.physicsBody?.allowsRotation = false
Player.physicsBody?.restitution = 0
Player.physicsBody?.usesPreciseCollisionDetection = true
Player.physicsBody?.categoryBitMask = PlayerCategory
Player.physicsBody?.collisionBitMask = Platform0Category
Player.physicsBody?.contactTestBitMask = Platform0Category | Platform1Category | Platform2Category | Platform3Category | Platform4Category | Platform5Category
World.addChild(Player)
}
override func didSimulatePhysics() {
Camera.position = CGPoint(x: Player.position.x, y: Player.position.y)
self.centerOnNode(Camera!)
}
func centerOnNode(node: SKNode) {
let cameraPositionInScene: CGPoint = Camera.scene!.convertPoint(Camera.position, fromNode: World)
World.runAction(SKAction.moveTo(CGPoint(x:World.position.x , y:World.position.y - cameraPositionInScene.y), duration: 1.0))
}
override func update(currentTime: CFTimeInterval) {
/* Called before each frame is rendered */
if(Player.position.y > (Platform3.position.y + 30) && Player.position.y < Platform4.position.y){
Platform1.position = CGPointMake(self.frame.size.width / 2, Platform6.position.y + self.frame.size.height / 4.5)
Platform1.color = SKColor.redColor()
}
...//Same code for the other Platforms1-5
}