Метод подсчета очков для объектов Swift и Spawning

Я не могу понять, как заставить мою оценку работать...

Концепция игры заключается в том, что птицы прилетают с правой стороны, и когда они достигают левой стороны, я хочу, чтобы мой счет увеличивался на 1.

В Obj_c я бы сделал что-то вроде

if (bird.enter.x < 0) {
    score++
}

но в наборе быстрых спрайтов я не уверен, как это сделать...

Еще одна проблема, с которой я сталкиваюсь, заключается в том, что я должен использовать таймер, чтобы мои «вражеские птицы» появлялись (птицы движутся справа налево).

(каждую 1 секунду таймер запускает функцию появления врага), но в Obj_c я бы породил, скажем, 3/4 с разными координатами x, и, как и в предыдущем коде, когда птица была ‹ 0 пикселей, я бы CGPointMake() вернулся на другую сторону. экрана, чтобы они находились в постоянном цикле

Любые идеи сделать это быстро? Мой код выглядит следующим образом: он немного странный:

import SpriteKit





class GameScene: SKScene, SKPhysicsContactDelegate {

var bg = SKSpriteNode()             // Create Background
var bird = SKSpriteNode()           // Create User Bird
var scoreLabel = SKLabelNode()      // Create Score Label
var score: Int = 0                  // Create Score Integer
var enemyBird = SKSpriteNode()      // Create Enemy Bird

var birdGroup:UInt32 = 1            // Bird Collision Group
var objectGroup:UInt32 = 2          // Enemy Collision Group
var scoreGroup:UInt32 = 3           // Score Collision Group
var gameOver = 0                    // Game Over function
var movingObjects = SKNode()        // ??
var gameOverLabel = SKLabelNode()   // Game over label
var labelHolder = SKSpriteNode()    // Holds Label - Game Over
var Menu = 0


/* Put Bird in and animate */
var birdTexture = SKTexture(imageNamed: "bird_img_1.png")
var birdTexture2 = SKTexture(imageNamed: "bird_img_2.png")
var birdTexture3 = SKTexture(imageNamed: "bird_img_3.png")
var birdTexture4 = SKTexture(imageNamed: "bird_img_4.png")

var birdDeadTexture = SKTexture(imageNamed: "bird_img_dead.png")

var finalSpawn: CGFloat = 0.0


/* ------------------------------------ Main Setup ------------------------------------------ */


override func didMoveToView(view: SKView) {
    /* Setup your scene here */

    println("Moved to Game Scene")


    movingObjects.speed = 0




    /* Call Functions */
    backgroundImage()
    enemySpawn()



    /* Set up deletates and physics and timer */
    self.physicsWorld.contactDelegate = self
    self.physicsWorld.gravity = CGVectorMake(0, -5)
    self.addChild(movingObjects)
    self.addChild(labelHolder)


    /*  Load Score Text */

    scoreLabel.fontName = "Helvetica"
    scoreLabel.fontSize = 60
    scoreLabel.text = "0"
    scoreLabel.position = CGPoint(x: CGRectGetMidX(self.frame), y: CGRectGetMidY(self.frame)+self.frame.size.height*0.3)
    self.addChild(scoreLabel)


    enemyBird.position = CGPointMake(self.frame.width+200, 500)
    movingObjects.addChild(enemyBird)



    bird = SKSpriteNode(texture: birdTexture)
    bird.position = CGPoint(x: CGRectGetMidX(self.frame), y: CGRectGetMidY(self.frame))
    // Make bird smaller
    bird.size.height = bird.size.height/12
    bird.size.width = bird.size.width/11
    // Animate Bird
    var animation = SKAction.animateWithTextures([birdTexture, birdTexture2, birdTexture3, birdTexture4], timePerFrame: 0.08)
    var makeBirdFlap = SKAction.repeatActionForever(animation)
    bird.runAction(makeBirdFlap)
    // Load Physics
    // birdPhysics()
    // Run bird animation
    bird.zPosition = 10


    self.addChild(bird)


    /* Introduce ground and top into the scene */
    // Create Ground
    var ground = SKSpriteNode()
    ground.position = CGPointMake(CGRectGetMidX(self.frame), self.frame.size.height/100 * 16)
    ground.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(self.frame.size.width, 1))
    ground.physicsBody?.dynamic = false
    ground.physicsBody?.categoryBitMask = objectGroup
    // Add Ground to scene
    self.addChild(ground)

