阅读pygame教程here,你会发现这个例子:(我的箭头)
for o in objects:
screen.blit(background, o.pos, o.pos) #<---
for o in objects:
o.move()
screen.blit(o.image, o.pos) #<---`
阅读blit
here的pygame文档会说:( italics mine)
blit(source,dest,area = None,special_flags = 0) - &gt;矩形 在此Surface上绘制源Surface。可以使用dest参数定位绘图。 Dest可以是表示源左上角的坐标对。也可以将Rect作为目标传递,矩形的topleft角将用作blit的位置。目标矩形的大小不会影响blit。
任何人都可以帮我理解这个吗?在我最终注意到他们在一个调用中使用'pos'TWICE,然后在另一个调用中使用了'pos'TWICE之前,我一直在倾注我自己的代码。我向我扔了这个,瞧,令人难以置信的不同步,频闪,慢动画的问题消失了。但我不明白为什么。
编辑:上面的误解只是速度瓶颈的一部分。我不明白(并且仍在努力)必须将他们的移动增量乘以时钟滴答。突然间,一切都栩栩如生。这是一个例子,也许它会帮助其他一些好学的新手游戏制造商:clock = pygame.time.Clock()
FPS=60
while True:
timer = clock.tick(FPS)
if label.x < label.target_x:
label.x += (2*timer) #<-----
....数量增加他们的精灵/表面的位置是相对于clock.tick
返回的数字。突然,一台现代笔记本电脑可以让20个图像以极快的速度在屏幕上移动:)
谢谢Ted Klein Bergman的帮助!
答案 0 :(得分:1)
文档中还有另一行:
也可以传递可选的区域矩形。这表示要绘制的源曲面的较小部分。
第一个for循环中发生的事情是,他们通过在所有游戏对象上绘制背景图像来清除以前的图像。背景图像可能比游戏对象大,因此每次我们进行blit时,我们都会绘制不需要重绘的部分屏幕。他们正在做的是指定要绘制多少背景图像,这样可以节省性能。
修改强>
命名.val(null)
可能有点误导;它实际上是一个矩形。如果将矩形传递给第二个参数( dest ),则blit函数将使用topleft角作为源的位置。不考虑矩形的实际区域。
如果将矩形传递给第三个参数(区域),那么blit函数将在对光源进行布局时考虑矩形区域。
我创建了一个小模型示例来说明pygame的使用方式。您经常创建一个主循环来完成3件事:处理事件,更新对象和绘制对象。在你的例子中,我会看起来像这样:
pos