首页 > 解决方案 > 如何在触摸并移出节点(按钮)边界时停止精灵的移动

问题描述

我正在开发一个简单的跑步者游戏,我只有 3 个 shapenodes 一个玩家节点,它只是一个 shapenode(redbox,30 x 30),左/右按钮基本上是两个 shapenodes。

我设法设置标志并增加播放器节点的位置 X 并使用touchesBegan方法中的按钮左右移动它并停止touchesEnded方法中的移动一切正常。

问题是,如果我触摸让我们说右键,玩家会按预期向右移动。但是,如果我在任何方向上触摸并将手指移出按钮边界,只要我再次触摸该按钮,播放器就会不断移动,然后它就会停止。否则它会继续移动,另一个按钮也不会停止它。

当我移动手指时,我使用touchesMoved方法停止播放器的移动,但这并不能解决问题,因为即使我的手指轻微抖动,touchesMoved方法也会触发最轻微的触摸移动。我希望当我的手指离开按钮而不是按钮时调用touchesMoved方法。

当触摸并移出节点(按钮)边界时,如何停止精灵的移动?

标签: iosswiftsprite-kit

解决方案


我正在运行此代码:

类游戏场景: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()

}

当我触摸左或右按钮时,播放器开始按预期移动,但问题是当播放器移动时让我们说如果我触摸跳转按钮,播放器会暂停移动它应该移动的地方并用简单的话跳跃我可以不能同时移动和跳跃


推荐阅读