Метка не отображается (Swift 4 SpriteKit) - PullRequest
0 голосов
/ 12 июня 2018

Я делаю игру в Xcode с Swift 4, SpriteKit.Мое обнаружение сбоев работает, однако, когда я пытаюсь заставить текст появляться на экране, когда проигрыватель падает, текст не появляется.Моя игра в основном использует управление ракетным кораблем, который должен уклоняться от метеоров, у игрока также есть способность стрелять пулями.Я обнаружил, когда ракетный корабль столкнулся с метеором, но не смог отобразить текст на экране.Я точно знаю, что обнаружение сбоев работает, потому что всякий раз, когда я добавляю оператор print в функцию didBegin, оператор print выполняется.Должно быть, именно так я показываю ярлык, но я не уверен, что я делаю неправильно с ярлыком.Вот мой код:

import SpriteKit
import GameplayKit
import UIKit



class GameScene: SKScene, SKPhysicsContactDelegate{

    let player = SKSpriteNode(imageNamed: "spaceship")
    let stars = SKSpriteNode(imageNamed: "stars")
    let meteor = SKSpriteNode(imageNamed: "meteor")


    override func didMove(to view: SKView) {
        physicsWorld.contactDelegate = self
        print(frame.size.width)
        print(frame.size.height)

        stars.position = CGPoint(x:0, y:0)
        stars.zPosition = 1

        player.position = CGPoint(x:0, y:-320)
        player.zPosition = 4
        player.physicsBody = SKPhysicsBody(circleOfRadius: player.size.width / 2)
        player.physicsBody?.affectedByGravity = false
        player.physicsBody?.isDynamic = false

        player.physicsBody?.categoryBitMask = 2
        player.physicsBody?.collisionBitMask = 1
        player.physicsBody?.contactTestBitMask = 1



        self.addChild(player)
        self.addChild(stars)

        self.addMeteor()


    }

    func didBegin(_ contact: SKPhysicsContact) {
        gameOver()

    }

    func addMeteor() {
        meteor.physicsBody = SKPhysicsBody(circleOfRadius: meteor.size.width / 2)
        meteor.physicsBody?.affectedByGravity = false
        meteor.setScale(0.50)
        meteor.position = CGPoint(x:Int(arc4random()%300),y:Int(arc4random()%600))
        //meteor.position = CGPoint(x:0 , y:0)
        meteor.zPosition = 4

        meteor.physicsBody?.categoryBitMask = 1
        meteor.physicsBody?.collisionBitMask = 0
        meteor.physicsBody?.contactTestBitMask = 2

        self.addChild(meteor)
    }

    func fireBullet() {
        let bullet = SKSpriteNode(imageNamed: "bullet")
        bullet.position = player.position
        bullet.setScale(0.5)
        bullet.zPosition = 3
        self.addChild(bullet)
        let moveBullet = SKAction.moveTo(y: self.size.height + bullet.size.height, duration: 1)
        let deleteBullet = SKAction.removeFromParent()
        let bulletSequence = SKAction.sequence([moveBullet, deleteBullet])
        bullet.run(bulletSequence)


    }

    func gameOver() {
        print("Game Over!")
        var gameOverLabel: SKLabelNode!
        gameOverLabel = SKLabelNode(fontNamed: "Chalkduster")
        gameOverLabel.text = "Game Over! You lost!"
        gameOverLabel.horizontalAlignmentMode = .right
        gameOverLabel.position = CGPoint(x: 0, y:0)
        self.addChild(gameOverLabel)
        print("Label added")
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        fireBullet()
    }

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        for touch:  AnyObject in touches {
            let pointOfTouch = touch.location(in: self)
            let previousPointOfTouch = touch.previousLocation(in: self)
            let amountDragged = pointOfTouch.x - previousPointOfTouch.x
            player.position.x += amountDragged
        }

    }



    override func update(_ currentTime: TimeInterval) {
        meteor.position.y -= 6
        if meteor.position.y < player.position.y - 300{
            meteor.removeFromParent()
            addMeteor()

        }
    }
}

Не знаете, что я делаю не так?Я вызываю функцию gameOver () в didBegin, которая должна выполняться при каждом обнаружении столкновения.Но ничего не происходит?Метеор просто проходит мимо ракетного корабля.Если бы кто-то мог мне помочь, это было бы здорово!

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Поскольку я вижу, что вы пытаетесь центрировать метку на экране, вы можете попытаться добавить это к своему коду на функции gameover:

1. Попробуйте изменить положение на

* 1004.*

2.Я не знаю, есть ли у вас что-то, что находится над этикеткой и влияет на ее вид, поэтому попробуйте:

gameOverLabel.zPosition = 10 //A number higher than any other zPosition 

3. Возможно, этикетка слишком мала ... попробуйте:

gameOverLabel.fontSize = 30 //Adjust it to what you want

4.Просто совет:

переместите:

var gameOverLabel: SKLabelNode! 

на следующую строку после

let meteor = SKSpriteNode(imageNamed: "meteor") 

Таким образому вас будет универсальный ярлык, и вам не придется каждый раз восстанавливать его.

Если вы сделаете это, просто последний совет ... Я не знаю, есть ли у вас функция, подобная gameRestart ()или что-то вроде этого ... но убедитесь, что при перезапуске игры вы удалите метку:

gameOverLabel.removeFromParent()

Если вы этого не сделаете, когда приложение попытается добавить метку снова, оно будетавария!

Надеюсь, это поможет!

0 голосов
/ 12 июня 2018

Вы не перемещаете ни один из ваших объектов настолько, насколько это касается вашей физики.Вы должны применить силы вместо того, чтобы вручную перемещать позицию.Кроме того, динамика вашего игрока установлена ​​в false, что означает, что он никогда не двигается, поэтому контакты происходят только на конце метеора.

...