Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 图像位置不更新/移动鼠标时更新速度较慢_Python_Python 3.x_Events_Pygame_Pygame Surface - Fatal编程技术网

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

Python 图像位置不更新/移动鼠标时更新速度较慢,python,python-3.x,events,pygame,pygame-surface,Python,Python 3.x,Events,Pygame,Pygame Surface,(试着做一个打鼹鼠的游戏)每当我移动鼠标时,鼹鼠图像的位置似乎比我不移动鼠标时移动慢3-5倍,我不确定是什么原因造成的,因为位置应该根据时间的推移进行更新 游戏的屏幕是500x500像素,图像是50x50像素,还有一个10x10的阵列,作为一个地图来决定允许鼹鼠出现的位置 守则: 从10x10地图中获取随机位置 每30个刻度更新一个像素的摩尔图片位置 获取鼠标的位置(一个500x500像素的屏幕) 获取鼹鼠应该去的块的位置(在10x10地图上) 在屏幕上绘制图像的顺序: 地图 锤子在移动时被击

(试着做一个打鼹鼠的游戏)每当我移动鼠标时,鼹鼠图像的位置似乎比我不移动鼠标时移动慢3-5倍,我不确定是什么原因造成的,因为位置应该根据时间的推移进行更新

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

守则:

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

  • 每30个刻度更新一个像素的摩尔图片位置

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

  • 获取鼹鼠应该去的块的位置(在10x10地图上)

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

    • 地图

    • 锤子在移动时被击打

    • 鼹鼠上方的石块

    • 摩尔(上升1像素)

    • 位于鼹鼠原始位置的块

    • 锤子在不动的情况下被击打

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

    def moleGoUp(自):
    nbPixel=0
    #返回一个随机位置
    initialPos=self.returnRandPosition()
    当nbPixel<50时:
    tickCounter=pygame.time.get_ticks()%30
    如果tickCounter==0:
    nbPixel+=1
    #获取鼠标的位置
    mousePos=pygame.mouse.get_pos()
    #闪电显示鼹鼠应该去的背景块
    blockoverpos=[initialPos[1]*50,initialPos[0]*50-50]
    #在位置上闪烁摩尔(每20个刻度上升一个像素)
    newPos=[initialPos[1]*50,(initialPos[0]*50-nbPixel)]
    initPosToBlit=[initialPos[1]*50,initialPos[0]*50]
    对于pygame.event.get()中的事件:
    mousePos=pygame.mouse.get_pos()
    如果event.type==pygame.QUIT:
    sys.exit()
    #绘制地图
    self.drawMap()
    #锤击
    显示屏幕(图像播放器、元组(鼠标点))
    #计算已通过的滴答数
    tickCounter=pygame.time.get_ticks()%30
    打印(“事件循环中”)
    显示屏幕blit(图像墙、元组(BlockOverpos))
    显示搜索blit(imageTarget,元组(newPos))
    #在鼹鼠的原始位置闪烁背景
    显示\u surf.blit(imageWall,元组(initPostBlit))
    #锤击
    显示屏幕(图像播放器、元组(鼠标点))
    打印(“事件外循环”)
    #在鼹鼠身上闪烁背景
    如果nbPixel==50:
    显示冲浪板(图像墙,(初始位置[1]*50,初始位置[0]*50-像素))
    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()
    。每个事件调用一次事件循环。每帧可能发生多个事件,尤其是移动鼠标时。
    我建议仅在需要时创建地图。在每个帧中将贴图渲染为对象,并将贴图曲面渲染到显示器上。地图更改后,请重新创建地图曲面

    创建在目标曲面而不是直接在显示曲面上渲染的“绘制”方法:

    def绘图图(self,traget\u surf):
    #利用traget_冲浪
    # [...]
    
    添加变量
    map\u surf
    map\u changed=True
    。如果设置了
    map\u changed
    ,并且设置了
    map\u changed==False,则在应用程序循环中渲染贴图
    blit
    map\u surf
    曲面到每个帧中的显示。每当需要更改地图时,只需设置
    map\u changed=True

    map\u surf=pygame.Surface(display\u surf.get\u size())
    map_changed=True
    当nbPixel<50时:
    # [...]
    如果地图被更改:
    self.drawMap(地图冲浪)
    map_changed=False
    # [...]
    显示冲浪板(地图冲浪,(0,0))
    显示屏幕blit(图像墙、元组(BlockOverpos))
    显示搜索blit(imageTarget,元组(newPos))
    显示\u surf.blit(imageWall,元组(initPostBlit))
    显示屏幕(图像播放器、元组(鼠标点))
    
    什么是
    drawMap()
    在做什么?为什么每次活动都需要这样做?
    imagePlayer
    也在为每个事件绘制,然后再次在此循环之外绘制。它可能只需要在循环内更新
    mousePos
    (根本不画图)。感谢您的回复,我将更改代码,看看会发生什么。我正在使用drawMap()绘制所有背景块,这样imagePlayer就不会留下痕迹,所以当播放器的位置发生变化时,您只需调用
    drawMap()
    并绘制播放器即可。鼠标事件可能不会导致位置改变。好吧,玩家的位置实际上是锤子,所以当鼠标改变时,它基本上会改变。最后我画了鼠标周围的九个区块,而不是整个地图,解决了这个问题