    // Create Top
    var top = SKSpriteNode()
    top.position = CGPointMake(0, self.frame.size.height)
    top.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(self.frame.size.width, 1))
    top.physicsBody?.dynamic = false
    top.physicsBody?.categoryBitMask = objectGroup
    // Add Top to scene
    self.addChild(top)


}








/* ------------------------------------ Spawning Enemy Birds ------------------------------------------ */








/* Create and Spawn enemy birds */
func enemySpawn() {





    let height = self.frame.size.height                             // screen height as variable
    let width = self.frame.size.width                               // screen width as variable

    var bottomBarHeight = self.frame.size.height*0.16               // bottom bar height
    var spawningPoint = height - bottomBarHeight                    // screen height - 16%

    var randSpawn = arc4random_uniform(UInt32(spawningPoint))       // random number between 0 and 645
    finalSpawn = CGFloat(randSpawn) + bottomBarHeight           // add 16% (bottombarheight to the random number
    println(Int(finalSpawn))





    if (enemyBird.position.y > frame.size.height) {
        enemyBird.position.y = frame.size.height - 100
    }

    if (enemyBird.position.y < self.frame.size.width * 0.16) {
        enemyBird.position.y = self.frame.size.width + 0.18
    }




   // Create enemy bird
    var enemyBirdTexture = SKTexture(imageNamed: "enemy_img_2.png")

   // enemyBird.position = CGPointMake(self.frame.width+200, 500)
    enemyBird = SKSpriteNode(texture: enemyBirdTexture)
    enemyBird.size.height = enemyBird.size.height/12
    enemyBird.size.width = enemyBird.size.width/11
    enemyBird.physicsBody = SKPhysicsBody(rectangleOfSize: CGSizeMake(enemyBird.size.width/1.1, enemyBird.size.height/1.1))
    enemyBird.physicsBody?.dynamic = false
    enemyBird.physicsBody?.categoryBitMask = objectGroup

   // BIRD LOOP - ONLY RUNNING ONCE???        

    let startPoint = CGPointMake(self.frame.width+200, finalSpawn)
    let endPoint = CGPointMake(0, finalSpawn)
    let moveToEndAction = SKAction.moveTo(endPoint, duration: 2)
    let resetTostartAction = SKAction.moveTo(startPoint, duration: 0)
    let moveToEndThenStartAgain = SKAction.repeatActionForever(SKAction.sequence([moveToEndAction,resetTostartAction]))

    enemyBird.runAction(SKAction.repeatActionForever(moveToEndThenStartAgain))

}











/* ------------------------------------ Other Parts ------------------------------------------ */








func backgroundImage() {

    /* Put Background Image In */

    // Create Background Texture
    var bgTexture = SKTexture(imageNamed: "bg.png")
    // Link bg variable to texture
    bg = SKSpriteNode(texture: bgTexture)
    // Position thr bg image
    bg.position = CGPoint(x: CGRectGetMidX(self.frame), y: self.frame.height/2)
    bg.size.height = self.frame.height

    // Move background image left
    var moveBg = SKAction.moveByX(-bgTexture.size().width, y: 0, duration: 9)
    var replaceBg = SKAction.moveByX(bgTexture.size().width, y: 0, duration: 0)
    var moveBgForever = SKAction.repeatActionForever(SKAction.sequence([moveBg, replaceBg]))

    // Keep world never ending
    for var i:CGFloat = 0; i < 3; i++ {

        // Position Background
        bg = SKSpriteNode(texture: bgTexture)
        bg.position = CGPoint(x: bgTexture.size().width/2 + bgTexture.size().width * i, y: CGRectGetMidY(self.frame))

        // Stretch background full height of screen
        bg.size.height = self.frame.height

        // Run the action to move BG
        bg.runAction(moveBgForever)

        self.addChild(bg)
    }
}










/* ------------------------------------ Create Bird Physics ------------------------------------------ */








