2013-11-15 9 views
9

Sembra che si stia riscontrando un problema nell'uso di SKTextureAtlas e del filtro neighbor più vicino per le trame. Quando ho usato il filtro del vicinato più vicino senza SKTextureAtlas, funziona bene, ma tutto viene semplicemente modificato in filtraggio lineare quando utilizzo SKTextureAtlas.Come si utilizza SKTextureFilteringNearest con SKTextureAtlas

Codice e risultato senza SKTextureAtlas:

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

dovrebbe produrre Nearest Neighbor Filtering & Does enter image description here

Codice e risultato con SKTextureAtlas:

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

dovrebbero produrre NearE st Neighbour Filtering & non enter image description here

Qualche suggerimento?

+1

Prova spriteNodeWithTexture: senza specificare le dimensioni, questo fa un differenza? Per quanto mi riguarda il filtro più vicino con le trame atlas funziona, non ho ancora provato a cambiare lo sprite rect su init. È comunque possibile ridimensionare lo sprite dopo averlo creato tramite xScale/yScale. – LearnCocos2D

+0

Va bene ho provato e ottengo lo stesso risultato :( –

+0

Non ho potuto ottenere il tuo modo di lavorare, ma non è necessario impostare la dimensione in init, ho impostato la dimensione in seguito è '[nodo setSize:];' e ha funzionato –

risposta

4

Ho sofferto esattamente con lo stesso problema.

Sembra che quando si imposta la modalità di filtro per un SKTexture proveniente da un SKTextureAtlas, si imposta la modalità di filtro per tutto ciò che esce da quell'atlante.

Ho finito per risolverlo creando due SKTextureAtlas (AtlasLinear e AtlasNearest). Uno è per il mio materiale illustrativo normale, l'altro è per pixelart. Questo funziona come un fascino.

Tuttavia con gli atass molto piccoli a volte ottengo strani piccoli errori di pixel. Se questo si apre per te, in realtà aiuta ad aggiungere alcuni grandi png di blocco bianco al tuo atlante di pixel art.

Buona fortuna.

+0

Non è riuscito a farlo funzionare. – Dvole

+1

Non sono due diverse istanze dello stesso atlante di texture. In realtà sono due cartelle fisicamente diverse (pixelArt.atlas e normalTextures.atlas). Quando li carico li imposto come modalità di filtraggio e influenza tutti gli sprite con trame da essi. –

1

Sono riuscito a risolvere questo problema nel mio programma. Quello che ho scoperto è che se un atlante di texture viene istanziato più di una volta, anche se tutti i carichi di texture dagli atlanti sono impostati su SKTextureFilteringNearest, le trame vengono renderizzate con il filtro lineare. Quello che ho finito è fornire il mio atlante attraverso un singleton e assicurarmi che tutte le trame vengano caricate con il set di filtri su SKTextureFilteringNearest e ha funzionato perfettamente.

3

Questo è davvero un problema bizzarro. Mi sembra che ci sia un'API mancante: [SKTextureAtlas atlasNamed:atlasName withFilteringMode:filteringMode]

In luogo di tale API per il momento, io uso il seguente metodo:

-(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; 
} 
Problemi correlati