ios – 在SpriteKit中创建按钮:Swift

前端之家收集整理的这篇文章主要介绍了ios – 在SpriteKit中创建按钮:Swift前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想在SpriteKit或SKScene中创建一个按钮,将视图发送到另一个视图控制器.

我尝试使用“performSegue with identifier”,但显然SKScene不支持功能.
如何使用SpriteKit创建一个将视图发送到另一个视图的按钮?

这是我尝试用来执行此操作的代码.

带有“HomeButton.prepareForSegueWithIdentifier()”的行只是一个例子.它实际上不会让我添加“prepareForSegue”部分,它不支持它< ---我的意思是,当我去添加它时,它是无法识别的.

class GameOverScene: SKScene {

     var HomeButton: SKNode! = nil


    init(size: CGSize,won: Bool) {
        super.init(size: size)

        backgroundColor = SKColor.whiteColor()

        HomeButton = SKSpriteNode(color: SKColor.blueColor(),size: CGSize(width: 100,height: 100))
        HomeButton.position = CGPointMake(CGRectGetMidX(self.frame),CGRectGetMidY(self.frame))
        HomeButton.userInteractionEnabled = true
        self.addChild(HomeButton)

        let message = won ? "You Won!" : "You Lose!"





        let label = SKLabelNode(fontNamed: "Title 1")
        label.text = message
        label.fontSize = 40
        label.fontColor = SKColor.blackColor()
        label.position = CGPoint(x: size.width/2,y: size.height/2)
        addChild(label)

        runAction(SKAction.sequence([SKAction.waitForDuration(3.0),SKAction.runBlock() {
            let reveal = SKTransition.flipHorizontalWithDuration(0.5)
            let scene = GameScene(size: size)
            self.view?.presentScene(scene,transition: reveal)
        }
        ]))


    }

    override func touchesEnded(touches: Set<UITouch>,withEvent event: UIEvent?) {
        for touch: AnyObject in touches {
            let location = touch.locationInNode(self)

            if HomeButton.containsPoint(location) {

                HomeButton.prepareForSegueWithIdentifier()

            }
        }
    }

注意:我尝试过使用按钮,但它们不适用于SKScene.

如果有任何混淆,我会回应.

解决方法

如果你需要在SpriteKit中创建一个按钮,我认为这个按钮必须有所有或部分可用的动作来做任何你想做的事情(就像UIButton所做的那样)

在这里,您可以找到一个构建SpriteKit按钮的简单类,称为FTButtonNode:

class FTButtonNode: SKSpriteNode {

    enum FTButtonActionType: Int {
        case TouchUpInside = 1,TouchDown,TouchUp
    }

    var isEnabled: Bool = true {
        didSet {
            if (disabledTexture != nil) {
                texture = isEnabled ? defaultTexture : disabledTexture
            }
        }
    }
    var isSelected: Bool = false {
        didSet {
            texture = isSelected ? selectedTexture : defaultTexture
        }
    }

    var defaultTexture: SKTexture
    var selectedTexture: SKTexture
    var label: SKLabelNode

    required init(coder: NSCoder) {
        fatalError("NSCoding not supported")
    }

    init(normalTexture defaultTexture: SKTexture!,selectedTexture:SKTexture!,disabledTexture: SKTexture?) {

        self.defaultTexture = defaultTexture
        self.selectedTexture = selectedTexture
        self.disabledTexture = disabledTexture
        self.label = SKLabelNode(fontNamed: "Helvetica");

        super.init(texture: defaultTexture,color: UIColor.whiteColor(),size: defaultTexture.size())
        userInteractionEnabled = true

        //Creating and adding a blank label,centered on the button
        self.label.verticalAlignmentMode = SKLabelVerticalAlignmentMode.Center;
        self.label.horizontalAlignmentMode = SKLabelHorizontalAlignmentMode.Center;
        addChild(self.label)

        // Adding this node as an empty layer. Without it the touch functions are not being called
        // The reason for this is unknown when this was implemented...?
        let bugFixLayerNode = SKSpriteNode(texture: nil,color: UIColor.clearColor(),size: defaultTexture.size())
        bugFixLayerNode.position = self.position
        addChild(bugFixLayerNode)

    }

