【问题标题】:SKTexture nearest filtering mode doesn't work (Making Pixel Art)SKTexture 最近过滤模式不起作用(制作像素艺术)
【发布时间】:2015-07-12 01:29:50
【问题描述】:

我使用了一个相对较小的图像(44 像素高)并将其放大以获得像素艺术外观。我试图将过滤模式更改为最近,这样抗锯齿就会消失,但它没有。它看起来边缘模糊。我在背景上尝试了同样的方法,得到了相同的结果。

let myNode = SKSpriteNode()

class GameScene: SKScene {


    func makeNode() {

        myNode.position = CGPoint(x: self.frame.size.width/2, y: self.frame.size.height/2)
        myNode.size = CGSize(width: 200, height: 200)
        myNode.texture = SKTexture(imageNamed: "image")
        myNode.texture!.filteringMode = .Nearest

        return self.addChild(myNode)
    }
}
override func didMoveToView(view: SKView) {

    makeNode()

}

【问题讨论】:

  • Sprite Kit 的过滤模式很棘手,因为存在一些错误。首先,您是否使用了 Atlas。如果您在将纹理分配给节点之前对其设置过滤模式,也会发生什么情况。
  • 我没有尝试在这里使用 atlas ,是吗?第二个建议似乎很有希望,但正如我所见,它没有奏效。我猜你的意思是:...let texture = SKTexture(imageNamed: "image")texture.filteringMode = .NearestmyNode.texture = texture...非常感谢您的回复!非常感谢您的时间和精力!
  • 嗯,我不确定。我知道人们以前已经让它工作了。你在设备上运行吗?什么版本?
  • 我使用的是 2014 年末的视网膜 MacBook Pro 或 iPhone 5S。但我想我会在 Photoshop 中放大图像,保持像素化的外观,然后在应用程序中使用它。我认为如果我使用小图像并用代码放大它们会提高性能。
  • 是的,它不起作用,这很糟糕。如果你愿意,你可以试试 Xcode 7/iOS 9,看看他们是否修复了它。这些是强大的设备,你应该可以使用更大的纹理。无论如何,您需要担心的是非常昂贵的计算和绘制调用的数量。并且在某种程度上是节点树的深度。

标签: swift sprite-kit antialiasing skspritenode sktexture


【解决方案1】:

更新: SKTexture 最接近过滤模式现在在 Xcode 7 GM 中工作。无需像我在下面建议的那样手动缩放图像。


我在 Xcode 7 beta 5 和 beta iOS 9 中遇到了同样的问题; Nearest 过滤模式似乎被忽略了。在我的项目中,最近邻缩放的缩放以前在 iOS 8 上的 Xcode 6 中工作。

如果在 iOS 9 最终版本之前未解决该错误,我会在将图像放入各自的图集中之前对图像进行预缩放。

为此,我编写了一个简单的 python 脚本来递归查找 png 文件并使用 imagmagick 缩放它们。

如果你没有安装 imagemagick,你可以像这样使用macports 安装它:

sudo port install ImageMagick

如果你有homebrew,它看起来像这样:

brew install imagemagick

我只是将这个脚本(如下)放在我的 atlas 文件(我想将其缩放 400%)上方的目录中名为 imgscaler.py 的文件中,然后从终端启动它:

python imgscaler.py

脚本如下所示:

import subprocess
import os
import sys
import fnmatch


def main():
    execution_folder_name = os.getcwd()
    file_extension_name = "png"

    #
    # Collect names of files that will be manipulated
    matches = []
    for root, dirNames, fileNames in os.walk(execution_folder_name):
        for filename in fnmatch.filter(fileNames, '*.' + file_extension_name):
            full_name = os.path.join(root, filename)
            matches.append(full_name)

    scale_percentage = "400"

    if not __query_yes_no("This script will scale images by " + scale_percentage + "% recursively from directory " + execution_folder_name + ".  Proceed?"):
        return

    #
    # Scale the images
    for match in matches:
        execution_str = "convert " + match + " -interpolate Nearest -filter point -resize " + scale_percentage + "% " + match + "\n"
        sys.stdout.write(execution_str)
        __run_command(execution_str)


def __run_command(input_cmd):
    """Runs a command on the terminal, and returns the output in a string array.
    """
    process = subprocess.Popen(input_cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True)
    output = []
    while True:
        line = process.stdout.readline()
        if line != '':
            output.append(line)
        else:
            break

    return output


def __query_yes_no(question, default="yes"):
    """Asks a yes or no question, returns a true is answered "yes".
    """
    valid = {"yes": True, "y": True, "ye": True,
             "no": False, "n": False}
    if default is None:
        prompt = " [y/n] "
    elif default == "yes":
        prompt = " [Y/n] "
    elif default == "no":
        prompt = " [y/N] "
    else:
        raise ValueError("invalid default answer: '%s'" % default)

    while True:
        sys.stdout.write(question + prompt)
        sys.stdout.flush()
        choice = raw_input().lower()
        if default is not None and choice == '':
            sys.stdout.write(default)
            sys.stdout.write('\n')
            sys.stdout.flush()
            return valid[default]
        elif choice in valid:
            sys.stdout.write(choice)
            sys.stdout.write('\n')
            sys.stdout.flush()
            return valid[choice]
        else:
            sys.stdout.write("Please respond with 'yes' or 'no' (or 'y' or 'n').\n")
            sys.stdout.flush()


main()

将scale_percentage 更改为您想要按比例缩放的任何百分比。

顺便说一句,我猜这个缩放问题最终会得到解决。我目前正在考虑这个假设来更新我的代码。 这只是一个创可贴,以防 SpriteKit 中最近邻缩放的修复晚于 iOS 9.0。

【讨论】:

  • 哇!多么好的解决方案!我正在研究这个 iOS 项目并从中获得乐趣。我还有很多其他项目要处理,所以我很遗憾地说我没有时间在我正在开发的应用程序中实现这个漂亮的部分。特别是我认为这个错误将在下一次 Apple 活动(9 月 9 日)前后得到修复。不过非常感谢!我相信它工作得很好!
【解决方案2】:

这是 Xcode7 beta / iOS9 中的一个错误。如果你使用 Xcode 6,它就可以工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多