我正在尝试移动此图像:
在我的 PyGame 屏幕上,从右到左再回来,但是随着图像的移动,每隔一秒左右,我就会有一个闪烁的屏幕撕裂,就像这样:
我使用的代码是一个类似于这样的循环:
screen.blit(img, (x,y))
pygame.update((x,y),(w,h))
pygame.draw.rect(screen,(0,0,0),((x,y),(w,h)))
到目前为止,我已经尝试了以下方法来解决这个问题:
创建屏幕时使用HWSURFACE
, FULLSCREEN
,DOUBLEBUF
标志,这没有效果,我也将我的调整.update(rect)
为 a .flip()
(因为在使用时建议这样做DOUBLEBUF
?)
在 GPU 和 CPU 之间拆分内存(我在树莓派 2 上运行它)我尝试同时提供更多内存,没有任何变化。
设置一个clock.tick 将更新速率限制为60 FPS(也高于和低于)这确实消除了一些撕裂但不是全部
向左或向右调整每个增量的大小,使增量更小会减少撕裂,但也会降低速度。(不能让它太慢)
blit
当我读到比绘图更受支持的地方时,在之前的位置上绘制一个新的黑色表面而不是在之前的位置上绘制一个黑色矩形(当移动图像以确保它后面没有痕迹时)HWSURFACE
,尽管我无法确认这一点?- 这没有效果
如果有人有任何其他可以改善这种情况的解决方案,我将不胜感激。
我宁愿不从 PyGame 更改为其他任何东西(如 pyglet),因为到目前为止我已经使用 PyGame 完成了很多实现,但我愿意接受建议。
干杯
编辑
根据要求的相关代码:
if scanner == True:
clocker.tick(clockspeed)
if x < 11:
slower = 3
if firstTime == True:
img.set_alpha(int(x * 25))
newSurf.set_alpha(int(x * 25))
screen.blit(newSurf,(xText,35))
pygame.display.update((xText,35),((xText + newSurf.get_width()),(50 + newSurf.get_height())))
img.set_alpha(255)
elif x > (divider - 15):
slower = 3
else:
slower = 0
firstTime = False
screen.blit(img, ((xStart - (x * increment) + slower),100))
pygame.display.update(((xStart - (x * increment) + slower),100),(95,450))
pygame.draw.rect(screen, (0,0,0), (((xStart - (x * increment) + slower),100),(95,450)))
这个slower
变量是为了给人一种惯性的感觉,当横杆到达它扫过的最左边和最右边时,它会放慢一点速度。
该firstTime
变量用于在条形图首次出现时淡入淡出。
在此下方还有另一个非常相似的循环,但将图像扫回另一种方式。