2013-11-15 15 views
9

我似乎有一個問題,使用SKTextureAtlas和最近鄰居過濾紋理。當我使用沒有SKTextureAtlas的最近鄰居過濾時,它可以正常工作,但是當我使用SKTextureAtlas時,一切都變成了線性過濾。你如何使用SKTextureFilteringNearest與SKTextureAtlas

代碼和結果,而不SKTextureAtlas:

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

應該產生近鄰過濾&是否 enter image description here

代碼和結果和SKTextureAtlas:

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

應該產生Neare ST鄰居過濾& enter image description here

有什麼建議?

+1

嘗試spriteNodeWithTexture:不指定大小,這是否使區別?對於我最近的過濾器與地圖集紋理的作品,我還沒有嘗試改變初始化精靈rect。您仍然可以在通過xScale/yScale創建精靈之後縮放精靈。 – LearnCocos2D

+0

好吧我試過了,我得到了相同的結果:( –

+0

我無法讓你的方式工作,但不是在init中設置大小,我之後設置的大小是'[node setSize:];'它工作 –

回答

4

我一直在努力解決完全相同的問題。

看起來,當您爲來自SKTextureAtlas的SKTexture設置過濾模式時,它爲來自該地圖集的所有內容設置過濾模式。

我最終通過製作兩個SKTextureAtlas(AtlasLinear和AtlasNearest)來解決這個問題。一個是我的普通藝術品,另一個是pixelart。這是一種魅力。

但是,對於非常小的子類,我有時會出現奇怪的小像素錯誤。如果這爲你彈出,它實際上有助於添加一些大的白色塊PNG到你的像素藝術圖集。

祝你好運。

+0

沒有設法得到這個工作。 – Dvole

+1

這不是同一紋理地圖集的兩個不同實例。它實際上是兩個物理上不同的文件夾(pixelArt.atlas和normalTextures.atlas)。當我加載它們時,我對它們設置了過濾模式,它會影響所有具有紋理的精靈。 –

1

我在我的程序中設法解決了這個問題。我發現的是,如果紋理圖集被多次實例化,即使所有來自圖集的紋理加載都設置爲SKTextureFilteringNearest,紋理也會通過線性過濾進行渲染。我最終做的是通過一個單例提供我的圖集,並確保所有紋理加載的過濾設置爲SKTextureFilteringNearest,並且完美運行。

3

這確實是一個奇怪的問題。在我看來,是有缺失的API:[SKTextureAtlas atlasNamed:atlasName withFilteringMode:filteringMode]

代替暫且這樣的API,我用下面的方法:

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