仅在特定范围内移动spritekit节点

时间:2018-09-09 16:32:17

标签: ios swift sprite-kit game-physics skspritenode

我是spritekit的新手,所以这看起来像是一个愚蠢的问题,但我不知道。播放器(以蓝色圆圈显示)只能越过线上方并进入方块内部。我添加了一个操纵杆,用户可以在左上方向上或向下移动。我希望播放器仅限于线条,因此当它到达左边缘时,用户应将操纵杆向右移动。我该如何实现?

我试图在如下所示的override func update(_ currentTime: TimeInterval)函数中更新玩家位置,以更新枚举位置并每次在移动逻辑中对其进行检查;

override func update(_ currentTime: TimeInterval) {
if((player?.position.x)!.rounded() <=  self.barra.frame.minX.rounded()){
    player?.playerPosition == .left
}
print(player?.position)
}

logic 我如何声明正方形;

let barra = SKShapeNode(rectOf: CGSize(width: 600, height: 300)) //Line
override func sceneDidLoad() {
    player = self.childNode(withName: "player") as? Player
    player?.physicsBody?.categoryBitMask = playerCategory
    player?.physicsBody?.collisionBitMask = noCategory
    player?.physicsBody?.contactTestBitMask = enemyCategory | itemCategory
    player?.playerPosition = .left
    barra.name = "bar"
    barra.fillColor = SKColor.clear
    barra.lineWidth = 3.0
    barra.position = CGPoint(x: 0, y: 0)

    self.addChild(barra)

    player?.position = CGPoint(x: barra.frame.minX , y: barra.frame.minY)
}

我如何移动播放器;

 override func didMove(to view: SKView) {
    /* Setup your scene here */
    backgroundColor = UIColor.black
    physicsBody = SKPhysicsBody(edgeLoopFrom: frame)
    moveAnalogStick.position = CGPoint(x: moveAnalogStick.radius + 15, y: moveAnalogStick.radius + 15)
    addChild(moveAnalogStick)
    moveAnalogStick.stick.color = UIColor.white
    //MARK: Handlers begin
    moveAnalogStick.beginHandler = { [unowned self] in

        guard let aN = self.player else {
            return
        }
        //aN.run(SKAction.sequence([SKAction.scale(to: 0.5, duration: 0.5), SKAction.scale(to: 1, duration: 0.5)]))
    }

    moveAnalogStick.trackingHandler = { [unowned self] data in

        guard let aN = self.player else {
            return
        }
        if(self.player?.playerPosition == .left){
            aN.position = CGPoint(x: aN.position.x, y: aN.position.y + (data.velocity.y * 0.12))
        }
    }

    moveAnalogStick.stopHandler = { [unowned self] in

        guard let aN = self.player else {
            return
        }

       // aN.run(SKAction.sequence([SKAction.scale(to: 1.5, duration: 0.5), SKAction.scale(to: 1, duration: 0.5)]))
    }


    //MARK: Handlers end
    let selfHeight = frame.height
    let btnsOffset: CGFloat = 10
    let btnsOffsetHalf = btnsOffset / 2


    view.isMultipleTouchEnabled = true
}

播放器类:

enum Position{
case left
case right
case up
case down
case inside
}
enum CanMove{
case upDown
case leftRight
case all
}
class Player: SKSpriteNode {

var playerSpeed: CGFloat = 0.0
var playerPosition: Position = .left //Default one
var canMove: CanMove = .upDown

func move(){

}
}

0 个答案:

没有答案