5

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

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

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

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

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

    [self.texture size];
}
return self; 

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

这是我的原始图像(放大以方便参考):

问题是我的结果总是这样:

它模糊!!!!

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

编辑 1: 我没有在上面提到截屏时树木一直在动画。当它们静止时,它们看起来像这样:

上图是两棵树重叠,其中一棵因稍后修复的错误而翻转。我现在的问题是如何防止图像在动画发生时模糊?

编辑2:

我正在添加树的多个实例,每个实例都加载相同的纹理。我知道这与动画无关,因为我更改了代码以仅添加一棵树并对其进行动画处理,并且它被完美地像素化了。

4

4 回答 4

1

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

self.texture.filteringMode = SKTextureFilteringNearest;
于 2014-02-12T20:29:15.173 回答
0
[self setScaleMode:SKSceneScaleModeAspectFill];

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

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

非常适合我。动画没有模糊

于 2014-02-14T17:39:43.910 回答
0

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

如果您的图像是 100x100,并且您将其显示在 105x105 的整个屏幕上,它会进行插值以找出如何做到这一点。

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

于 2014-02-12T20:25:36.913 回答
0

我已经解决了这个问题......但它真的是一个黑客。我有一个SKScene它是所有“树”(SKSpriteNodes)的父节点。该场景将为其自身添加多棵树。起初我认为这是某种问题,因为如果我只添加一棵树,它将正确显示图像。这个问题的答案让我相信我需要以编程SKTextureAtlas方式在(纹理位于 a 中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...这是一个小故障还是什么?它现在可以工作,但感觉就像一个黑客。

于 2014-02-13T01:03:41.310 回答