2015-07-01 3 views
13

Я сделал платформенную игру и указал камеру на главный узел Player.Камера Sprite Kit на узле

Я прошел через документ Apple, который можно найти здесь: Apple

Есть около 6 платформ, с self.frame.size.height/4.5 пространства между ними, которые должны респауном каждого раза они находятся под dy = -15 на верхней части экрана, опять же, чтобы сделать его бесконечным циклом.

У меня есть узел Игрока, который получает импульс каждый раз при касании экрана (Игрок прыгает вверх и вниз). Вся игра движется только на y-Axis.

Камера, которую я создал, ориентирована на Игрока, каждый раз, когда Игрок прыгает с платформы и движется вверх. Однако это только вид, а не позиция реального мира. Это означает, что данные позиции в SpawnPlatforms всегда одинаковы, потому что они не перемещаются, только вид, который придерживается игрока, перемещается вверх и вниз.

Я хочу иметь камеру на моем Игровом узле, который перемещается по оси 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 
} 
+3

Ваш вопрос немного неясен. Просьба уточнить более подробно. – sangony

+0

Я отредактировал свое оригинальное сообщение, надеюсь, что он станет более ясным. – Albert

+0

Вы пробовали прочитать это сообщение? http://stackoverflow.com/questions/20828655/how-to-make-camera-follow-sknode-in-sprite-kit –

ответ

4

Создайте SKNode и назовем его map. Добавьте карту в качестве ребенка этой сцены. Вы добавляете каждый другой игровой узел в качестве дочернего элемента этой карты (платформы, проигрыватель и т. Д.).

Затем вместо перемещения node.parent вы перемещаете карту. Это приведет к тому, что платформы всегда будут одинаковыми, даже если вы перемещаете камеру.

Плюс, вы можете добавить меню игры на сцену, и они не будут двигаться, но карта будет.

Например, следующий код будет перемещать карту в update: методе с линейной скоростью:

kScrollScenarioFactor может быть как 200.f

-(void)update:(CFTimeInterval)currentTime { 
    //Calculating time for realistic scroll speed 
    float scrollTime = currentTime - self.lastTime; 
    self.lastTime = currentTime; 
    self.map.position = CGPointMake(map.position.x - (scrollTime * self.kScrollScenarioFactor), map.position.y); 
} 

Или, если вы хотите, чтобы переместить карту в зависимости от игрока, внутри update: метод, вы можете посмотреть на этот подход:

-(void)update:(CFTimeInterval)currentTime { 
    //Calculating playerPosition difference 
    float diffX = self.lastPlayerPosition.x - self.player.position.x; 
    float diffY = self.lastPlayerPosition.y - self.player.position.y; 
    self.lastPlayerPosition = self.player.position; 

    //Updating map position 
    self.map.position = CGPointMake(map.position.x + diffX, map.position.y + diffY); 
} 
+0

Итак, в моем коде я добавил уже все, что касается «World» SKNode. Если я перехожу к World вместо node.parent !, то я не вижу никаких различий. Или вы имеете в виду, что мне нужно переместить «Мир» вручную в методе обновления всегда под камерой? – Albert

+0

Забудьте о «камере», прямо переместите «Мир» (или «карту» в моем ответе) влево. Таким образом, технически вид останется в том же положении, но «Мир» переместится влево (и я предполагаю, что игрок справа), заставляя игрока оставаться на экране, а все остальное перемещается влево. – aramusss

+0

Я обновил «Камера», теперь я перемещаю мир вместо node.parent !. Я до сих пор не могу использовать Update: Method. Или я неправильно понял вас? – Albert

3

Если вы ВГА e прокручивающийся фон, затем создайте три слоя в игре:

  • Передний уровень: содержит игрока, платформу и любые другие игровые узлы.
  • Фоновый слой: содержит фон, который перемещает определенное количество при перемещении игрока.
  • HUD: для всех счетных узлов, которые будут оставаться на своих позициях независимо от положения фона и игрока.

Теперь, согласно моему пониманию вашей проблемы, все ваши платформы имеют предопределенные позиции в сцене, которые не меняются. Изменяется только позиция узла игрока, и, следовательно, вы хотите, чтобы узел камеры следил за игроком и перемещал мир с ним. Если это так, вы можете попробовать следующее:

SKNode не имеет визуального контента, но имеет место в сцене. Это означает, что вы можете переместить узел вокруг и его дочерние узлы будут двигаться вместе с ним

Сначала добавьте следующие свойства класса -

var backgroundNode: SKNode! 
var foregroundNode: SKNode! 
var hudNode: SKNode! 

var player: SKNode! 
var platformType: PlatformType! 

// Добавить Фоновая узел

func createBackgroundNode() -> SKNode { 
    let backgroundNode = SKNode() 
    let node = SKSpriteNode(imageNamed:"") 

    node.position = CGPoint(x: xPosition , y: yPosition) 
    backgroundNode.addChild(node) 

    return backgroundNode 
} 

Затем вызовите это в игровой сцене

backgroundNode = createBackgroundNode() 
addChild(backgroundNode) 

Теперь добавить игрока:

func createPlayer() -> SKNode { 
    let playerNode = SKNode() 
    playerNode.position = CGPoint(x: x.position, y: y.position) 

    let sprite = SKSpriteNode(imageNamed: "Player") 
    playerNode.addChild(sprite) 

    return playerNode 
} 

Для того, чтобы добавить игрока, мы создадим основной слой, а затем добавить его к нему. Поместите это чуть ниже, где вы добавили backgroundNode.

foregroundNode = SKNode() 
addChild(foregroundNode) 

player = createPlayer() 
foregroundNode.addChild(player) 

Наконец, платформа, на которой вы хотите добавить, вы можете добавить его в качестве:

func createPlatformAtPosition(position: CGPoint) -> PlatformNode { 

    let node = PlatformNode() 
    let thePosition = CGPoint(x: position.x, y: position.y) 
    node.position = thePosition 
    node.name = "NODE_PLATFORM" 

    var sprite: SKSpriteNode 
    sprite = SKSpriteNode(imageNamed: "Platform") 
    node.addChild(sprite) 

    return node 
} 

Наконец добавить это к сцене игры под foregroundNode.addChild (игрок)

let platform = createPlatformAtPosition(CGPoint(x: 300, y: 270) 
    foregroundNode.addChild(platform) 

Надеюсь, это поможет вам немного.