在GameViewController中连接UIButton以在SKScene(Swift)中工作

时间:2015-03-10 07:43:04

标签: ios swift uibutton

我可以通过硬编码在我的GameScene.swift(它拥有我的SKScene)的屏幕上添加一个按钮:

SWIFT CODE:

    rightControlPad = UIButton(frame: CGRectMake( 4, 580, 200, 150))
    rightControlPad.backgroundColor = UIColor.greenColor()
    rightControlPad.setTitle("Jump", forState: UIControlState.Normal)
    rightControlPad.addTarget(self, action: "buttonAction:", forControlEvents: UIControlEvents.TouchUpInside)
    rightControlPad.tag = 22;
    self.view?.addSubview( rightControlPad )

但是因为我不知道如何在故事板中为该按钮添加约束,这个选项对我来说不起作用。

所以,我想在故事板中创建一个按钮,然后在我的GameViewController中链接它并访问我的GameScene中的按钮(又名:点击按钮的模拟效果,这将使精灵跳转)。我在GameViewController中添加了按钮但是我无法对GameScene中的sprite做任何事情。我甚至尝试通过在调用GameScene的GameViewController中传递一个函数调用来测试它,它通过打印出一个语句来工作,但它会跳过导致精灵移动的代码。 例如:     GAMEVIEWCONTROLLER:     ** ...     var gameScene = GameScene()

@IBAction func likedThis(sender: UIButton) 
{
    gameScene.sendToButton( sender as UIButton )
}**

GAMESCENE:
**...
func sendToButton( sender: UIButton)
{
   println( "Test")
   self.sprite.physicsBody?.applyImpulse( CGVectorMake( 0, 35 ))
}**

输出只是:测试并且精灵不会移动。 但是,如果我使用上面的方法,我在屏幕上硬编码按钮 然后单击它,applyImpulse就在它将执行的功能中。就是这样 最奇怪的事情和我喜欢指导的事情。

所以我的问题是:有人可以解释如何硬编码约束 硬编码按钮 要么 告诉我如何访问我放在那里的GameViewController中的按钮 故事板并在GameScene中使用它。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

你不应该在你的SpriteKit Game上使用UIButton,因为你必须将它添加到SKView并在按钮进入屏幕时删除。

如果你想构建一个按钮或开关用于通用,你应该尝试我做的这个控件,使用它很直接: 您只需初始化所需的按钮/开关类型(ColoredSprite,Textured或TextOnly)

let control = TWButton(normalColor: SKColor.blueColor(), highlightedColor: SKColor.redColor(), size: CGSize(width: 160, height: 80))

初始化后,为它添加一个闭包(就像UIButton上的addTargetForSelector)

 control.addClosureFor(.TouchUpInside, target: self, closure: { (scene, sender) -> () in
            scene.testProperty = "Changed Property"
        })
    }

就是这样!有关GitHub页面上自述文件部分的更多信息:https://github.com/txaidw/TWControls

但是,如果您想在特定节点中实现,我就是这样做的:

internal override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
    let touch = touches.first as! UITouch
    let touchPoint = touch.locationInNode(self.parent)

    if self.containsPoint(touchPoint) {
        self.touchLocationLast = touchPoint
        touchDown()
    }
}

internal override func touchesMoved(touches: Set<NSObject>, withEvent event: UIEvent) {
    let touch = touches.first as! UITouch
    let touchPoint = touch.locationInNode(self.parent)
    self.touchLocationLast = touchPoint
}


internal override func touchesEnded(touches: Set<NSObject>, withEvent event: UIEvent) {
    let touch = touches.first as! UITouch
    let touchPoint = touch.locationInNode(self.parent)

        if let lastPoint = self.touchLocationLast where self.containsPoint(lastPoint) {
            // Ended inside
            touchUpInside()
        }
        else {
            // Ended outside
            touchUpOutside()
        }
}