SKScene查看渲染问题(见图)

时间:2016-02-03 00:33:39

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

点击----> for pic :) 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

GameViewController:

 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。它吸收了错误的资产,场景看起来像是图片。

来自GameScene的

旧代码与UIKit和SpriteKit Mix有助于:

    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。再次感谢所有花时间在这里回答问题的人。包括图片

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

1 个答案:

答案 0 :(得分:0)

在查看我的代码时,我注意到我在创建的原始项目中缺少评论。我提出这个问题是因为如果评论得当,我会注意到当从UIKIT + SpriteKit端口混合使用严格的SpriteKit时,这些更改才会生效。

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

2。)Apple TV的游戏场景sks处于宽高比,使用的CGPoints使资产符合这个尺寸。 (smh)

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

4。)移植到SpriteKit,你失去了一些很酷的UIButton功能,但是通过Segues过渡场景。 (如果你不知道自己在做什么,会导致内存飙升和CPU故障)。

   Node.xScale = 0.5
   Node.yScale = 0.5

是我需要渲染适当大小的代码,以及调整我的资产以符合我的尺寸。有时它归结为一小段代码,其中有30个swift文件。如果我已经评论了他们的目的,我会节省自己几个小时的学习经历&#34;

使用场景编辑器进行SpriteKit转换可能很有趣,并且代码量可能相当小或大,具体取决于游戏。按下你的按钮,在触摸开始方法中,如果有很多,并使用全局场景/数据库/或dict来存储数据,以避免强引用。

最后:教程非常棒你得到一堆代码让你兴奋,花时间逐行​​学习&#34;完全&#34;代码在做什么。评论这些发现。因此,如果你必须重构一个项目,你就是一个启迪编码器,而不是在黑暗中接触吸管。

(有几个redbulls):)

遗产