2014-02-12 10 views
5

Ich habe eine iOS-App, die Sprite-Kit verwendet, und ich bin bereit, meine Kunstwerke hinzuzufügen. Das Artwork ist Pixel-Art und ist von Natur aus sehr klein. Ich versuche, den besten Weg zu finden, diese in Art und Weise anzuzeigen, in dem:Wie wird Pixel Art in einer App verwendet?

  1. Alle der Technik ist die gleiche Größe, was bedeutet, dass ein Bildpixel genau die Menge der realen Welt Pixel nimmt, wie in allen anderen Bilder.

  2. Es wird nicht verwischt, um die Texturen glatter aussehen zu lassen, was häufig beim Skalieren von Bildern passiert.

Ich habe versucht, wie so die zweite Lösung:

self = [super init]; 
if(self){ 
    self.size=size; 
    self.texture = [SKTexture textureWithImageNamed:@"ForestTree1.png"]; 
    self.texture.filteringMode = SKTextureFilteringNearest; 

    [self.texture size]; 
} 
return self; 

Der obige Code in der Initialisierung des SKSpriteNode ist, die die Textur haben.

Dieses ist mein ursprüngliches Bild (für eine einfache Referenz skaliert):

Das Problem ist, dass mein Ergebnis ist immer wie folgt aussieht:

its blurry!!!!!

(Der Boden der Rumpf, der versetzt wird, ist nicht Teil dieser Frage.) Ich verwende keine Bewegungsunschärfe oder ähnliches. Ich bin mir nicht sicher, warum es nicht korrekt angezeigt wird.

Edit 1: ich nicht erwähnt oben, dass die Bäume ständig Animieren wurden, wenn die Screenshots aufgenommen wurden. Wenn sie immer noch sehen sie wie folgt aus:

Das obige Bild von zwei Bäumen ist mit einer überlappenden aufgrund eines Fehlers verursacht blätterte später behoben werden. Meine Frage ist nun, wie kann ich verhindern, dass das Bild während der Animation unscharf wird?

Edit 2:

ich mehrere Instanzen des Baumes am Hinzufügen, die jeweils die gleiche Textur zu laden. Ich weiß es als nichts mit der Animation zu tun, weil ich den Code geändert, um nur einen Baum hinzuzufügen und zu animieren, und es wurde perfekt pixelig.

+0

welche Art von Animation? Änderst du die Größe des Sprites? Wenn ja, versuchen Sie, jedes Mal den nächsten Filter zu setzen, wenn sich die Größe geändert hat, vielleicht hilft das. Wenn sich die Bäume über den Bildschirm bewegen, kann die Unschärfe einfach auf LCD-Nachleuchten/Bewegungsunschärfe zurückzuführen sein. Siehe diese Antwort: http://stackoverflow.com/a/21466168/201863 – LearnCocos2D

+0

Siehst du die Unschärfe auf dem Simulator oder dem Gerät? – user688518

+0

@ LearnCocos2D Ich ändere die Position des Baumes bei jedem 'update:' Aufruf in der 'SKScene'. Es läuft im Simulator. Vielleicht, wenn ich es positioniere, wird es zwischen Pixeln gerendert? Ich habe jedes Mal versucht, den Filter zu setzen, aber ich habe nichts geändert. – 68cherries

Antwort

0

ich das Problem gelöst habe ...aber es ist wirklich ein Hack. Ich habe eine SKScene, die der Elternknoten zu allen "Bäumen" (SKSpriteNodes) ist. Diese Szene fügt sich selbst mehrere Bäume hinzu. Zuerst dachte ich, dass dies ein Problem wäre, denn wenn ich nur einen Baum hinzufügen würde, würde das Bild korrekt angezeigt. Die answer to this question führte mich zu der Annahme, dass ich ein Singleton in der (die Textur ist in einem) programmatisch erstellen und es an die Baumklasse übergeben muss, um die Textur von einer Init-Methode zu erhalten. Ich habe eine Eigenschaft in der SKScene gemacht, um den Texturatlas zu halten, so dass ich es jedes Mal an die Baumklasse weitergeben konnte, wenn ich eine neue erstellte. Ich habe versucht, die Textur aus Textur Atlas (in der Baumklasse) mit der textureNamed: Methode zu laden. Das hat immer noch nicht funktioniert. Ich kehrte zurück zum Laden der Textur mit SKTexture textureWithImageNamed: Methode und es funktionierte. Weiter mehr ich änderte, um Code zurück, so dass die Baum-Unterklasse würde nicht gesendet werden Singleton überhaupt und es funktionierte immer noch.

Im SKScene bekomme ich den Texturatlas mit:

[SKTextureAtlas atlasNamed:@"Textures"]; //Textures is the atlas name. 

und den Rückgabewert gesetzt die SKTextureAtlas Eigenschaft oben beschrieben zu sein. Ich dachte, dass vielleicht der Atlas musste einfach in den Code zu einem bestimmten Zeitpunkt initialisiert, so habe ich versucht, dies:

SKTextureAtlas *myAtlas = [SKTextureAtlas atlasNamed:@"Textures"]; 

und die folgenden allein auf einer Linie:

[SKTextureAtlas atlasNamed:@"Textures"] 

aber weder gearbeitet. Anscheinend muss ich eine Eigenschaft in der Stammklasse meines Baumes haben, die die ist, die die Textur enthält, die der Baum ohne Bezug auf eine SKTextureAtlas überhaupt verwendet ... Ist das ein Fehler oder etwas? Es funktioniert jetzt, aber es fühlt sich an wie ein Hack.

0

Die Pixel in Ihrem Bild müssen perfekt mit den Pixeln auf dem Bildschirm übereinstimmen.

Wenn Ihr Bild 100x100 ist und Sie es über einen ganzen Bildschirm mit 105x105 anzeigen, wird es interpoliert, um herauszufinden, wie es gemacht wird.

Wenn Sie es mit einer skalierten Auflösung von einigen Vielfachen von 2 anzeigen (was richtig funktionieren sollte), müssen Sie dem Renderer trotzdem sagen, dass er bei der Skalierung keine Pixel interpolieren soll.

+0

scheint nicht zu funktionieren. Ich habe die 'size' Eigenschaft des' SKSpriteNode' auf das Doppelte der Größe des Bildes eingestellt, und interpoliert immer noch. – 68cherries

1

Sie müssen "nearest" Filtern verwenden:

self.texture.filteringMode = SKTextureFilteringNearest; 
+0

Ich hatte versucht, das zu tun, und ich änderte es, um zu sehen, ob es einen Unterschied machte. Es stellte sich heraus, dass es nicht war. – 68cherries

0
[self setScaleMode:SKSceneScaleModeAspectFill]; 

SKTexture* texture = [SKTexture textureWithImageNamed:@"image"]; 
[texture setFilteringMode:SKTextureFilteringNearest]; 

SKSpriteNode* imageNode = [SKSpriteNode spriteNodeWithTexture:texture]; 
[self addChild:imageNode]; 

Funktioniert perfekt für mich. Es gibt keine Unschärfe mit Animation

+0

Ich schätze die Hilfe, aber ich habe die Lösung gefunden und meine eigene Frage beantwortet. – 68cherries