func birdPhysics() {
    /* Give bird physics */
    // Give bird physics
    bird.physicsBody = SKPhysicsBody(circleOfRadius: bird.size.height/3)
    bird.physicsBody?.mass = 0.2
    bird.physicsBody?.dynamic = true
    bird.physicsBody?.allowsRotation = false
    bird.physicsBody?.categoryBitMask = birdGroup
    bird.physicsBody?.collisionBitMask = objectGroup
    bird.physicsBody?.contactTestBitMask = objectGroup


}









/* ------------------------------------ If contact is found ------------------------------------------ */










func didBeginContact(contact: SKPhysicsContact) {
    if contact.bodyA.categoryBitMask == objectGroup || contact.bodyB.categoryBitMask == objectGroup {


        bird.removeAllActions()
        bird.texture = birdDeadTexture
        let action = SKAction.rotateByAngle(CGFloat(-M_PI), duration:1)
        bird.runAction(SKAction.repeatActionForever(action))


        if gameOver == 0 {
            movingObjects.speed = 0
            gameOver = 1
            movingObjects.removeAllChildren()// Remove all enemies
            gameOverLabel.fontName = "Helvetica"
            gameOverLabel.fontSize = 25
            gameOverLabel.text = "Tap to retry!"
            gameOverLabel.position = CGPoint(x: CGRectGetMidX(self.frame), y: CGRectGetMidY(self.frame)*1.5)
            labelHolder.addChild(gameOverLabel)
            gameOverLabel.zPosition = 9


        }
    }
}












/* ------------------------------------ When user touches the screen ------------------------------------------ */






override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
    /* Called when a touch begins */




    if (Menu == 0) {
        movingObjects.speed = 1
        birdPhysics()
        let action = SKAction.rotateByAngle(CGFloat(-M_PI), duration:1)
        bird.runAction(SKAction.repeatActionForever(action))

    }




    if (gameOver == 0) {                                                                            // Runs if game is not over
        bird.physicsBody?.velocity = CGVectorMake(0, 0)
        bird.physicsBody?.applyImpulse(CGVectorMake(0, 80))
        Menu = 1    // Number on right is jump height


    } else {                                                                                        // Runs if game is over
        score = 0                                                                                   // Score int is 0
        scoreLabel.text = "0"                                                                       // Score Label is 0
        bird.position = CGPoint(x: CGRectGetMidX(self.frame), y: CGRectGetMidY(self.frame))         // Position Bird in center
        bird.physicsBody?.velocity = CGVectorMake(0,0)                                              // Cannot make bird jump
        labelHolder.removeAllChildren()                                                             // Removes all labels
        gameOver = 0                                                                                // Sets game over to 0 so game will run
        movingObjects.speed = 1
        bird.texture = birdTexture
        // Animate Bird
        var animation = SKAction.animateWithTextures([birdTexture, birdTexture2, birdTexture3, birdTexture4], timePerFrame: 0.08)
        var makeBirdFlap = SKAction.repeatActionForever(animation)
        bird.runAction(makeBirdFlap)

        let height = self.frame.size.height
        let width = self.frame.size.width



            var gameScene: GameScene = GameScene(size: CGSizeMake(width, height))
            var spriteView: SKView = self.view as SKView!
            var trans :SKTransition = SKTransition.crossFadeWithDuration(0.5)
            spriteView.presentScene(gameScene, transition: trans)

    }
}







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

    if (enemyBird.position.x == 0) {

        score = score + 1
        scoreLabel.text = "\(score)"
    }


    if (enemyBird.position.y > frame.size.height) {
        enemyBird.position.y = frame.size.height - enemyBird.size.height
    }  
}    }

person LukeTerzich    schedule 21.01.2015    source источник


Ответы (1)


Вы можете увеличить счет, как

if (bird.position.x < 0)
{
    score++
}

А чтобы зациклить анимацию вражеских птиц, вы можете сделать зацикливание SKAction из одного конца в другой. Например вот так

let startPoint = CGPointMake(0, 200)
let endPoint = CGPointMake(self.frame.width, 200)

let moveToEndAction = SKAction.moveTo(endPoint, duration: 2)
let resetTostartAction = SKAction.moveTo(startPoint, duration: 0)

let moveToEndThenStartAgain = SKAction.repeatActionForever(SKAction.sequence([moveToEndAction,resetTostartAction]))

