2017-09-15 106 views
8

iPhone X został wydany kilka dni temu. Próbuję zaktualizować jedną z moich gier do nowego telefonu. Jednak w jednej scenie ze sceną SpriteKit scena nie jest skalowana, aby wypełnić cały ekran.Scena SpriteKit nie pasuje do całego widoku na iPhone X

Oto kod, aby wyświetlić scenę:

GameScene *scene = [GameScene unarchiveFromFile:@"GameScene"]; 
scene.scaleMode = SKSceneScaleModeFill; 
// skView is basically self.view casted to SKView 
[skView presentScene:scene]; 

Wielkość sceny w pliku SKS jest 2048x1536.

To jak to wygląda:

Picture

czerwonej części jest zawartość sceny. Ciekawe jest to, że tło (które jest niebieskie i szare, wyświetla się poprawnie)

W każdym razie, żeby to naprawić? Nie ma problemu z rozciąganiem sceny, aby wypełnić ekran (nic nie będzie pokryte przez zaokrąglonym narożniku i wycięcie)

Odpowiedz

0

może być czystsze podejście do gier SpriteKit wspierać ekran iPhone X, ale wyszedłem z następującym przedłużenia na GameViewController:

import SpriteKit 

class GameViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     if let view = self.view as? SKView { 
      if let scene = SKScene(fileNamed: "yourscenefilename") { 
       // Set the scale mode according to the device 
       if isIphoneX { 
        scene.scaleMode = .resizeFill 
       } else { 
        scene.scaleMode = .aspectFill 
       } 

       // Any additional setup... 
       ... 

       // Present the scene 
       view.presentScene(scene) 
      } 
     } 
    } 
} 

extension GameViewController { 
    var isIphoneX: Bool { 
     let aspectRatio = Double(view.frame.width/view.frame.height) 
     let iphoneXAspectRatio = 2436.0/1125.0 
     return (aspectRatio == iphoneXAspectRatio) ? true : false 
    } 
} 

Zasadniczo ustawia w trybie skalowania zgodnie z proporcjami ekranu. Jeśli jest to proporcja ekranu w formacie X dla iPhone'a, ustaw tryb skalowania na "resizeFill", w przeciwnym razie dla klasycznych prostokątów ekrany iPhone i iPad korzystają z trybu "aspectFill".

Znalazłem, że tryb resizeFill to jedyny sposób, aby zawartość wypełniła cały ekran iPhone X bez zniekształcania ani obcinania zawartości sceny. Jeśli masz w grze węzeł HUD (wynik, żetony, przyciski itp.), Musisz również dokonać zmian!

override func didMove(to view: SKView) { 
    // Any additional setup... 
    ... 

    if isIPhoneX { 
     hud = SKReferenceNode(fileNamed: "yourIPhoneXHUDScene") 
    } else { 
     hud = SKReferenceNode(fileNamed: "yourStandardHUDScene") 
    } 

    cam.addChild(hud) 
} 

Testowane z każdego rozmiaru ekranu iPhone (3.5" , 4" , 4,7" , 5,5" , 5,8") w symulatorze. Jednak nie jestem pewien, w jaki sposób radzić sobie z gamescenes Retina iPad (wielkość 2048 x 1536) ustawione w Xcode.

0

aspectFill działa dobrze dla mnie. Ta scena jest obcięty po lewej i po prawej stronie, ale to nie jest zniekształcony.

mam SKView zmieniany automatycznie z autoLayout a następnie przedstawiam mój Scena z formatem wypełnienia