2016-11-07 14 views
1

私は、SwiftとSpriteKitを使用してゲームでレベル選択するための "カード"の基本レイアウトをコーディングしました。それは、基本的にちょうど6レベルの選択カードを並べて、ユーザーが選択できるレベルの画像を持っています。それらを作成するために、私はfor-loopを実行し、最初のものを画面の中央に置き、パディングを行い、次に2番目にパディングします。各カードはpngイメージのSKSpriteNodeです。各カードは、デバイスの幅の約3分の1、デバイスの高さの約3分の1です。SKSpriteNodesは部分的にレンダリングされるのはなぜですか?

私はそれらの6つをすべて作成し、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に縮小し、パディングを少なくすると、レンダリングがうまくいきます。

私はシーンとビューのサイズとスケールで試してみましたが、改善はありませんでした。

私はさまざまな画像を使用しようとしましたが、全く変更はありません。

私はすべてのzPositionを2回チェックして改善が見られませんでした。

シーン内の他のすべてのオブジェクトを体系的に削除しようとしましたが、まだ問題があります。

私はそれらをカードノードという名前の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という意味ではありません。これは、アップルのマーケティング、文書化が不十分で、積極的で受動的な欺瞞と難読化の複数のレベルの直接的な結果です。この特別なケースでは、Daveは、画面サイズや形状のバリエーションを簡単に扱う方法と、そうではないという事実との間に、Appleが描写する方法の違いに苦労しています。それは工夫された混乱です。いったんあなたは、彼らが複数の画面サイズと形状を扱う方法を邪魔すると、他のすべての簡単で簡単な描写(Appleによる)は同じように不誠実で意図的ではありません。 – Confused

+0

それは意味もなく悪いもありませんでした – Knight0fDragon

答えて

0

今日私は、シーンとビューのサイズを変更することでこの作業を行う方法を見つけようとしましたが、まったく運がありませんでした。

私の解決策は、デバイスの種類を確認することです。それがiPadの場合は、画像サイズを縮小し、画像間でバッファをカットして、切り取らないようにします。私はこれを非常に良い解決策とは考えていません。本当に良い解決策が見つかるまでは、まさにその回避策です。あなたの考えのためにみんなありがとう。私は間違いなくそれを感謝します!

関連する問題