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

Image position not updating / updates slower while moving mouse

(尝试制作打地鼠游戏)每当我移动鼠标时,地鼠图像的位置移动速度似乎比我不移动鼠标时慢 3-5 倍,而且我我不确定是什么原因造成的,因为位置应该根据经过的时间进行更新。

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

代码:

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

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

  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

性能下降是因为您在事件循环中调用 self.drawMap()。每个事件调用一次事件循环。每帧可能发生多个事件,尤其是当鼠标移动时。
我建议仅在需要时创建地图。将地图渲染成 pygame.Surface object and blit 地图 Surface 到每一帧的显示器上。地图更改后重新创建地图 Surface.

创建一个在目标 Surface 上呈现而不是直接在显示器上呈现的“draw”方法 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))