我有一个使用精灵套件的iOS应用程序,我准备添加我的作品。艺术品是像素艺术,本质上非常小。我正在尝试找到以下方式显示的最佳方式:
所有艺术作品都是相同的尺寸,这意味着一个图像像素占据了真实世界像素的数量,与所有其他图像一样。
尝试使纹理看起来更平滑时没有模糊,这通常在缩放图像时发生。
我试过像这样解决第二个问题:
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:
我正在添加树的多个实例,每个实例都加载相同的纹理。我知道它是与动画无关,因为我改变了代码只添加一棵树并为其设置动画,并且它完全是像素化的。
答案 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];
完美适合我。动画没有模糊