无法在touchesBegan下选择节点

时间:2015-02-04 01:28:35

标签: swift sprite-kit constraints sklabelnode

我有一个游戏,在playScene中我创建了一个创建SKLabeleNode的功能。现在我可以调用此函数将节点添加到场景中,它工作正常并将节点添加到场景中,接下来就是我现在需要能够选择刚刚添加到场景中的节点。 /////////////////////问题出在这个问题上/////////////////////// /

在这里,我将选择我之前创建的节点,并将其与函数中创建的SKLabelNode进行比较,如果函数中创建的节点==对我首先选择的节点,我需要删除该函数创建的节点。问题是我无法选择在函数

中创建的节点

//这是我能做的最小版本,可以复制并粘贴到GameScene课程和工作中。 //唯一要做的就是制作SKSpriteNode(imageNamed:" A")和SKSpriteNode(imageNamed:" B")

导入SpriteKit 进口基金会 GameScene:SKScene {

var yellowColor = UIColor.yellowColor()
var redColor    = UIColor.redColor()

let upperCaseA  = SKSpriteNode(imageNamed: "A")
let upperCaseB  = SKSpriteNode(imageNamed: "B")

var smallSizeLatter  = CGSize()
var largeSizeLatter  = CGSize()

var tempVarToHoldPlaceToMakeItRun = SKLabelNode(text: "A")

var latterADefaults:   NSUserDefaults = NSUserDefaults.standardUserDefaults()
var latterBDefaults:   NSUserDefaults = NSUserDefaults.standardUserDefaults()

override func didMoveToView(view: (SKView!)) {

    _ = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: ("fallTheText"), userInfo: nil, repeats: true)

    self.backgroundColor = UIColor.whiteColor()

    latterADefaults.setBool(true, forKey: "latterADefaultsKey")
    latterBDefaults.setBool(true, forKey: "latterBDefaultsKey")
    smallSizeLatter      = CGSize(width: 37, height: 37)
    largeSizeLatter      = CGSize(width: 54, height: 54)
    upperCaseA.size      = smallSizeLatter
    upperCaseA.position  = CGPoint(x: self.frame.width / 8, y: self.frame.height  * 0.75)
    upperCaseB.size      = smallSizeLatter
    upperCaseB.position  = CGPoint(x: self.frame.width / 8, y: self.frame.height  * 0.65)

    self.addChild(upperCaseA)
    self.addChild(upperCaseB)

}
func fallTheText(){

    let theFallingText      = SKLabelNode(text: "A")

    let theLowerCaseLatter: [String] = ["a", "b",]
    let textIndex               = Int(arc4random_uniform(UInt32(2)))
    let lowerCaseLatter               = theLowerCaseLatter[textIndex]
    theFallingText.text     = lowerCaseLatter

    theFallingText.name = lowerCaseLatter

    print("the name is", theFallingText)


    let colorListOfColors: [UIColor] = [yellowColor, redColor,]
    let colorIndex                   = Int(arc4random_uniform(UInt32(2)))
    let colorOfColors                = colorListOfColors[colorIndex]
    theFallingText.fontColor     = colorOfColors


    theFallingText.fontName  = "HoeflerText-BlackItalic"
    theFallingText.fontSize  = 40


    func randomRange (lower: UInt32 , upper: UInt32) -> UInt32 {
        return lower + arc4random_uniform(upper - lower + 1)
    }
    let minValue                 = self.size.width / 3
    let maxValue                 = self.size.width - 50
    let uppers                   = UInt32(maxValue)
    let lowers                   = UInt32(minValue)
    let spawnPoint               = CGFloat(randomRange(lowers, upper: uppers))
    theFallingText.position  = CGPoint(x: spawnPoint, y: self.size.height * 0.85)


    let actionY                  = SKAction.moveToY(-30, duration: 20)
    theFallingText.runAction(SKAction.repeatActionForever(actionY))
    self.addChild(theFallingText)
}

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    for touch: AnyObject in touches{
        let positionOfTouch = touch.locationInNode(self)
        let nodeAtLocation = self.nodeAtPoint(positionOfTouch)
        if nodeAtLocation == upperCaseA {
            if latterADefaults.boolForKey("latterADefaultsKey"){
                upperCaseA.size = largeSizeLatter
                latterADefaults.setBool(false, forKey: "latterADefaultsKey")
                upperCaseB.size = smallSizeLatter
                latterBDefaults.setBool(true, forKey: "latterBDefaultsKey")
            }else{
                upperCaseA.size = smallSizeLatter
                upperCaseB.size = smallSizeLatter
                latterADefaults.setBool(true, forKey: "latterADefaultsKey")
            }
        }

////////问题就在这里,我加上这个温度节点让它运行起来/////////

        if nodeAtLocation == tempVarToHoldPlaceToMakeItRun{
            if tempVarToHoldPlaceToMakeItRun.text == "yellow"{
                print("danny", tempVarToHoldPlaceToMakeItRun.name)
                if upperCaseA.size == largeSizeLatter{
                    tempVarToHoldPlaceToMakeItRun.removeFromParent()
                    upperCaseA.size = smallSizeLatter
                }


            }
        }
        if nodeAtLocation == upperCaseB {
            if latterBDefaults.boolForKey("latterBDefaultsKey"){
                upperCaseA.size = smallSizeLatter
                latterADefaults.setBool(true, forKey: "latterADefaultsKey")
                upperCaseB.size = largeSizeLatter
                latterBDefaults.setBool(false, forKey: "latterBDefaultsKey")
            }else{
                upperCaseB.size = smallSizeLatter
                latterBDefaults.setBool(true, forKey: "latterBDefaultsKey")
            }
        }
    }
}

}

如何触摸此节点进行比较? 我已经更改了函数以返回没有运气的SKLabelNode。 我试图使用没有返回值的功能没有运气。 我删除了NSTimer并将该函数添加为self.addChild(fallTheText)而没有运气。 在所有情况下,在函数中创建的SKLabelNode都会向下流动。 好了,现在当我尝试比较它们时,我触摸第一个节点并且它会做出反应,但现在它也会从函数中添加一个新节点,但它不应该。当我尝试选择函数创建的下降节点时,它只是不断地从函数中添加更多节点,并且不会选择正在下降的节点。

目标是随机下降后者和固定的图像,当触摸时它会调整大小&#39;比较它们,然后删除掉落的帐篷信。

2 个答案:

答案 0 :(得分:0)

使用

为场景设置物理边界
self.physicsBody = SKPhysicsBody(edgeLoopFromRect:
        CGRectMake(0, 0, self.frame.width, self.frame.height))

检查场景的大小是否与屏幕大小相同。否则,边界将被设置在屏幕区域之外。

使用

将物理主体设置为标签
labelNode.physicsBody = SKPhysicsBody(rectangleOfSize: labelNode.frame.size)

设置标签的categoryBitMaskcollisionBitMask以选择性地进行碰撞。 有关详细信息:https://developer.apple.com/library/ios/documentation/GraphicsAnimation/Conceptual/CodeExplainedAdventure/HandlingCollisions/HandlingCollisions.html

答案 1 :(得分:0)

在一个函数中有一个节点并将该函数作为子元素添加到场景中将向下滚动场景,但它不会将节点添加到父节点。

我将节点移动到函数外部并创建了一个新函数来处理节点的移动。

func timer1(){
    theFallingText.removeActionForKey("actionYKey")
    let actionYY = SKAction.moveToY(self.size.height * 0.85, duration: 0.0)
    theFallingText.runAction(SKAction.repeatAction(actionYY, count: 1))
    fallTheText()    
}

我必须在fallTheText中调用didMoveToView函数。