Ios 使用贴图边界和固定y位置约束角色上的摄影机-SpriteKit

Ios 使用贴图边界和固定y位置约束角色上的摄影机-SpriteKit,ios,swift,camera,sprite-kit,position,Ios,Swift,Camera,Sprite Kit,Position,我目前正在开发一款游戏,它有一个垂直的tileMap,屏幕底部有一个只能在x轴上移动的角色。目前,为了让游戏看起来像是在滚动,我给了我的角色一个dx:500的速度,让他在tileMap上移动 当我运行模拟器时,摄影机开始向左下角移动,然后看起来它正在捕捉我的场景内容。我怎样才能解决这个问题 我尝试实现一个摄像头,当玩家向地图边缘移动(在x轴上)时跟踪他,它可以工作,但只是部分工作。如何让摄影机一直跟踪节点直到场景边缘,并在到达终点时停止?我不知道如何在x轴上给相机边界以停止 另外,我希望我的玩家

我目前正在开发一款游戏,它有一个垂直的tileMap,屏幕底部有一个只能在x轴上移动的角色。目前,为了让游戏看起来像是在滚动,我给了我的角色一个dx:500的速度,让他在tileMap上移动

当我运行模拟器时,摄影机开始向左下角移动,然后看起来它正在捕捉我的场景内容。我怎样才能解决这个问题

我尝试实现一个摄像头,当玩家向地图边缘移动(在x轴上)时跟踪他,它可以工作,但只是部分工作。如何让摄影机一直跟踪节点直到场景边缘,并在到达终点时停止?我不知道如何在x轴上给相机边界以停止

另外,我希望我的玩家在整个游戏中都在同一个y坐标上,只是让他水平移动(大约70%在屏幕上)。我如何实现我的速度,使他在地图上向上移动,同时保持他在恒定的y轴值上

class GameScene: SKScene, SKPhysicsContactDelegate {
var worldNode = SKNode()
var bgNode = SKNode()
var fgNode = SKNode()
var cameraNode: SKNode!
var background: SKNode!
var player: Character1Node!
var platform: SKTileMapNode!
var previousTranslateX: CGFloat = 0.0


override func didMove(to view: SKView) {
    setupNodes()
    self.anchorPoint = CGPoint(x: 0.5, y: 0.5)
    cameraNode.position = CGPoint(x: size.width/2, y: size.height/2)

    //Panning for dragging player
    let pan = UIPanGestureRecognizer(target: self, action: #selector(GameScene.dragPlayer(sender:)))
    self.view?.addGestureRecognizer(pan)

}

func dragPlayer(sender: UIPanGestureRecognizer) {

    //retrieve pan movement along the x-axis of the view since the gesture began
    let currentTranslateX = sender.translation(in: view!).x

    //calculate translation since last measurement
    let translateX = currentTranslateX - previousTranslateX

    //move shape
    let adjustment:CGFloat = 2.0
    player.parent!.position = CGPoint(x: player.parent!.position.x + (translateX*adjustment), y:player.parent!.position.y)


    //reset previous measuremnt
    if sender.state == .ended{
        previousTranslateX = 0
    } else {
        previousTranslateX = currentTranslateX
    }
}



func setupNodes(){

    //Connecting variables to scene
    worldNode = childNode(withName: "World")!
    bgNode = worldNode.childNode(withName: "Background")!
    background = bgNode.childNode(withName: "Overlay")!.copy() as! SKNode
    fgNode = worldNode.childNode(withName: "Foreground")!
    cameraNode = worldNode.childNode(withName: "Camera")!


    //Platform physics
    platform = fgNode.childNode(withName: "Level1Map") as! SKTileMapNode
    let bodySize = CGSize(width: 150, height: 190)
    platform.physicsBody = SKPhysicsBody(rectangleOf: bodySize)
    platform.physicsBody!.isDynamic = true
    platform.physicsBody!.affectedByGravity = false
    platform.physicsBody!.linearDamping = 0
    platform.physicsBody!.categoryBitMask = PhysicsCategory.Platform
    platform.physicsBody!.collisionBitMask = PhysicsCategory.None
    platform.physicsBody!.velocity = CGVector(dx: 0, dy: 0)

    enumerateChildNodes(withName: "//*", using: {node, _ in
        if let customNode = node as? CustomNodeEvents {
            customNode.didMoveToScene()
        }
    })

    player = platform.childNode(withName: "//character1") as! Character1Node

}

override func update(_ currentTime: TimeInterval) {
    let position = player.parent!.position

    //Platform Tiles
    let column = platform.tileColumnIndex(fromPosition: position)
    let row = platform.tileRowIndex(fromPosition: position)
    let objectTile = platform.tileDefinition(atColumn: column, row: row)
    //print(objectTile)

    if let _ = objectTile?.userData?.value(forKey: "tile2"){
        print("jumping tile")
    }

    if let _ = objectTile?.userData?.value(forKey: "tile1"){
        print("platform tile")
    }

    print(player.parent!.position)


}

override func didSimulatePhysics() {
    cameraNode.position = CGPoint(x: player.parent!.position.x, y: player.parent!.position.y)
    self.centerOnNode(node: cameraNode)
}

func centerOnNode(node: SKNode) {
    let cameraPositionInScene: CGPoint = node.scene!.convert(node.position, from: worldNode)
    node.parent!.run(SKAction.move(to: CGPoint(x:node.parent!.position.x - cameraPositionInScene.x, y:node.parent!.position.y - cameraPositionInScene.y), duration: 2.0))

}

从GameSecene.sks中删除相机节点和代码中的引用。确保从GameSecene.sks右侧的属性检查器中的选定摄影机中删除“摄影机”。用以下内容替换游戏场景中cameraNode的所有实例:

在其他变量声明旁边添加:

var cameraNode: SKCameraNode!
在didMove(要查看:…)中添加:


这将导致cameraNode相对于玩家的位置。无论玩家走到哪里,它都会跟着他

在更新函数中,如果使用
player.position
而不是
player.parent!。位置
,所以声明应该是
让位置=玩家。位置
?我很好奇为什么您需要使用players父位置。@MarkBrownsword我必须使用player.position,因为我正在使用引用节点引用我的Character1Node。对提出有效解决方案而没有理由的旧答案进行否决是不可取的
cameraNode = SKCameraNode()
camera = cameraNode
player.addChild(cameraNode)