Все.
Я относительно новичок в 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 около двух месяцев и пишу около шести.
Спасибо!