pygame surface.blit(bg,pos,pos)与surface.blit(bg,pos),你明白吗?

时间:2018-03-31 22:28:13

标签: python pygame blit

阅读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的帮助!

1 个答案:

答案 0 :(得分:1)

文档中还有另一行:

  

也可以传递可选的区域矩形。这表示要绘制的源曲面的较小部分。

第一个for循环中发生的事情是,他们通过在所有游戏对象上绘制背景图像来清除以前的图像。背景图像可能比游戏对象大,因此每次我们进行blit时,我们都会绘制不需要重绘的部分屏幕。他们正在做的是指定要绘制多少背景图像,这样可以节省性能。

修改 命名.val(null)可能有点误导;它实际上是一个矩形。如果将矩形传递给第二个参数( dest ),则blit函数将使用topleft角作为源的位置。不考虑矩形的实际区域。

如果将矩形传递给第三个参数(区域),那么blit函数将在对光源进行布局时考虑矩形区域。

我创建了一个小模型示例来说明pygame的使用方式。您经常创建一个主循环来完成3件事:处理事件,更新对象和绘制对象。在你的例子中,我会看起来像这样:

pos