Как остановить движение спрайта при касании и перемещении за пределы узла (кнопки) - PullRequest
0 голосов
/ 03 июня 2019

Я работаю над простой игрой для раннеров, у меня всего 3 шапододы, узел игрока, который представляет собой просто шапенод (redbox, 30 x 30) с кнопками влево / вправо, в основном два шапанода.

Мне удалосьустановить флаги и увеличить позицию узла игрока X и переместить его влево и вправо с помощью кнопок в методе touchesBegan и остановить движение в методе touchesEnded , все работает нормально.

Проблема в том, что если я коснусь, скажем, правой кнопки, игрок переместится вправо, как и ожидалось.Но если я коснусь и переместу свой палец за пределы кнопки в любом направлении, игрок будет постоянно двигаться, пока я снова касаюсь этой кнопки, он останавливается.В противном случае он продолжает двигаться, а другая кнопка также не останавливает его.

Я использовал touchesMoved метод, чтобы остановить движение игрока, когда я двигаю пальцем, но это не решает проблемутак как метод touchesMoved запускается с малейшим движением касания, даже когда мой палец слегка трясется.Я хочу, чтобы метод touchesMoved вызывался, когда мой палец перемещается с кнопки, а не с кнопки.

Как я могу остановить движение спрайта при касании и выходе из узла (кнопка) границы?

Ответы [ 2 ]

0 голосов
/ 07 июня 2019

У меня работает этот код:

class GameScene: SKScene {

var player = SKSpriteNode()
var left = SKSpriteNode()
var right = SKSpriteNode()
var jumpbtn = SKSpriteNode()
var leftbtnPressed = false
var rightbtnPressed = false
var jump = false
var hSpeed: CGFloat = 2.0


override func didMove(to view: SKView) {

    let border = SKPhysicsBody(edgeLoopFrom: self.frame)
    border.friction = 0
    self.physicsBody = border

    jumpbtn = self.childNode(withName: "jumpbtn") as! SKSpriteNode
    player = self.childNode(withName: "r1") as! SKSpriteNode
    left = self.childNode(withName: "leftbtn") as! SKSpriteNode
    right = childNode(withName: "rightbtn") as! SKSpriteNode


}//didmove to view


func moveRight(){
    player.position = CGPoint(x: player.position.x + hSpeed, y: player.position.y)
}
func moveLeft (){
    player.position = CGPoint(x: player.position.x - hSpeed, y: player.position.y)
}

func movement (){
    if rightbtnPressed == true {
        moveRight()
    }
    if leftbtnPressed == true {
        moveLeft()
    }
}//movement


func CheckButton(position : CGPoint) {
    if right.contains(position){
        rightbtnPressed = true
    }
    if left.contains(position) {
        leftbtnPressed = true
    }
    else {
        leftbtnPressed = false
        rightbtnPressed = false
    }

}// checkbutton


func jumping (){
    if jump == true {
        player.physicsBody?.applyImpulse(CGVector(dx:0, dy: 5.0))
    }
}// jumping


override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

    for touch in touches {
        let positionINScene = touch.location(in: self)
        let touchednode = self.atPoint(positionINScene).name

        if touchednode == "rightbtn"{
            rightbtnPressed = true
        }
        if touchednode == "leftbtn"{
            leftbtnPressed = true
        }
        if touchednode == "jumpbtn"{
            jump = true
            jumping()  
        }  
    }
}//touchesbegan


override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {

    let touch = touches.first
    let positionInScene = touch?.location(in: self)

    CheckButton(position: positionInScene!)
}


override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {

    for touch in touches {
        let positionINScene = touch.location(in: self)
        let touchednode = self.atPoint(positionINScene)

        if touchednode.name == "rightbtn"{
            rightbtnPressed = false
        }
        if touchednode.name == "leftbtn"{
            leftbtnPressed = false
        }
        if touchednode.name == "jumpbtn" {
            jump = false
        }
    }
}//touchesEnded

override func update(_ currentTime: TimeInterval) {
    movement()

}

Когда я нажимаю левую или правую кнопку, игрок начинает двигаться, как и ожидалось, но проблема в том, что игрокдвижется, скажем вправо, если я касаюсь кнопки прыжка, игрок делает паузу, двигаясь туда, куда он должен двигаться, и прыгая простыми словами, я не могу двигаться и прыгать одновременно

0 голосов
/ 06 июня 2019

У вас есть 3 события касания:

  • touchesBegan; проверить, если пользователь нажимает на одну из кнопок перемещения (если да - переместить игрока, если нет - вернуть)
  • touchesMoved; проверить, находится ли пользовательский тап все еще внутри границ кнопки перемещения (если да - продолжить движение игрока, если нет - остановить движение)
  • touchesEnded; остановить движение игрока

Вы можете решить свою проблему, проверив, находится ли палец пользователя над областью кнопок.

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?)
{
    // nothing here

    let touch = touches.first
    let position_in_scene = touch!.location(in: self)

    check_button(position: position_in_scene)
}

func check_button(position : CGPoint)
{

    if right_button.contains(position)
    {
        // the tap was inside button boundaries
        player.move_left()
    }
    else
    {
        // the tap was outside button boundaries
        player.stop()
    }
}
...