swift 4 个带有 spritekit 的两个方向键

swift 4 two dpads with spritekit

A screenshot of my game 我想制作一个游戏(使用 Spritekit),您可以在其中使用左侧方向键在已经可以使用的瓦片地图中移动玩家。使用正确的方法,您可以瞄准对手,这也很有效。虽然我启用了多点触控,但只有一个控制器同时工作。

摇杆与方向键相同

    import SpriteKit
    import GameplayKit

    class GameScene: SKScene {

//These are just the touch functions

    //touch functions

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        for _ in touches {
            if touches.first!.location(in: cam).x < 0 {
                moveStick.position = touches.first!.location(in: cam)
            }
            if touches.first!.location(in: cam).x > 0 {
                shootStick.position = touches.first!.location(in: cam)
            }
        }
    }

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {     
        for _ in touches {
            if touches.first!.location(in: cam).x < 0 {
                moveStick.moveJoystick(touch: touches.first!)
            }
            if touches.first!.location(in: cam).x > 0 {
                shootStick.waponRotate(touch: touches.first!)
            }
        }
    }

    open override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {
        for _ in touches {
            resetMoveStick()
            resetShootStick()
        }
    }

    open override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        for _ in touches {
            resetMoveStick()
            resetShootStick()
        }
    }



    //  update function
    override func update(_ currentTime: TimeInterval) {
        // Called before each frame is rendered

        let jSForce = moveStick.velocityVector
        self.player.position = CGPoint(x: self.player.position.x + jSForce.dx,
                                       y: self.player.position.y + jSForce.dy)
        cam.position = player.position

    }
}

正如 KnightOfDragon 指出的那样,您正在使用 .first。这意味着您的代码正在寻找场景中的第一次触摸,然后从那里开始。您的游戏不会让您同时使用两个操纵杆,因为您不会让它们同时使用。

您在各种触摸功能中的这些 if 语句:

for _ in touches {
    if touches.first!.location(in: cam).x < 0 {
    }
    if touches.first!.location(in: cam).x > 0 {
    }
}

应该是这样的:

for touch in touches {
    let location = touch.location(in: self)
    if location.x < 0 {
        moveStick.moveJoystick(touch: location)
    }
    if if location.x > 0 {
        shootStick.waponRotate(touch: location)
    }
}

这应该可以解决您遇到的任何错误。