【问题标题】:SKScene View Rendering Issues (see photo)SKScene 视图渲染问题(见图)
【发布时间】:2016-02-03 00:33:39
【问题描述】:

点击---->查看图片:) This is my GameScene as of now, its hard coded and linked to a Global File of that holds scene data

  override func didMoveToView(view: SKView) {
      super.didMoveToView(view)   



    playButton.hidden = true

    let background = SKSpriteNode(imageNamed: "us-flag")

    background.position = CGPoint(x: size.width/2, y: size.height/2 )

    background.blendMode = .Replace
    background.zPosition = -1
    background.size = self.size

    addChild(background)

    gameOverButton = SKSpriteNode(imageNamed: "gameOver")
    gameOverButton.position = CGPoint(x: size.width / 2 , y: scene!.frame.height - 200)
    gameOverButton.zPosition = 3
    gameOverButton.xScale = 1.5
    gameOverButton.yScale = 1.5

    gameOverButton.hidden = true

    addChild(gameOverButton)

    gameScore = CustomSKLabel(fontNamed: "Chalkduster")
    gameScore.text = "Votes: 0"
    gameScore.position = CGPoint(x: Int((self.size.width - gameScore.frame.width )) , y: 22)
    gameScore.horizontalAlignmentMode = .Center
    gameScore.fontSize = 27
    gameScore.zPosition = 3
    gameScore.fontColor = SKColor.whiteColor()

    addChild(gameScore)



 /*   for i in 0 ..< 5 { createSlotAt(CGPoint(x: 160 + (i * 170), y: 410)) }
    for i in 0 ..< 4 { createSlotAt(CGPoint(x: 240 + (i * 170), y: 320)) }
    for i in 0 ..< 5 { createSlotAt(CGPoint(x: 160 + (i * 170), y: 230)) }
    for i in 0 ..< 4 { createSlotAt(CGPoint(x: 240 + (i * 170), y: 140)) }

    RunAfterDelay(1) { [unowned self] in
        self.createEnemy() */


    for i in 0 ..< 5 { createSlotAt(CGPoint(x: 680 + (i * 170), y: 535)) }
    for i in 0 ..< 4 { createSlotAt(CGPoint(x: 715 + (i * 170), y: 435)) }
    for i in 0 ..< 5 { createSlotAt(CGPoint(x: 680 + (i * 170), y: 335)) }
    for i in 0 ..< 4 { createSlotAt(CGPoint(x: 715 + (i * 170), y: 245)) }
    RunAfterDelay(1) { [unowned self] in
        self.createEnemy()

我的游戏场景是硬编码的,所有其他场景都是在场景编辑器中构建的,我的尝试是一个通用应用程序,但决定只为 iPhone 发布它曾经正常工作,直到将游戏完全移植到 SpriteKit

游戏视图控制器:

 if let scene = WelcomeScene (fileNamed:"WelcomeScene") {

    let skView = self.view as! SKView
    skView.showsFPS = Constant.DEV.DEBUG
    skView.showsNodeCount = Constant.DEV.DEBUG
    skView.ignoresSiblingOrder = true
    scene.scaleMode = .AspectFit
    skView.presentScene(scene)



    }


   }


override func prefersStatusBarHidden() -> Bool {
    return false
}

override func shouldAutorotate() -> Bool {
    return true
}

override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
    return [UIInterfaceOrientationMask.LandscapeRight ,UIInterfaceOrientationMask.LandscapeLeft]

}

}

GlobalSceneDataSwift:

 if let scene = sceneToLoad {
    scene.size = size
    scene.scaleMode = scaleMode
    let transition = SKTransition.fadeWithDuration(3)
    self.view?.presentScene(scene, transition: transition)

      }
  }
}

在我迁移到 SpriteKit 之前,所有东西都嵌入到了 GameViewController 中,我将它用作常规 ViewController,并嵌入了子视图,以促进 GameScene,直到大约第四轮,当 cpu 降至零并且内存达到峰值时,它一直运行良好。所以我选择了 SpriteKit。所有其他场景都适合 iPhone。除了游戏场景。它引入了错误的资产,场景看起来像图片。

