簡體   English   中英

SKScene視圖渲染問題(見圖)

[英]SKScene View Rendering Issues (see photo)

單擊---->以獲得圖片:) 到目前為止,這是我的GameScene,其經過硬編碼並鏈接到包含場景數據的全局文件

  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正常運行的版本發布給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混合的舊代碼可以幫助:

    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。 再次感謝所有抽出寶貴時間在此處回答問題的人。 包含圖片

舊版更新 Checked Assets並注意到BackGround大小已關閉,因為游戲的這一部分是兩個月前創建的,所以我忘記了我手動調整了代碼中的圖片****圖像尚未完全解決問題,圖像顯示出來,並且背景看起來並不像野餐毯子。

查看我的代碼時,我發現我創建的原始項目中缺少注釋。 之所以提出這一點是因為,如果進行了適當的注釋,我會注意到從UIKIT + SpriteKit混合端口移植到嚴格使用SpriteKit時所做的更改才生效。

1)就像提到的那樣,我正在考慮做一個通用的應用程序,如GameViewController的舊代碼中所指定。 視圖控制器內部的嵌入式視圖,集合視圖,SkContainer視圖,UIImage視圖,所有這些都使用GameViewController的約束創建。

2.)對於Apple TV,游戲場景的縱橫比為縱橫比,所使用的CGPoints使資產適合該大小。 (SMH)

3)每個節點都有不同的比例因子來完成渲染正確的視圖,這些圖像是從我之前在一篇關於SKEmitters的Database Swift文件中填充的,

4.)移植到SpriteKit,您將失去一些很酷的UIButton功能,但無法通過Segues轉換場景。 (導致內存峰值和CPU下降)如果您不知道自己在做什么。

   Node.xScale = 0.5
   Node.yScale = 0.5

是我需要呈現適當大小以及調整資產以符合尺寸的代碼。 有時,它歸結為一小段代碼,在其中只有30個快速文件。 如果我//評論了他們的目的,我會節省數小時的“學習經驗”

使用場景編輯器進行SpriteKit轉換非常有趣,根據游戲的不同,代碼量可能很小也可能很大。 如果有很多按鈕,請使用“觸摸開始”方法對按鈕進行子類化,並使用全局場景/數據庫/或字典來存儲數據,以避免強引用。

最后:教程很棒,您可以獲得大量的代碼,使您對項目感到興奮,花時間逐行​​進行以“准確地”學習代碼的作用。 評論發現。 因此,如果您必須重構項目,那么您就是一個開明的編碼員,而不是在黑暗中摸索。

(有一些廢話):)

遺產

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM