spritekit 场景转换工作不正确

Posted

技术标签:

【中文标题】spritekit 场景转换工作不正确【英文标题】:spritekit scene transition works incorrect 【发布时间】:2017-10-23 10:45:24 【问题描述】:

我在使用 swift 4 编写的 spritekit 应用程序中的场景转换遇到问题

我有一个声明 EndScene 类的 gameover.swift 文件:

import Foundation
import SpriteKit

class EndScene: SKScene, SKPhysicsContactDelegate 


var RestartButton : UIButton!
var HighScore : Int!
var HighScoreLabel : UILabel!
var GameOverLabel : UILabel!
override func didMove(to view: SKView) 

    self.scene?.backgroundColor = SKColor.white

    RestartButton = UIButton(frame: CGRect(x:0, y:0, width: view.frame.size.width/3
        , height: 30))
    RestartButton.titleLabel?.adjustsFontSizeToFitWidth = true
    RestartButton.center = CGPoint(x: view.frame.size.width/2 , y: view.frame.size.height/1.5)
    RestartButton.setTitle("restart", for: UIControlState.normal)
    RestartButton.showsTouchWhenHighlighted = true
    RestartButton.setTitleColor(SKColor.black, for:  UIControlState.normal)
    RestartButton.addTarget(self, action: #selector(EndScene.Restart), for: UIControlEvents.touchUpInside)
    self.view?.addSubview(RestartButton)




    GameOverLabel = UILabel (frame: CGRect(x:0, y:0, width: view.frame.size.width/3.8, height: 30))
    GameOverLabel.center = CGPoint(x: view.frame.size.width/2 , y: view.frame.size.height/10)
    GameOverLabel.textColor = SKColor.red
    GameOverLabel.text = "Game Over"
    self.view?.addSubview(GameOverLabel)



func Restart()
    RestartButton.removeFromSuperview()
    GameOverLabel.removeFromSuperview()
    self.removeAllChildren()
    self.view?.presentScene(GameScene(), transition: SKTransition.reveal(with: .up, duration: 0.3))




 

GameScene 是在 GameScene.swift 文件中声明的类。它包含描述游戏过程的类声明。

问题是:

当游戏从 GameScene 开始时,它工作正常(所有对象都被淹没并且物理工作),但是当我从 EndScene 重新启动游戏时,它工作不正确(1 个对象不时被淹没,但所有其他对象都没有被淹没,甚至背景颜色不会被淹没)。

一般可以用它做什么?

【问题讨论】:

【参考方案1】:

您不应该只通过调用其无参数初始化程序来创建GameScene。查看GameScene 在生成的GameViewController.swift 文件中是如何呈现的。你会看到它调用了(fileNamed:)初始化器。

所以改变这一行:

self.view?.presentScene(GameScene(), transition: SKTransition.reveal(with: .up, duration: 0.3))

self.view?.presentScene(GameScene(fileNamed: "GameScene"), transition: SKTransition.reveal(with: .up, duration: 0.3))

【讨论】:

以上是关于spritekit 场景转换工作不正确的主要内容,如果未能解决你的问题,请参考以下文章

尝试在具有 SpriteKit 场景 (SWIFT) 的 didMoveToView 中使用 waitForDuration 延迟生成节点但不工作

Spritekit 应用程序在设备上运行时崩溃,在 swift 3 转换后在模拟器上工作

SpriteKit 在转换到新场景时收到有关 UIElements 的错误

SpriteKit横向不工作

游戏中的 SpriteKit 商店场景

如何使用 Swift 正确切换 SpriteKit 中的 SKScene?