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 -- 保持场景以高于特定高度的精灵为中心的主要内容,如果未能解决你的问题,请参考以下文章
Summernote富文本编辑器-限制图片高于特定高度和宽度