如何在应用程序中使用像素艺术?

时间:2014-02-12 20:21:09

标签: ios objective-c sprite-kit sktexture sktextureatlas

我有一个使用精灵套件的iOS应用程序,我准备添加我的作品。艺术品是像素艺术,本质上非常小。我正在尝试找到以下方式显示的最佳方式:

  1. 所有艺术作品都是相同的尺寸,这意味着一个图像像素占据了真实世界像素的数量,与所有其他图像一样。

  2. 尝试使纹理看起来更平滑时没有模糊,这通常在缩放图像时发生。

  3. 我试过像这样解决第二个问题:

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

    上面的代码是SKSpriteNode的初始化,它将具有纹理。

    这是我的原始图像(按比例放大以便于参考):

    问题是我的结果总是如下:

    its blurry!!!!!

    (主干的底部偏移不是这个问题的一部分。)我没有使用任何运动模糊或类似的东西。我不确定它为什么显示不正确。

    编辑1: 我没有在上面提到,在截图时,树木一直在动画。当它们仍然是这样的时候:

    上面的图像是两棵树重叠而另一张是由于稍后要修复的错误造成的。我现在的问题是如何在动画发生时防止图像模糊?

    编辑2:

    我正在添加树的多个实例,每个实例都加载相同的纹理。我知道它是与动画无关,因为我改变了代码只添加一棵树并为其设置动画,并且它完全是像素化的。

4 个答案:

答案 0 :(得分:1)

您需要使用“最近”的过滤:

self.texture.filteringMode = SKTextureFilteringNearest;

答案 1 :(得分:0)

图像中的像素必须与屏幕上的像素完美对应。

如果您的图像是100x100,并且您在整个105x105的屏幕上显示它,它将进行插值以确定如何进行。

如果你以2的倍数(这应该可以正常工作)的缩放分辨率显示它,我认为你仍然必须告诉渲染器在进行缩放时不要插入像素。

答案 2 :(得分:0)

我已经解决了这个问题...但它确实是一个黑客攻击。我有一个SKScene,它是所有“树”(SKSpriteNodes)的父节点。这个场景将为自己添加多个树。起初我认为这是某种问题,因为如果我只添加一棵树,它会正确显示图像。 answer to this question让我相信我需要以编程方式创建一个SKTextureAtlas单例(纹理在SKTextureAtlas中)并将其传递给树类以从中获取纹理在init方法上。 我在SKScene中创建了一个属性来保存纹理图集,这样我每次创建一个新的时都可以将它传递给树类。我尝试使用textureNamed:方法从纹理图集(在树类中)加载纹理。这仍然无效。我切换回使用SKTexture的textureWithImageNamed:方法加载纹理并且它有效。更多我改为编码回来,以便树子类不会被发送到SKTextureAtlas单例所有仍然有效。

SKScene我使用:

获取纹理图集
[SKTextureAtlas atlasNamed:@"Textures"]; //Textures is the atlas name.

并将返回值设置为上述SKTextureAtlas属性。我想也许地图集只是必须在代码中的某个点初始化,所以我尝试了这个:

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

以及以下单独一行:

[SKTextureAtlas atlasNamed:@"Textures"]

但都没有奏效。 显然我需要在我的树的父类中拥有一个属性SKTextureAtlas,它保存树使用的纹理,而不引用任何SKTextureAtlas ...... 是这是一个小故障还是什么?它现在正在工作,但感觉就像一个黑客。

答案 3 :(得分:0)

[self setScaleMode:SKSceneScaleModeAspectFill];

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

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

完美适合我。动画没有模糊