Загрузка нового класса в GameScene - PullRequest
0 голосов
/ 21 апреля 2020

Все.

Я относительно новичок в Swift. Я младший iOS разработчик, работающий через взлом с быстрым планом, и я многому учусь.

Я немного расширяю границы одного из проектов, чтобы укрепить свое обучение. Однако я сталкиваюсь с одной проблемой - загрузить новый класс, чтобы мой код и файлы были чистыми и минимальными.

Сейчас я создал игру с одним уровнем. Я добавил таймер обратного отсчета и перезагрузку, когда игрок умирает.

Я хочу создать новый класс, например, «Второй уровень», который увеличит скорость игры и, возможно, добавит новых врагов.

Мне трудно загрузить новый класс, который унаследует все данные от основного класса.

Пожалуйста, смотрите код ниже.

import SpriteKit
import GameplayKit

class GameScene: SKScene, SKPhysicsContactDelegate {

let gameView = GameViewController()

private var label : SKLabelNode?
private var spinnyNode : SKShapeNode?

var starfield: SKEmitterNode!
var player: SKSpriteNode!
var scoreLabel: SKLabelNode!
var gameLevel: SKLabelNode!
var gameLevelTimer: SKLabelNode!

var possibleEnemies = ["ball","hammer","tv"]
var isGameOver = false
var gameTimer: Timer?

var levelTimerLabel = SKLabelNode(fontNamed: "ArialMT")
var gameLevelLabel = SKLabelNode(fontNamed: "Chalkduster")
var gameLevelTimerLabel = SKLabelNode(fontNamed: "ArialMt")

var levelTimerValue: Int = 3 {
    didSet {
        levelTimerLabel.text = "Game start in: \(levelTimerValue)"
    }
}

var gameLevelValue: Int = 1 {
    didSet{
        gameLevel.text = "Level:\(gameLevelValue)"
    }
}

var score = 0 {
    didSet{
        scoreLabel.text = "Score: \(score)"
    }
}

override func didMove(to view: SKView) {
    backgroundColor = .black

    starfield = SKEmitterNode(fileNamed: "starfield")
    starfield.position = CGPoint(x: 1024, y: 384)
    starfield.advanceSimulationTime(10)
    addChild(starfield)
    starfield.zPosition = -1

    createPlayer()
    gameLevelCounter()


    scoreLabel = SKLabelNode(fontNamed: "Chalkduster")
    scoreLabel.position = CGPoint(x: 16, y: 16)
    scoreLabel.horizontalAlignmentMode = .left
    addChild(scoreLabel)

    score = 0

    physicsWorld.gravity = CGVector(dx: 0, dy: 0)
    physicsWorld.contactDelegate = self

    gameTimer = Timer.scheduledTimer(timeInterval: 0.85, target: self, selector: #selector(createEnemy), userInfo: nil, repeats: true)
}

func gameLevelCounter() {
    gameLevel = SKLabelNode(fontNamed: "Chalkduster")
    gameLevel.fontColor = SKColor.white
    gameLevel.fontSize = 50
    gameLevel.position = CGPoint(x: 500, y: 16)
    addChild(gameLevel)
    gameLevel.text = "Level: \(gameLevelValue)"

}

func gameTimeStart() {
    levelTimerLabel.fontColor = SKColor.white
    levelTimerLabel.fontSize = 100
    levelTimerLabel.position = CGPoint(x: 500, y: 350)
    addChild(levelTimerLabel)

    let counterDecrement = SKAction.sequence([SKAction.wait(forDuration: 1.0), SKAction.run(countDownAction)])

    run(SKAction.sequence([SKAction.sequence([SKAction.repeat(counterDecrement, count: 3), SKAction.run(endCountDown)])]))
}

func countDownAction() {
    levelTimerValue -= 1
}
func endCountDown(){
    levelTimerLabel.removeFromParent()
    levelTimerValue = 3
    newGameStart()
}

func createPlayer(){
    player = SKSpriteNode(imageNamed: "player")
    player.position = CGPoint(x: 100, y: 384)
    player.physicsBody = SKPhysicsBody(texture: player.texture!, size: player.size)
    player.physicsBody?.contactTestBitMask = 1
    addChild(player)
}

override func update(_ currentTime: TimeInterval) {
    scoreUpdate()

}

func scoreUpdate() {
    for node in children {
        if node.position.x < -300 {
            node.removeFromParent()
        }
    }
    if !isGameOver {
        score += 1
    }
}

@objc func createEnemy() {
    if !isGameOver {
        guard let enemy = possibleEnemies.randomElement() else {return}

        let sprite = SKSpriteNode(imageNamed: enemy)
        sprite.position = CGPoint(x: 1200, y: Int.random(in: 50...736))
        addChild(sprite)

        sprite.physicsBody = SKPhysicsBody(texture: sprite.texture!, size: sprite.size)
        sprite.physicsBody?.categoryBitMask = 1
        sprite.physicsBody?.velocity = CGVector(dx: -500, dy: 0)
        sprite.physicsBody?.angularVelocity = 5
        sprite.physicsBody?.linearDamping = 0
        sprite.physicsBody?.angularDamping = 0
    }

    else {

    }
}

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
    guard let touch = touches.first else {return}
    var location = touch.location(in: self)

    if location.y < 100 {
        location.y = 100
    } else if location.y > 668 {
        location.y = 668
    }
    player.position = location
}

func didBegin(_ contact: SKPhysicsContact) {
    let explosion = SKEmitterNode(fileNamed: "explosion")!
    explosion.position = player.position
    addChild(explosion)

    player.removeFromParent()

    isGameOver = true
    gameOver()
}

func newGame() {
    gameTimeStart()
}

func newGameStart() {
    isGameOver = false
    gameView.gameScene()
    score = 0
    scoreUpdate()
    createPlayer()
}

func gameOver() {

    if  isGameOver{
        let ac = UIAlertController(title: "Oh No!", message: "You Scored \(score) try again?", preferredStyle: .alert)
        ac.addAction(UIAlertAction(title: "Yes!", style: .default, handler: { action in self.newGame()}))
        ac.addAction(UIAlertAction(title: "No, Thanks!", style: .default, handler: nil))

        self.view?.window?.rootViewController?.present(ac, animated: true, completion: nil)

    }

}

}

Выше мой первый уровень.

Я хочу отслеживать результат в функции ScoreUpdate (), которая затем загрузит уровень нового класса два ", которые я могу затем увеличить частоту врага и добавить больше вещей.

Я понятия не имею, как загрузить новый класс!

Есть идеи? Я много гуглил, но, как я уже сказал, я занимаюсь Swifting около двух месяцев и пишу около шести.

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...