Sprite kit 让SKCameraNode跟随英雄Spritenode
我似乎无法理解这一点。我试过很多不同的方法,但似乎都不管用。根据我目前的代码,相机和英雄永远不会排成一行,当我触摸屏幕时,场景似乎跳得很远。我想做的就是当我触摸屏幕时,让英雄移动到触摸点,让相机跟随他。有没有办法把相机锁定在英雄的Spritode上Sprite kit 让SKCameraNode跟随英雄Spritenode,sprite-kit,swift2,ios9,xcode7,Sprite Kit,Swift2,Ios9,Xcode7,我似乎无法理解这一点。我试过很多不同的方法,但似乎都不管用。根据我目前的代码,相机和英雄永远不会排成一行,当我触摸屏幕时,场景似乎跳得很远。我想做的就是当我触摸屏幕时,让英雄移动到触摸点,让相机跟随他。有没有办法把相机锁定在英雄的Spritode上 import SpriteKit let tileMap = JSTileMap(named: "level2.tmx") let hero = SKSpriteNode(imageNamed: "hero") let theCamera: SK
import SpriteKit
let tileMap = JSTileMap(named: "level2.tmx")
let hero = SKSpriteNode(imageNamed: "hero")
let theCamera: SKCameraNode = SKCameraNode()
class GameScene: SKScene {
override func didMoveToView(view: SKView) {
/* Setup your scene here */
self.anchorPoint = CGPoint(x: 0, y: 0)
self.position = CGPoint(x: 0, y: 0)
hero.position = CGPoint(x: CGRectGetMidX(self.frame), y: CGRectGetMidY(self.frame))
hero.xScale = 0.5
hero.yScale = 0.5
hero.zPosition = 2
tileMap.zPosition = 1
tileMap.position = CGPoint(x: 0, y: 0)
self.addChild(tileMap)
self.addChild(hero)
self.addChild(theCamera)
self.camera = theCamera
}
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
/* Called when a touch begins */
for touch in touches {
let location = touch.locationInNode(self)
let action = SKAction.moveTo(location, duration: 1)
hero.runAction(action)
}
}
override func update(currentTime: CFTimeInterval) {
/* Called before each frame is rendered */
self.camera?.position = hero.position
}
}
导入SpriteKit
让tileMap=JSTileMap(命名为:“level2.tmx”)
让hero=SKSpriteNode(图像名为“hero”)
让摄像机:SKCameraNode=SKCameraNode()
类游戏场景:SKScene{
覆盖func didMoveToView(视图:SKView){
/*在这里设置场景*/
self.anchorPoint=CGPoint(x:0,y:0)
self.position=CGPoint(x:0,y:0)
hero.position=CGPoint(x:CGRectGetMidX(self.frame),y:CGRectGetMidY(self.frame))
hero.xScale=0.5
hero.yScale=0.5
hero.zPosition=2
tileMap.zPosition=1
tileMap.position=CGPoint(x:0,y:0)
self.addChild(tileMap)
self.addChild(英雄)
self.addChild(theCamera)
self.camera=摄像机
}
覆盖功能触摸开始(触摸:设置,withEvent事件:UIEvent?){
/*当触摸开始时调用*/
接触{
let location=touch.locationInNode(自)
let action=SKAction.moveTo(位置、持续时间:1)
英雄。动作(动作)
}
}
覆盖函数更新(currentTime:CFTimeInterval){
/*在渲染每个帧之前调用*/
self.camera?.position=hero.position
}
}
之所以看到场景跳得很远,是因为scene.size
不等于屏幕大小。我想你可以这样初始化你的第一个场景:
// GameViewController.swift
if let scene = GameScene(fileNamed:"GameScene") {...}
该代码将加载默认大小为1024*768的GameSecene.sks。但由于您以编程方式添加了SKSpriteNode
,因此可以通过以下方式初始化场景以适应屏幕大小:
// GameViewController.swift
// Only remove if statement and modify
let scene = GameScene(size: view.bounds.size) ...
这将解决你的大部分问题。此外,我建议使用SKAction
移动摄影机节点:
override func update(currentTime: CFTimeInterval) {
let action = SKAction.moveTo(hero.position, duration: 0.25)
theCamera.runAction(action)
}
最后一件事是,在开始时添加这条线以将相机与英雄对齐:
self.camera?.position = hero.position
您的意思是当您触摸屏幕时,
英雄
将移动到您触摸的位置,摄像头
将跟随/对齐英雄。因此,<代码>英雄<代码>现在仍然出现在屏幕的中间?是的,这正是我的意思。那正是我丢失的部分。谢谢@比尔,你能给我看看你的GameViewController.swift代码吗?我没有能力初始化游戏场景的大小。