node.runAction(SKAction.repeatActionForever(moveToEndThenStartAgain))

Чтобы каждый раз начинать со случайной высоты, вы можете использовать

let maxHeight:UInt32 = 400
let startPoint = CGPointMake(0, CGFloat(arc4random() % maxHeight))

let moveToEndAction = SKAction.moveByX(self.frame.width, y: 0, duration: 1.0)
let resetTostartAction = SKAction.runBlock { () -> Void in

    let randomHeight = CGFloat(arc4random() % maxHeight)
    self.playButton.position = CGPointMake(startPoint.x,randomHeight)
}

let moveToEndThenStartAgain = SKAction.repeatActionForever(SKAction.sequence([moveToEndAction,resetTostartAction]))

enemyBird.runAction(SKAction.repeatActionForever(moveToEndThenStartAgain))

Вы можете изменить maxHeight по мере необходимости.

person rakeshbs    schedule 21.01.2015
comment
Будет ли этот код находиться внутри viewDidLoad? причина, по которой я не мог использовать оператор if ‹ 0, заключалась в том, что он был внутри функции, которая вызывалась таймером, который запускался только один раз для запуска птицы. Я предполагаю, что это потребует полной реструктуризации моего кода? - person LukeTerzich; 21.01.2015
comment
Вы можете проверить положение спрайта птицы в функции обновления. - person rakeshbs; 21.01.2015
comment
Извините, я был в этой игре около 3 дней без перерыва, и теперь все это меня сбивает с толку, ха-ха. Единственная проблема заключается в том, что у меня все еще есть таймер, запускающий функцию появления вражеских птиц. Если бы я один раз удалил таймер и всю функцию порождения врагов, как бы я включил в нее координату поиска X? - person LukeTerzich; 21.01.2015
comment
В skscene есть функция обновления. Это называется каждый кадр. Вы можете проверить положение вашего узла внутри этого. - person rakeshbs; 21.01.2015
comment
spritekitlessons.wordpress.com/2013/10/08/ - person rakeshbs; 21.01.2015
comment
Не могу поверить, что я забыл об этом! Это сделало трюк! Единственная проблема заключается в том, что с вашим кодом птицы я получаю случайный нерест птицы в точке (0,0), которая перемещается вверх к заданной мной координате y (скажем, 500), затем птицы начинают прибывать с правой стороны (что и происходит). я хотел бы, чтобы произошло) - person LukeTerzich; 21.01.2015
comment
Я не понял проблемы. Нельзя ли это решить, изменив начальную и конечную позиции - person rakeshbs; 21.01.2015
comment
Вот и все, приятель, последнее дело, и моя игра почти готова. Ты так здорово помог, я выкорчу тебя, как только у меня будет репутация... В любом случае - первая птица в порядке и появляется на случайной высоте. но после этого все они появляются в одной и той же координате Y - person LukeTerzich; 21.01.2015
comment
Первая вражеская птица или ваша птица? - person rakeshbs; 22.01.2015
comment
Первая вражеская птица будет появляться на случайной высоте, но затем все вражеские птицы после этого будут появляться на том же уровне, потому что функция создания вражеских птиц запускается только один раз внутри ViewDidLoad (поэтому, хотя вражеская птица находится в цикле, это все еще только запускается (и генерирует случайное число для появления высоты один раз) - person LukeTerzich; 22.01.2015
comment
это не только одна вражеская птица на экране за раз? Вы имеете в виду, что хотите возродить вражескую птицу в другом месте после того, как она исчезнет с экрана? - person rakeshbs; 22.01.2015
comment
да, приятель, точно, только 1 птица на экране одновременно (может быть, больше в будущем), но сейчас только 1 птица появляется на разной высоте каждый раз, это то, к чему я стремлюсь. - person LukeTerzich; 22.01.2015
comment
Это сработало ..... Но независимо от того, что я делаю, у меня есть спаун птицы на 0,0, даже если я CGPointMake (200,200) в представлении загрузился, у меня все еще есть спавн на 0,0 (вражеская птица это is) происходит что-то странное, сейчас я обновлю свой код... - person LukeTerzich; 23.01.2015
comment
сделать высоту startPoint также случайной. как в моем коде. - person rakeshbs; 24.01.2015