2016-11-07 130 views
1

我已經使用Swift和SpriteKit爲遊戲中的關卡選擇編寫了「卡片」的基本佈局。基本上只有6級選擇卡並排顯示用戶可以選擇的級別圖片。要創建它們,我正在運行一個for循環,並將第一個放置在屏幕的中心,填充,然後是第二個,然後填充等等。每張卡片都是來自png圖像的SKSpriteNode。每張卡約爲設備寬度的三分之一,約爲設備高度的三分之一。爲什麼SKSpriteNodes只能部分渲染?

我創建了它們全部六個,然後創建了一個動作,將所有6張卡片向左或向右移動以選擇播放器上的哪個卡片。中心的那個是被選中的那個。

一切工作在iphone模擬器很好(在iPhone 6,iPhone 6 plus,iPhone 7 Plus和iPhone 5上測試...都很好)。在iPad模擬器上,第一張和最後一張卡片都有一部分圖片根本不呈現。第一張卡的左側損失了大約1/4,最後一張卡的損失大約爲1/4,或者丟失在最右側。我試着在物理iPad上運行它,它也有同樣的問題。當我在iPad Pro 12.7上運行它時,情況會變得更糟......它會切斷更多圖像。

如果我選擇只顯示6張牌中的5張,他們都會呈現出色。

如果我選擇將它們縮小到設備寬度的1/4和設備高度的1/4左右,並減少它們的填充效果,那麼它們的渲染效果會很好。

我試着玩場景和視圖的大小和比例,並沒有任何改善。

我試過使用不同的圖像,根本沒有變化。

我已經檢查了所有的zPositions,發現沒有改進。

我試圖系統地刪除場景中的所有其他對象,仍然有問題。

我已經把它們放在它們自己的「layer」上,它是一個名爲cardNode的SKEffectNode。 (這是一個SKEffectNode,因爲我選擇稍後在警報屏幕出現時模糊它)。我認爲把它們放到自己的層上可能會有所幫助,但事實並非如此。

我已經把物理實體放在卡片上,以確保它們仍然存在,物理實體出現在正確的位置。如果我點擊未呈現的部分節點,它仍然表現得很好,就好像它仍然在該區域中渲染一樣。

我不知道從哪裏去解決這個問題。理想情況下,我想在未來添加更多卡,但會陷入這個問題。

這是我創建卡的代碼。

let cardNode = SKEffectNode() 

let levelCardArray: [String] = [ 
    "BlackBoxLevelCard.png" 
    ,"FruitLevelCard.png" 
    ,"SportsLevelCard.png" 
    ,"BarnLevelCard.png" 
    ,"SeaLevelCard.png" 
    ,"SpaceLevelCard.png" 
] 

let screenWidth = UIScreen.main.bounds.width 
let screenHeight = UIScreen.main.bounds.height 

let w10 = screenWidth * 0.10 
let w40 = screenWidth * 0.40 
let w50 = screenWidth * 0.50 
let w60 = screenWidth * 0.60 

let h50 = screenHeight * 0.50 

let cardMargin = w10 
let cardSize = CGSize(width: w40, height: w60) 
let startPosition = CGPoint(x: w50, y: h50) 

override func didMove(to view: SKView) { 

    let scene = levelSelectionScene(size: view.bounds.size) 
    scene.backgroundColor = UIColor.black 
    let skView = view as SKView 
    skView.ignoresSiblingOrder = true 

    cardNode.zPosition = 100 
    self.addChild(cardNode) 

for i in 1...levelCardArray.count { 

let currentArrayValue = i - 1 

    let cardSprite = SKSpriteNode(imageNamed: levelCardArray[currentArrayValue]) 
    cardSprite.size = cardSize 
    cardSprite.position = CGPoint(x: startPosition.x + (CGFloat(currentArrayValue) * (cardSize.width + cardMargin)), y: startPosition.y) 
    cardSprite.zPosition = cardNode.zPosition 
    cardSprite.name = "levelCardObject" 
    cardNode.addChild(cardSprite) 

} 

任何幫助或見解將不勝感激。多謝你們!

+2

有很多事情要跟你去,我建議不要在SpriteKit中使用屏幕尺寸,一切都應該使用場景尺寸來完成 – Knight0fDragon

+1

不要吝嗇和貶低@ Knight0fDragon。這是蘋果營銷的直接結果,糟糕的文檔記錄以及多層次的主動和被動欺騙和混淆。在這個特殊情況下,戴夫,你正在努力解決蘋果公司在處理屏幕尺寸和形狀變化方面的差異,以及事實並非如此。這是一個人爲的混亂。一旦你解開了他們對待多種屏幕尺寸和形狀的方式,你會發現幾乎所有其他的簡單易用的簡單描述(蘋果公司)都是同樣不真誠和蓄意的廢話。 – Confused

+0

這既不意味着也不貶意 – Knight0fDragon

回答

0

我今天嘗試了一整天,試圖通過調整場景和視圖的大小來找到一種方法來完成這項工作,而且根本沒有任何運氣。

我的解決方案是檢查設備類型,如果它是iPad,我將減少圖像大小和圖像之間的緩衝區,直到它不切斷它們。我不認爲這是一個很好的解決方案,只是一個解決辦法,直到我可以找到一個更好的方式來做到這一點。不過謝謝你們的想法。我絕對感激!