Swift / SpriteKit按钮拖动取消不起作用?

时间:2016-09-06 09:02:51

标签: swift

您好我需要您的帮助我现在已经找了一段时间找到答案。

我也简化了代码,以摆脱你不需要知道的所有信息/垃圾。

我使用SpriteKit和Swift进行IOS游戏的主菜单场景。有一个主菜单播放按钮。我想要的是当按下按钮时按钮会变大一点。当我的手指松开时,按钮变小。使用override func touchesBegan / touchesEnded可以正常工作。我的问题是当我的手指被拖离按钮喜欢取消。该按钮不会恢复原始大小。我很确定我需要使用

override func touchesCancelled(touches: Set<UITouch>?, withEvent event: UIEvent?) {} 

但是经过多次尝试,当我的手指被拖出按钮时,我无法获得将按钮恢复到原始尺寸的预期效果。谢谢你的帮助。

import Foundation
import SpriteKit
import UIKit

class StartScene: SKScene {

    var playButton: SKNode! = nill  

override func didMoveToView(view: SKView) {

        // Create PlayButton image
        playButton = SKSpriteNode(imageNamed: "playButtonStatic")
        // location of Button
        playButton.position = CGPoint(x:CGRectGetMidX(self.frame), y:520);
        self.addChild(playButton)
        playButton.setScale(0.5)
}



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


        for touch: AnyObject in touches {
            let location = touch.locationInNode(self)
                if playButton.containsPoint(location) {
                   playButton.setScale(0.6)}}}



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

    for touch: AnyObject in touches {

        let location = touch.locationInNode(self)
            if playButton.containsPoint(location) {
                playButton.setScale(0.5)
        }}}



// Problem Area

override func touchesCancelled(touches: Set<UITouch>?, withEvent event: UIEvent?) {
    for touch: AnyObject in touches! {

        let location = touch.locationInNode(self)
            if playButton.containsPoint(location) {
               playButton.setScale(0.5)
        }}}

}

感谢您的回复

2 个答案:

答案 0 :(得分:1)

发现解决方案在TouchesEnded中使用Else语句

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

for touch: AnyObject in touches {

    let location = touch.locationInNode(self)
        if playButton.containsPoint(location) {
            playButton.setScale(0.5)

    }
        else
        {
            playButton.setScale(0.5)
    }}

答案 1 :(得分:1)

您说您找到了解决方案,但这是一个更简单的解决方案:使用我专门为SpriteKit按钮设计的自定义类。 Link to the GitHub that has the class file.通过本课程,您根本不必担心它,它会从您的触摸功能中删除不必要的代码。 JKButtonNodes有3种状态:正常,突出显示和禁用。如果你从父母那里删除它,你也不必担心将它设置为零。

要声明变量,请执行此操作。暂时忽略playButtonAction错误。

var playButton = JKButtonNode(background: SKTexture(imageNamed: "playButtonStatic"), action: playButtonAction)

该动作是按下按钮时松开的功能。在班上的任何地方创建这样的函数。

func playButtonAction(button: JKButtonNode) {
    //Whatever the button does when pressed goes here
}

然后你可以在didMoveToView中设置它的属性。

playButton.position = CGPoint(x:CGRectGetMidX(self.frame), y:520)

//These are the 3 images you want to be used when pressed/disabled
//You can create a bigger image for when pressed as you want.
playButton.setBackgroundsForState(normal: "playButtonStatic", highlighted: "playButtonHighlighted", disabled: "")

addChild(playButton)

那就是它!如果用户将手指移开,JKButtonNode类本身已经取消了触摸,除非用户成功按下按钮并将手指放在其上,否则它也不会调用该函数。您还可以执行其他操作,例如禁用播放声音等。

使用JKButtonNode的优秀专家是,您不必再在整个地方拥有代码,因为它不需要触摸功能中的任何代码。