Spritekit -- 保持场景以高于特定高度的精灵为中心

Posted

技术标签:

【中文标题】Spritekit -- 保持场景以高于特定高度的精灵为中心【英文标题】:Spritekit -- keep scene centered on sprite above certain height 【发布时间】:2016-08-04 10:06:20 【问题描述】:

在我的游戏中,镜头以英雄为中心,但仅在 x 轴上。当他向左或向右移动时,相机(场景)会随着他移动,但在他跳跃时保持不变。

可以像这样简单地复制设置:

import SpriteKit

class GameScene: SKScene 

    let ship = SKSpriteNode(imageNamed: "Spaceship")
    let ground = SKShapeNode(rectOfSize: CGSizeMake(600, 30))

    let world = SKNode()

    override func didMoveToView(view: SKView) 

        self.anchorPoint = CGPointMake(0.5, 0.5)

        self.ship.setScale(0.2)
        self.ship.physicsBody = SKPhysicsBody(circleOfRadius: self.ship.size.width / 2)

        self.ground.position = CGPointMake(0, -200)
        self.ground.fillColor = SKColor.redColor()
        self.ground.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(600, 30))
        self.ground.physicsBody?.dynamic = false

        world.addChild(self.ship)
        world.addChild(self.ground)

        self.addChild(world)
    

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) 
        self.ship.physicsBody?.applyImpulse(CGVectorMake(0, 60))
    

    override func didFinishUpdate() 
        let cameraPositionInScene = self.convertPoint(self.ship.position, fromNode: world)

        // the position is updated only in the x axis
        self.world.position = CGPointMake(self.world.position.x - cameraPositionInScene.x,
                                          self.world.position.y)
    

但是,一旦英雄达到一定高度,我希望摄像机在 y 轴上移动(这样他就可以继续走得更高,以防“云中”的关卡上升)。

我尝试将 didFinishUpdate() 函数中的位置更新更改为:

if self.ship.position.y > 100 
        self.world.position = CGPointMake(self.world.position.x - cameraPositionInScene.x,
                                          self.world.position.y - cameraPositionInScene.y)
     else 
        self.world.position = CGPointMake(self.world.position.x - cameraPositionInScene.x,
                                          self.world.position.y)
    

它确实开始跟随船超过一定高度,但从未完全回到原来的位置,我一直无法弄清楚为什么。

【问题讨论】:

我知道这对解决这个问题没有帮助,但是您是否研究过 SKCameraNode?它可能会作为副作用解决您的问题。 【参考方案1】:

在您的didFinishUpdate() 方法中,仅当船的 y 坐标高于 100 时才更改世界的 y 坐标。在船从 105 下降到 95 的情况下,不再更新世界的 y 坐标。

我希望删除 if 语句并始终更新世界位置以考虑您的相机位置以帮助您。

编辑: 我已经提出了一些示例代码,我将使用 SKCameraNode,因为我真的认为这会在将来让你头疼。我没有运行这个,所以你可能不得不在这里和那里抵消一些东西。我已经为这种带有和不带有 SKCameraNode 的相机功能编写了代码,它是一个很好的类,框架基本上免费为您提供。

override func didMoveToView(view: SKView) 
  // ...
  camera = SKCameraNode()
  // ...


override func didFinishUpdate() 
  var cameraPosition = CGPointMake(self.ship.position)
  cameraPosition.y = MAX(0,cameraPosition.y - 100)
  self.camera.position = cameraPosition

【讨论】:

是的,但我只想在角色高于某个高度时更新 y 轴。在正常操作中,跳跃不会达到这个高度,并且相机不会在 y 轴上移动。只有在跳跃了几个街区等之后,相机才会开始在 y 轴上跟随角色。

以上是关于Spritekit -- 保持场景以高于特定高度的精灵为中心的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SpriteKit 使精灵跳到特定高度?

SpriteKit 节点粘在场景边缘/不反弹

Swift / Spritekit:通过特定场景播放音乐

Summernote富文本编辑器-限制图片高于特定高度和宽度

Sprite Kit 场景编辑器 GameScene.sks 场景宽度和高度

在特定场景中构建 SpriteKit/GameKit 排行榜