如何在任何用户交互之前使节点可见

How to make a node visible before any user interaction

我修改了一段代码,让我可以向各个方向发射子弹。它工作得很好。但是它会在玩家触摸结束的那一刻生成一颗随机子弹。我有 6 种不同的子弹,出于我的游戏目的,我需要玩家在点击屏幕之前看到它们。我试图在全局函数中初始化一个项目符号并将其传递给 didMoveToView。它不起作用,子弹生成一次并留在原处。 这是我初始化子弹的代码:

class GameScene: SKScene, SKPhysicsContactDelegate {
var gameOver = false
let cannon = SKSpriteNode(imageNamed: "cannon")
let bulletInCannon = SKSpriteNode()
var endOfScreenRight = CGFloat()
var endOfScreenLeft = CGFloat()

let bmrArray = ["blBl", "magBl", "rBl"]   
let cgyArray = ["cBl", "gBl", "yBl"]   
let yrmArray = ["yBl", "rBl", "magBl"]   
let bulletArray = ["rBullet","magBullet", "blBullet", "cBullet", "gBullet", "yBullet"]

override func didMoveToView(view: SKView) {
 endOfScreenLeft = (self.size.width / 2) * CGFloat(-1)
 endOfScreenRight = self.size.width / 2

 cannon.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame))
 self.addChild(cannon)

 cannon.zPosition = 0

 var randomBullet = Int(arc4random_uniform(6))
 bulletInCannon.texture = SKTexture(imageNamed: bulletArray[randomBullet])
 bulletInCannon.position = cannon.position
 addChild(bulletInCannon)

 bulletInCannon.zPosition = 1000

 runAction(SKAction.repeatActionForever(SKAction.sequence([SKAction.runBlock(addCgyLine), 
SKAction.waitForDuration(1.0)])))

}

override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {

}

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

        let bullet = SKSpriteNode(texture: bulletInCannon.texture)
        bullet.position = cannon.position
        addChild(bullet)

        let offset = location - bullet.position
        let direction = offset.normalized()
        let shootAmount = direction * 1000
        let realDestination = shootAmount + bullet.position

        let actionMove = SKAction.moveTo(realDestination, duration: 2.0)
        let actionDone = SKAction.removeFromParent()
        bullet.runAction(SKAction.sequence([actionMove, actionDone]))

        var randomBullet = Int(arc4random_uniform(6))
        bulletInCannon.texture = SKTexture(imageNamed: bulletArray[randomBullet])
        }
}


func addCgyLine () {
    var cgyBlock = SKSpriteNode(imageNamed: "cyanBox")
    cgyBlock.position = CGPointMake(size.width + cgyBlock.size.width/2, CGRectGetMidY(self.frame) + 60) 
    addChild(cgyBlock)
    var randomCGY = Int(arc4random_uniform(3))
    cgyBlock.texture = SKTexture(imageNamed: cgyArray[randomCGY])
    let actionMove = SKAction.moveTo(CGPoint(x: -cgyBlock.size.width/2, y: CGRectGetMidY(self.frame) + 60), duration: 3) 
    let actionDone = SKAction.removeFromParent()
    cgyBlock.runAction(SKAction.sequence([actionMove, actionDone]))
    SKActionTimingMode.EaseOut
}

如何生成子弹然后才发射?我很乐意听到任何想法,谢谢!

您可以在大炮中生成一颗子弹作为全局变量,然后在touchesEnded中创建一颗新子弹,这将是大炮实际发射的子弹。您将新子弹的纹理设置为全局子弹的纹理。发射动作后,给全局子弹一个新的纹理。如果你需要有一个装弹时间,那么暂时移除全局子弹,并使用Boolean到"lock"大炮从发射到时间结束。

这是我使用的一些代码。如果大炮移动,请确保更新全局子弹的位置。 CGPoint 的减法给我一个错误,但我使用的是 Xcode 6.4.

编辑:通过给 bulletInCannon 一个值

来更快更简单的方法
var bulletInCannon = SKSpriteNode(imageNamed: "rBullet")

override func didMoveToView(view: SKView) {
    var randomBullet = Int(arc4random_uniform(6))
    bulletInCannon.texture = SKTexture(imageNamed: bulletArray[randomBullet])
    bulletInCannon.position = cannon.position
    addChild(bulletInCannon)
}

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

        // Create bullet that will fire from the cannon
        let bullet = SKSpriteNode(texture: bulletInCannon.texture)
        bullet.position = cannon.position
        addChild(bullet)

        let offset = location - bullet.position
        let direction = offset.normalized()
        let shootAmount = direction * 1000
        let realDestination = shootAmount + bullet.position

        let actionMove = SKAction.moveTo(realDestination, duration: 2.0)
        let actionDone = SKAction.removeFromParent()
        bullet.runAction(SKAction.sequence([actionMove, actionDone]))

        // Generate a random texture for the global bullet
        var randomBullet = Int(arc4random_uniform(6))
        bulletInCannon.texture = SKTexture(imageNamed: bulletArray[randomBullet])
    }
}