我试图用Python (2.7.9)中的生成器绘制函数和图形,但发现了一个问题:我无法将生成的像素数据(RGB元组)刷新到pixel数组中。下面是我的代码(我尝试运行):
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)]
我在游戏网站这里上找到了类似的代码,但是它给了我错误的"ValueError:序列大小错配“,在玩了它之后,很明显它只适用于单一的颜色(例如,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
发布于 2015-04-29 15:51:10
我使用的是吡游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
https://stackoverflow.com/questions/29945638
复制相似问题