2016-06-01 11 views
0

In meinem Spiel ändert sich die Position meiner SKNodes leicht, wenn ich die App auf einem virtuellen Simulator vs auf einem echten Gerät (meinem iPad) starte.Wie kann ich SKSpriteNode-Positionen für jeden Simulator/jedes Gerät gleich machen?

Hier sind Bilder von dem, worüber ich spreche.

This is the virtual simulator

This is my Ipad

Es ist schwer zu sehen, aber die beiden roten Kästen sind etwas höher auf meinem iPad als im Simulator

Hier ist, wie ich die Größe und Position des declare rote Felder und grünes Netz: Der folgende Code wird in meiner GameScene.swift Datei befindet

func loadAppearance_Rim1() {             
Rim1 = SKSpriteNode(color: UIColor.redColor(), size: CGSizeMake((frame.size.width)/40, (frame.size.width)/40)) 
Rim1.position = CGPointMake(((frame.size.width)/2.23), ((frame.size.height)/1.33))   
Rim1.zPosition = 1              
addChild(Rim1)               
} 

func loadAppearance_Rim2(){             
    Rim2 = SKSpriteNode(color: UIColor.redColor(), size: CGSizeMake((frame.size.width)/40, (frame.size.width)/40)) 
    Rim2.position = CGPoint(x: ((frame.size.width)/1.8), y: ((frame.size.height)/1.33))                          
    Rim2.zPosition = 1              
    addChild(Rim2)               
} 
func loadAppearance_RimNet(){           
    RimNet = SKSpriteNode(color: UIColor.greenColor(), size: CGSizeMake((frame.size.width)/7.5, (frame.size.width)/150)) 
    RimNet.position = CGPointMake(frame.size.width/1.99, frame.size.height/1.33) 
    RimNet.zPosition = 1              
    addChild(RimNet)               
} 
func addBackground(){ 
    //background 
    background = SKSpriteNode(imageNamed: "Background") 
    background.zPosition = 0 
    background.size = self.frame.size 
    background.position = CGPoint(x: self.size.width/2, y: self.size.height/2) 
    self.addChild(background) 
} 

Zusätzlich mein GameViewController.swift sieht wie folgt aus

import UIKit 
import SpriteKit 

class GameViewController: UIViewController { 

var scene: GameScene! 

override func viewDidLoad() { 
    super.viewDidLoad() 

    //Configure the view 
    let skView = view as! SKView 
    //If finger is on iphone, you cant tap again 
    skView.multipleTouchEnabled = false 

    //Create and configure the scene 
    //create scene within size of skview 
    scene = GameScene(size: skView.bounds.size) 
    scene.scaleMode = .AspectFill 
    scene.size = skView.bounds.size 
    //scene.anchorPoint = CGPointZero 

    //present the scene 
    skView.presentScene(scene) 



} 

override func shouldAutorotate() -> Bool { 
    return true 
} 

override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask { 
    if UIDevice.currentDevice().userInterfaceIdiom == .Phone { 
     return .Landscape 
    } else { 
     return .All 
    } 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Release any cached data, images, etc that aren't in use. 
} 

override func prefersStatusBarHidden() -> Bool { 
    return true 
} 
} 

Wie kann ich die Positionen meiner Knoten gleich sein für jeden Simulator/physikalische Gerät machen?

+0

@Darvydas diese Frage ist sehr ähnlich zu der einmal in diesem Stapel Überlauf Beitrag beantwortet "http://StackOverflow.com/Questions/33787770/How-to-scale-position-Nodes-Swift-Spritekit-Custom-view " Könnten Sie mir bitte in die richtige Richtung zeigen? –

+0

Vielleicht hat dieses Problem damit zu tun, wie ich den Hintergrund einstelle? –

Antwort

0

Wenn Sie eine universelle Anwendung erstellen, müssen Sie die Größe der Szene mit ganzzahligen Werten deklarieren. Hier ein Beispiel:

scene = GameScene(size:CGSize(width: 2048, height: 1536)) 

Dann, wenn Sie die Positionen und Größen Ihrer Knoten mit CGPoint und CGSize initialisieren, so dass sie auf SKScene Größe abhängig machen. Hier ein Beispiel:

node.position = CGPointMake(self.frame.size.width/2, self.frame.size.height/2) 

Wenn Sie die Größe der Szene für eine Universal-App wie folgt erklären:

scene.size = skView.bounds.size 

dann SKSpriteNode Positionen werden alle durcheinander. Möglicherweise müssen Sie den scaleMode auch in .ResizeFill ändern. Das hat für mich funktioniert.

0

Sie sollten diese Fließkommawerte mit einem Aufruf von (int) round (float) zu ganzen Zahlen runden, sodass die Werte an ganzen Pixeln ausgerichtet werden. An jeder Stelle, an der Sie CGPoint oder CGSize verwenden, sollten ganze Pixel anstelle von Fließkommawerten verwendet werden.

+0

Wenn ich einen Integer-Wert anstelle eines Floats verwende, wird die Positionierung des Knotens nicht so genau sein, wie ich es brauche? Auch ich bin mir nicht sicher, wie genau das in meinem Code zu implementieren ist. Gibt es eine Möglichkeit, den Fließkommawert in derselben Zeile zu runden, die ich die Position deklariere? @MoDJ –

+0

Bitte nehmen Sie sich etwas Zeit, um Pixel zu verstehen und wie Punkte Pixel in iOS und SpriteKit zuordnen: http://math.hws.edu/graphicsbook/c2/s1.html – MoDJ

+0

Nach einiger Zeit zu verstehen, dass ich denke, ich müssen für jeden SKSpriteNode @MoDJ Ankerpunkte implementieren –