2013-11-15 4 views
9

Ich habe ein Problem mit SKTextureAtlas und Nearest-Neighbor-Filter für Texturen. Wenn ich die nächste Nachbar-Filterung ohne SKTextureAtlas verwende, funktioniert es gut, aber alles wird nur in lineare Filterung geändert, wenn ich ein SKTextureAtlas verwende.Wie verwenden Sie SKTextureFilteringNearest mit SKTextureAtlas

-Code und ohne SKTextureAtlas Ergebnis:

SKTexture* texture = [SKTexture textureWithImageNamed:@"grass"]; 
texture.filteringMode = SKTextureFilteringNearest; 
SKSpriteNode* node = [SKSpriteNode spriteNodeWithTexture:texture size:CGSizeMake(512,512)]; 

Sollte Produce Nearest Neighbor Filtering & Does enter image description here

-Code und Ergebnis Mit SKTextureAtlas:

SKTextureAtlas* atlas = [SKTextureAtlas atlasNamed:@"myAtlas"]; 
SKTexture* texture = [atlas textureNamed:@"grass"]; 
texture.filteringMode = SKTextureFilteringNearest; 
SKSpriteNode* node = [SKSpriteNode spriteNodeWithTexture:texture size:CGSizeMake(512,512)]; 

Sollte NearE Produce st Nachbar Filtering & DOES NOT enter image description here

Irgendwelche Vorschläge?

+1

Try spriteNodeWithTexture: ohne Größe zu spezifizieren, das macht ein Unterschied? Für mich am nächsten Filter mit Atlas-Texturen funktioniert, habe ich nicht versucht, das Sprite-Rect bei Init zu ändern. Sie können das Sprite immer noch skalieren, nachdem Sie es über xScale/yScale erstellt haben. – LearnCocos2D

+0

In Ordnung, ich habe das versucht und ich bekomme das gleiche Ergebnis :( –

+0

Ich konnte nicht Ihren Weg arbeiten, aber anstatt die Größe in der init setzen, setze ich die Größe danach ist '[node setSize:];' und es funktionierte –

Antwort

4

Ich habe mit genau dem gleichen Problem gekämpft.

Es scheint, dass wenn Sie den Filtermodus für ein SKTexture aus einem SKTextureAtlas einstellen, es den Filtermodus für alles, was aus diesem Atlas kommt, einstellt.

Ich habe es gelöst, indem ich zwei SKTextureAtlas (AtlasLinear und AtlasNearest) gemacht habe. Einer ist für meine normale Grafik, der andere ist für Pixelart. Das wirkt wie ein Zauber.

Aber mit sehr kleinen atlasses bekomme ich manchmal seltsame kleine Pixelfehler. Wenn dies für Sie auftaucht, hilft es tatsächlich, Ihrem Pixel-Art-Atlas einige große weiße Block-Png hinzuzufügen.

Viel Glück.

+0

Hat es nicht geschafft, dies zur Arbeit zu bringen. – Dvole

+1

Es sind nicht zwei verschiedene Instanzen desselben Texturatlas. Es sind eigentlich zwei physikalisch unterschiedliche Ordner (pixelArt.atlas und normalTextures.atlas). Wenn ich sie lade, setze ich den Filtermodus auf sie und es betrifft alle Sprites mit Texturen von ihnen. –

1

Ich habe es geschafft, dieses Problem in meinem Programm zu lösen. Was ich herausgefunden habe ist, dass, wenn ein Texturatlas mehr als einmal instanziiert wird, selbst wenn alle Texturladungen von den Atlanten auf SKTextureFilteringNearest gesetzt sind, die Texturen mit der linearen Filterung gerendert werden. Am Ende habe ich meinen Atlas mit einem Singleton versehen und sichergestellt, dass alle Texturen mit der Filterung SKTextureFilteringNearest geladen werden.

3

Dies ist in der Tat ein bizarres Problem. Es scheint mir, dass es eine fehlende API ist: [SKTextureAtlas atlasNamed:atlasName withFilteringMode:filteringMode]

Anstelle eines solchen API für den Augenblick, verwende ich die folgende Methode:

-(SKTextureAtlas *) textureAtlasWithName:(NSString *)atlasName filteringMode:(SKTextureFilteringMode)filteringMode { 

    SKTextureAtlas * result = [SKTextureAtlas atlasNamed:atlasName]; 

    NSArray * textureNames = [result textureNames]; 

    if ([textureNames count] > 0) { 
     SKTexture * aTexture = [result textureNamed:[textureNames lastObject]]; 
     [aTexture setFilteringMode:filteringMode]; 

    } else { 
     NSLog(@"WARNING: couldn't find any textures in the atlas %@; filtering mode set likely failed.", result); 
    } 

    return result; 
}