How to make a node visible before any user interaction

℡╲_俬逩灬. 提交于 2019-12-12 03:21:49

问题


I took and modified a piece of code which allows me to shoot bullets in every direction. It works perfectly. But it is generating a random bullet in the moment when player touch is ended. I have 6 different bullets and for purposes of my game I need player to see them before he will tap the screen. I tried to initialize a bullet in a global function and pass it to didMoveToView. It's not working, bullet is generating once and stays at its place. That is my code for initializing a bullet:

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
}

How can I generate a bullet and only then shoot it? I will be glad to hear any ideas, thanks!


回答1:


You can generate a bullet in a cannon as a global variable, and then create a new bullet in touchesEnded which will be the bullet that actually fires from the cannon. You set that new bullet's texture to the global bullet's texture. After firing the action, give the global bullet a new texture. If you need to have a reload time, then remove the global bullet temporarily, and use a Boolean to "lock" the cannon from firing until the time has elapsed.

Here's some code that I used. If the cannon moves, then make sure to update the position of the global bullet. The subtraction of CGPoint gives me an error, but I'm using Xcode 6.4.

Edit: Quicker and easier way by giving the bulletInCannon a value

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])
    }
}


来源:https://stackoverflow.com/questions/32096800/how-to-make-a-node-visible-before-any-user-interaction

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!