Перемещать спрайтекит-узел только в определенных пределах - PullRequest
0 голосов
/ 09 сентября 2018

Я новичок в спрайтеките, так что это выглядит глупо, но я не могу понять. Игрок (показан синим кружком) может идти только выше линий и внутри квадрата. Я добавил джойстик, пользователь может идти вверх или вниз над левой линией. Я хочу, чтобы игрок был ограничен только линией, поэтому, когда он подходит к левому краю, пользователь должен переместить джойстик вправо. Как мне этого добиться?

Я пытался обновить позицию игрока в функции 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(){

}
}
...