2015-08-19 3 views
0

Я взял и модифицировал кусок кода, который позволяет мне снимать пули во всех направлениях. Он работает отлично. Но он генерирует случайную пулю в момент, когда контакт игрока заканчивается. У меня 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 
} 

Как я могу генерировать пулю и только потом снимать его? Я буду рад услышать любые идеи, спасибо!

ответ

1

Вы можете сгенерировать пулю в пушке как глобальную переменную, а затем создать новую пулю в touchesEnded, которая будет пулей, которая действительно стреляет из пушки. Вы настроили текстуру новой пули на текстуру глобальной пули. После запуска действия дайте глобальной пуле новую текстуру. Если вам нужно перезагрузить время, то временно удалите глобальную марку и используйте Boolean для «блокировки» пушки от стрельбы до истечения времени.

Вот код, который я использовал. Если пушка перемещается, убедитесь, что вы обновили положение глобальной пули. Вычитание CGPoint дает мне ошибку, но я использую Xcode 6.4.

Edit: Quicker и простой способ, давая 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]) 
    } 
} 
+0

Грустная новость, я до сих пор не могу видеть пулю в пушку, прежде чем я нажимаю, чтобы стрелять. Не знаю, почему, я внедрил ваш код и не было никаких ошибок – Burundanga

+0

об ошибке с CGPoints: это потому, что я использую перегрузку оператора и не включаю код для него в вопрос – Burundanga

+0

Odd. Убедитесь, что вы установили позицию пушки и добавили ее в сцену до создания 'bulletInCannon'. Вы также можете установить 'bulletInCannon.zPosition' примерно на 0,5, чтобы убедиться, что он выше пушки в сцене. – Gliderman

Смежные вопросы