图像位置未更新/移动鼠标时更新速度较慢

时间:2019-09-08 23:50:14

标签: python-3.x image events time pygame

(试图制作一个“打地鼠”游戏)每当我移动鼠标时,痣的图像位置似乎比不移动鼠标时慢3-5倍,不知道是什么原因造成的,因为该位置应该根据经过的时间进行更新。

游戏的屏幕为500x500像素,图像为50x50像素,并有一个10x10的阵列作为地图来决定允许痣出现的位置

代码:

  1. 从10x10的地图中获取随机位置

  2. 每30个刻度将痣图片的位置更新一个像素

  3. 获取鼠标的位置(一个500x500像素的屏幕)

  4. 获取痣应该走的块的位置(在10x10地图上)

  5. 在屏幕上绘制图像的顺序:

    • 地图

    • 移动中的锤子

    • 痣上方的方块

    • 痣(上升1个像素)

    • 位于痣原始位置的方块

    • 不动的锤子

问题是,当我移动鼠标时,黑痣的上升速度要慢得多,我不确定是什么问题。我还使用了打印语句进行检查。

    def moleGoUp(self):
        nbPixel = 0
        #returns a random position
        initialPos = self.returnRandPosition()
        while nbPixel < 50:
            tickCounter = pygame.time.get_ticks() % 30
            if tickCounter == 0:
                nbPixel += 1
            #gets position of mouse
            mousePos = pygame.mouse.get_pos()
            #blits the background block that the mole is supposed to go to
            blockAbovePos = [initialPos[1] * 50, initialPos[0] * 50 - 50]

            #blits the mole at position (goes up by one pixel every 20 ticks)
            newPos = [initialPos[1] * 50, (initialPos[0]*50 - nbPixel)]
            initPosToBlit = [initialPos[1] * 50, initialPos[0] * 50]
            for event in pygame.event.get():
                mousePos = pygame.mouse.get_pos()
                if event.type == pygame.QUIT:
                    sys.exit()
                #draws the map
                self.drawMap()
                # blits the hammer
                display_surf.blit(imagePlayer, tuple(mousePos))
                # counts how many ticks has passed
                tickCounter = pygame.time.get_ticks() % 30
                print("in event loop")

            display_surf.blit(imageWall, tuple(blockAbovePos))
            display_surf.blit(imageTarget, tuple(newPos))
            #blits the background at the original position of the mole
            display_surf.blit(imageWall,tuple(initPosToBlit))
            #blits the hammer
            display_surf.blit(imagePlayer, tuple(mousePos))
            print("out of event loop")

            #blits the background over the mole
            if nbPixel == 50:
                display_surf.blit(imageWall, (initialPos[1]*50, initialPos[0]*50 - nbPixel))
            pygame.display.update()

打印输出:

in event loop
out of event loop
in event loop
out of event loop
in event loop
out of event loop
in event loop
out of event loop
in event loop
out of event loop

1 个答案:

答案 0 :(得分:0)

性能下降的原因是您在事件循环中调用 self.drawMap()。每个事件调用一次事件循环。每帧可能发生多个事件,尤其是在移动鼠标时。
我建议仅在需要时创建地图。将地图渲染为 pygame.Surface 对象,并将地图Surfaceblit 渲染到每一帧的显示器上。当地图发生变化时,重新创建地图表面

创建一个在目标Surface而不是直接在显示器Surface上渲染的“绘制”方法:

def drawMap(self, traget_surf):
    # draw on traget_surf
    # [...]

添加变量 map_surfmap_changed = True。如果设置了 map_changed 并设置了 map_changed == False,则在应用程序循环中渲染地图。 blit map_surf Surface 显示在每一帧中。每当需要更改地图时,设置 map_changed = True:

就足够了
map_surf = pygame.Surface(display_surf.get_size())
map_changed = True

while nbPixel < 50:

    # [...]

    if map_changed:
        self.drawMap(map_surf)
        map_changed = False


    # [...]

    display_surf.blit(map_surf, (0, 0))

    display_surf.blit(imageWall, tuple(blockAbovePos))
    display_surf.blit(imageTarget, tuple(newPos))
    display_surf.blit(imageWall,tuple(initPosToBlit))
    display_surf.blit(imagePlayer, tuple(mousePos))