我可以通过硬编码在我的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中使用它。
感谢您的帮助!
答案 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()
}
}