我正在尝试使用Python(2.7.9)中的生成器绘制函数和图形,并发现了一个问题:我无法将生成的像素数据(RGB元组)刷新为Pygame Pixel数组。这是我的代码(我试图运行):
使用2d数组
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)
然后我尝试使用范围
pixArr[0:screenX*screenY] = [(0,0,function(curPix%screenX, curPix//screenY)) for curPix in range(0,screenX*screenY)]
我在pygame网站HERE上找到了类似这样的代码,但是它给了我错误“ValueError:sequence size mismatch”,在玩完之后它变得清晰,它只能用一种颜色(对于示例pixArr[0:screenX*screenY]=(0,0,255)
将整个屏幕着色为蓝色)
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
答案 0 :(得分:0)
我正在使用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变量转换为列表(如第一段代码中所示)。
为什么你得到一个ValueError
,我只是做了一些检查,并且好奇(并且足够过分),我注意到len(pixArray)
不等于pixArray.surface.get_width() * pixArray.surface.get_height()
。
在你继续之前,我建议你对此进行一些检查。
-
编辑:
我想要分享这个新的片段,因为它看起来非常有趣:
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