Sprite kit 让SKCameraNode跟随英雄Spritenode

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

我似乎无法理解这一点。我试过很多不同的方法,但似乎都不管用。根据我目前的代码,相机和英雄永远不会排成一行,当我触摸屏幕时,场景似乎跳得很远。我想做的就是当我触摸屏幕时,让英雄移动到触摸点,让相机跟随他。有没有办法把相机锁定在英雄的Spritode上

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代码吗?我没有能力初始化游戏场景的大小。