    /**
     * Taking a target object and adding an action that is triggered by a button event.
     */
    func setButtonAction(target: AnyObject,triggerEvent event:FTButtonActionType,action:Selector) {

        switch (event) {
        case .TouchUpInside:
            targetTouchUpInside = target
            actionTouchUpInside = action
        case .TouchDown:
            targetTouchDown = target
            actionTouchDown = action
        case .TouchUp:
            targetTouchUp = target
            actionTouchUp = action
        }

    }

    /*
    New function for setting text. Calling function multiple times does
    not create a ton of new labels,just updates existing label.
    You can set the title,font type and font size with this function
    */

    func setButtonLabel(title: NSString,font: String,fontSize: CGFloat) {
        self.label.text = title as String
        self.label.fontSize = fontSize
        self.label.fontName = font
    }

    var disabledTexture: SKTexture?
    var actionTouchUpInside: Selector?
    var actionTouchUp: Selector?
    var actionTouchDown: Selector?
    weak var targetTouchUpInside: AnyObject?
    weak var targetTouchUp: AnyObject?
    weak var targetTouchDown: AnyObject?

    override func touchesBegan(touches: Set<UITouch>,withEvent event: UIEvent?) {
        if (!isEnabled) {
            return
        }
        isSelected = true
        if (targetTouchDown != nil && targetTouchDown!.respondsToSelector(actionTouchDown!)) {
            UIApplication.sharedApplication().sendAction(actionTouchDown!,to: targetTouchDown,from: self,forEvent: nil)
        }
    }

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

        if (!isEnabled) {
            return
        }

        let touch: AnyObject! = touches.first
        let touchLocation = touch.locationInNode(parent!)

        if (CGRectContainsPoint(frame,touchLocation)) {
            isSelected = true
        } else {
            isSelected = false
        }

    }

    override func touchesEnded(touches: Set<UITouch>,withEvent event: UIEvent?) {
        if (!isEnabled) {
            return
        }

        isSelected = false

        if (targetTouchUpInside != nil && targetTouchUpInside!.respondsToSelector(actionTouchUpInside!)) {
            let touch: AnyObject! = touches.first
            let touchLocation = touch.locationInNode(parent!)

            if (CGRectContainsPoint(frame,touchLocation) ) {
                UIApplication.sharedApplication().sendAction(actionTouchUpInside!,to: targetTouchUpInside,forEvent: nil)
            }

        }

        if (targetTouchUp != nil && targetTouchUp!.respondsToSelector(actionTouchUp!)) {
            UIApplication.sharedApplication().sendAction(actionTouchUp!,to: targetTouchUp,forEvent: nil)
        }
    }

}

该来源于this Gist年提供

用法

let backTexture: SKTexture! = SKTexture(image:"backBtn.png")
let backTextureSelected: SKTexture! = SKTexture(image:"backSelBtn.png")  
let backBtn = FTButtonNode(normalTexture: backTexture,selectedTexture: backTextureSelected,disabledTexture: backTexture,size:backTexture.size())
backBtn.setButtonAction(self,triggerEvent: .TouchUpInside,action: #selector(GameScene.backBtnTap))
backBtn.position = CGPointMake(CGRectGetMidX(self.frame),CGRectGetMidY(self.frame))
backBtn.zPosition = 1
backBtn.name = "backBtn"
self.addChild(backBtn)

func backBtnTap() {
    print("backBtnTap tapped")
    // Here for example you can do:
    let transition = SKTransition.fadeWithDuration(0.5)
    let nextScene = MenuScene(size: self.scene!.size)
    nextScene.scaleMode = .ResizeFill
    self.scene?.view?.presentScene(nextScene,transition: transition)
}

猜你在找的iOS相关文章