【问题标题】:My Sprite Kit button won't work in Swift我的 Sprite Kit 按钮在 Swift 中不起作用
【发布时间】:2016-07-13 12:22:52
【问题描述】:

您好,您看这个我想知道为什么我在 swift sprite kit 中的代码不起作用我可以运行它但是当我单击按钮时它不起作用(它不会进入场景)但是当我在 if 语句中添加了一个 println,然后单击它,它确实运行了 println。提前谢谢!

这是我的第一个场景的代码:

    //
//  GameScene.swift
//  Pocket Rocket
//
//  Created by Lucas Farleigh on 11/11/2014.
//  Copyright (c) 2014 Lucas Farleigh. All rights reserved.
//

import SpriteKit;

class GameScene: SKScene {

    let background = SKSpriteNode(imageNamed:"background")
    let playButton = SKSpriteNode(imageNamed: "playbutton")
    override func didMoveToView(view: SKView) {
        playButton.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidX(self.frame))
        background.yScale = 2
        background.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidX(self.frame))
    self.addChild(background)
        self.addChild(playButton)

    }
    override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
        /* Called when a touch begins */
        //making the scene vars
        var scene =  PlayScene(size: self.size)


        for touch: AnyObject in touches {
            let location = touch.locationInNode(self)
             let node = self.nodeAtPoint(location)
            let skview = self.view as  SKView!
            scene.size = skview.bounds.size
            playButton.name = "PB"


            if node.name == "PB"{
                println("it worked")
                skview.presentScene(scene)
            }


        }
    }

    override func update(currentTime: CFTimeInterval) {
        /* Called before each frame is rendered */
    }
}

还有我的第二个场景(playscene)

    //
//  PlayScene.swift
//  Pocket Rocket
//
//  Created by Lucas Farleigh on 14/11/2014.
//  Copyright (c) 2014 Lucas Farleigh. All rights reserved.
//

import SpriteKit
import UIKit
import Foundation

class PlayScene:SKScene{
    let background = SKSpriteNode(imageNamed: "background")

    let bar1 = SKSpriteNode(imageNamed:"Bar1")


    let bar2 = SKSpriteNode(imageNamed:"Bar2")

    let bar3 = SKSpriteNode(imageNamed:"Bar3")


    let bar4 = SKSpriteNode(imageNamed:"Bar4")

    let bar5 = SKSpriteNode(imageNamed:"Bar5")

    let bar6 = SKSpriteNode(imageNamed:"Bar6")


    override func didMoveToView(view: SKView) {
        background.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidX(self.frame))
        addChild(background)
        background.yScale = 2

【问题讨论】:

  • 请用if语句显示代码的版本。

标签: ios swift xcode6 osx-yosemite


【解决方案1】:

请注意,您创建了两次backgroundPlayButton 节点:一次作为类属性,第二次作为didMoveToView 中的局部变量。它是您随后作为子视图添加到场景中的本地版本。如果您希望能够在类中的其他方法中针对这些节点进行测试,请去掉 didMoveToView 中的本地声明。您仍然可以填写有关这些节点的其他信息,只需删除 let 语句即可。

然后在您的touchesBegan 中,您希望通过将self 传递给touch.locationInNode(self) 来获取场景中触摸的位置,然后检索与该触摸对应的节点:

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
    for touch: AnyObject in touches {
        let location = touch.locationInNode(self)
        let node = self.nodeAtPoint(location)
        if node == Play_Button {
            println("Hello!!!!")
        }
    }
}

实现PlayButton 的第二种方法是在创建节点时为其命名:

Play_Button.name = "playButton"

然后您的 touchesBegan 将如下所示:

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
    for touch: AnyObject in touches {
        let location = touch.locationInNode(self)
        let node = self.nodeAtPoint(location)
        if node.name == "playButton" {
            println("Hello!!!!")
        }
    }
}

【讨论】:

  • 等待它给了我一个错误这是第 49 行的错误它说“[anyObject] 没有名为 name 的成员”
  • 我想你不小心调用了nodesAtPoint,它返回了[AnyObject]。您应该改为调用nodeAtPoint,它会返回SKNode
【解决方案2】:

我同意 vacawama 的回答(我使用命名选项),但我想补充一点我对 SK 按钮的处理方法。通常你要么有一个背景和一个标签,要么只有一个带有背景和标签的 PNG 图像。

在标签上使用 nodeAtPoint 时,您可能没有足够的区域。相反,如果您使用背景区域来检测点击,那么您可能会与节点顶部的标签发生冲突。

为了解决这个问题,我在两者之上创建了第三个元素(通常是 SKShapeNode),透明且稍大一点,以便用户更轻松地点击它。

为确保您将这些点击区域定位在按钮顶部,请记住使用较高的 zPosition

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-11
    • 1970-01-01
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    相关资源
    最近更新 更多