【问题标题】:Pygame Pixel Array generatorPygame 像素数组生成器
【发布时间】:2015-04-29 13:45:18
【问题描述】:

我正在尝试使用 Python (2.7.9) 中的生成器绘制函数和图形,但发现了一个问题:我无法将生成的像素数据(RGB 元组)刷新到 Pygame 像素数组中。这是我的代码(我尝试运行):

  1. 使用二维数组

    pixArr = pygame.PixelArray(surface) pixArr=[[(0,0,function(x,y)) for x in range(1,screenX)] for y in range(1,screeny)] del pixArr

在这里我意识到 pixArr 不是一个普通的 2d 列表,因为我没有输出它(打印 pixArr)

  1. 然后我尝试使用范围

    pixArr[0:screenX*screenY] = [(0,0,function(curPix%screenX, curPix//screenY)) for curPix in range(0,screenX*screenY)]

我在 pygame 网站 HERE 上找到了类似这样的代码,但它给了我错误“ValueError:序列大小不匹配”,在玩弄之后发现它只适用于单一颜色(例如 @ 987654324@将整个屏幕染成蓝色)

TL;DR:如何在不使用循环的情况下设置每个像素

For y in range(0,1000):
    For x in range(0,1000):
        gfx.draw(surface,x,y,(0,0,function(a,b))) #or pixArr in this line

【问题讨论】:

    标签: python arrays pygame generator pixel


    【解决方案1】:

    我使用的是 pygame 1.9.1,但似乎 PixelArrays 在 1.9.2 上发生了很大变化,所以要小心。

    我刚刚试过这个例子,它工作正常:

    pixArr = pygame.PixelArray(surface)
    def f(i):
        return i % 255
    pixArr[:] = [(0, 0, f(i)) for i in range(0, len(pixArr))]
    

    需要注意的一点是:

    pixArr = [(0, 0, f(i)) for i in range(0, len(pixArr))]
    

    不起作用,因为它将 PixelArray 变量转换为列表(就像在您的第一个 sn-p 代码中一样)。

    关于为什么你得到ValueError,我刚刚做了一些检查,奇怪的是(而且令人惊讶的是),我注意到len(pixArray) 不等于pixArray.surface.get_width() * pixArray.surface.get_height()。 我建议您在继续之前对此进行一些检查。

    --

    编辑:

    我考虑过分享这个新的 sn-p,因为它看起来很有趣:

    def f(i):
        return i % 255
    length = len(pixArr)
    length2 = len(pixArr[0])
    print length, length2
    for j in range(0, length):
        array = [(0, f(j), f(i)) for i in range(0, length2)]
        pixArr[j] = array
    

    【讨论】:

    • 发现另一个错误:range(0, len(pixArr)) 必须在 range(0, screenMaxX*ScreenMaxY) 中使用
    • 其实再往上看,len(pixArr) == surface.get_width(),而len(pixArr[i]) == surface.get_height()
    • 没错!刚刚发现它。像素数组上的 Pygames 网页非常不一致。例如,像素数组没有“pygame.PixelArray.ndim — 返回维数”。方法,不像那里写的。
    • ndim 是从 1.9.1 到 1.9.2 所做的更改之一,网页清楚地说明了这一点。看起来 PixelArray 拥有的大部分很酷的东西都是 1.9.2 中的新功能
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-20
    • 2022-11-13
    • 2019-09-06
    • 2014-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多