GameScene 的旧代码与 UIKit 和 SpriteKit 混合,以防万一:

    let deviceIdiom = UIScreen.mainScreen().traitCollection.userInterfaceIdiom

    switch (deviceIdiom) {

    case .Pad:

        let active = SKSpriteNode(imageNamed: self.name!)
        active.name = self.name
        active.size = CGSizeMake(100, 100)
        active.position = CGPoint(x: Int( active.frame.width + 0), y: Int(active.frame.height + 10))
        addChild(active)

    case .Phone: break

    case .TV:
        let active = SKSpriteNode(imageNamed: self.name!)
        active.name = self.name
        active.size = CGSizeMake(100, 100)
        active.position = CGPoint(x: Int( active.frame.width + 12), y: Int(active.frame.height + 12))
        addChild(active)

    default: break

    }

    let w12 = Int(self.size.width / 12)
    let w6 = Int(self.size.width / 6)
    let w5 = Int(self.size.width / 5)
    let h3 = Int(self.size.height / 3)

    for i in 0 ..< 5 { createSlotAt(CGPoint(x: w12 + (i * w5), y: h3 + 120 )) }
    for i in 0 ..< 4 { createSlotAt(CGPoint(x: w6  + (i * w5), y: h3 + 60)) }
    for i in 0 ..< 5 { createSlotAt(CGPoint(x: w12 + (i * w5), y: h3 + 10 )) }
    for i in 0 ..< 4 { createSlotAt(CGPoint(x: w6  + (i * w5), y: h3 - 50)) }

    RunAfterDelay(1) { [unowned self] in
        self.createEnemy()
    }
}

我坚持使用 SpriteKit,单人,因为老实说它更加稳定,具有过渡场景,尤其是具有很多移动部件的场景。场景大小 1920 * 1080 背景图像与该设置匹配,我选择了该大小以防我决定稍后移植到 Apple TV。再次感谢所有花时间在这里回答问题的人。包括图片

传统 更新 检查资产,发现背景尺寸关闭了,因为这部分游戏是两个月前创建的,我忘记了我在代码中手动调整了图片**** 还没有完全解决问题,我的图像显示,背景看起来不像野餐毯。

【问题讨论】:

    标签: swift view sprite-kit skscene ios-universal-app


    【解决方案1】:

    在查看我的代码时,我注意到我创建的原始项目中缺少 cmets。我提出这一点是因为如果正确评论,我会注意到当从 UIKIT + SpriteKit 移植到严格使用 SpriteKit 时这些更改会生效。

    1st) 至于提到我正在考虑做一个通用应用程序,正如 GameViewController 的旧代码中所指定的那样。视图控制器内的嵌入视图、集合视图、SkContainer 视图、UIImage 视图,所有这些都是使用 GameViewController 的约束创建的。

    2.) 游戏场景 sks 采用 Apple TV 的纵横比,使用的 CGPoints 使资产适合该大小。 (嗯)

    3.) 每个节点都有不同的比例因子来完成正确视图的渲染,这些图像是从一个数据库 Swift 文件中填充的,我在之前的一篇关于 SKEmitters 的文章中发布过,

    4.) 移植到 SpriteKit,你失去了一些很酷的 UIButton 功能,但通过 Segue 转换场景。 (导致内存峰值和 CPU 下降)如果您不知道自己在做什么。

       Node.xScale = 0.5
       Node.yScale = 0.5
    

    是我渲染正确尺寸以及调整我的资产以符合我的尺寸所需的代码。有时它归结为一小段代码,在 30 个 swift 文件中。如果我//评论了他们的目的,我会为自己节省数小时的“学习经验”

    使用场景编辑器进行SpriteKit转换,可以很有趣,并且代码量可以根据游戏的大小而定。子类化你的按钮,在 touches started 方法中,如果有很多按钮,并使用全局场景/数据库/或字典来存储数据,以避免强引用。

    最后:教程太棒了,你得到一堆代码,你做一个项目,你很兴奋,花时间逐行​​学习“确切地”代码在做什么。评论发现。因此,如果您必须重构一个项目,那么您就是一个开明的程序员,而不是在黑暗中寻找稻草。

    (有几个红牛):)

    传统

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-14
      • 2019-01-11
      • 1970-01-01
      相关资源
      最近更新 更多