了解如何在pygame中更新屏幕?

时间:2020-07-23 23:14:44

标签: python pygame

嗨,我是Python的新手,现在我想了解pygame的基本原理

我写了我的代码,一旦按下空格键,我试图使球上升一点。

这是我的代码:

import pygame
import sys

def check_events(ball):
   for event in pygame.event.get():
      if event.type == pygame.QUIT:
         sys.exit()
      if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
         ball.centery -= 10 

class Ball():
   def __init__(self,screen):
     self.screen=screen
     self.rect=self.screen.get_rect()
    
     self.color=(255,255,255)
     self.centerx = self.rect.centerx
     self.centery = self.rect.centery
     self.radius=20

   def showcircle(self):    
     pygame.draw.circle(self.screen, self.color, (self.centerx,self.centery), self.radius)


 pygame.init()

 screen = pygame.display.set_mode((1000,1000))
 screen.fill((20,20,20))    
 ball=Ball(screen)


while True:
   check_events(ball)
   ball.showcircle()
   pygame.display.update()

按几次空格键后,结果就是这样

example screen shot

我的问题是为什么仍然显示球的先前位置而不是在更新之后 再次按空格键 拜托,我希望你能帮助我 预先感谢

2 个答案:

答案 0 :(得分:2)

您需要清除每一帧的屏幕

while True:
   check_events(ball)
   screen.fill((20,20,20))  # clear screen
   ball.showcircle()
   pygame.display.update()

答案 1 :(得分:1)

基本上,球的运动使它之前占据的每个位置都留下了“痕迹”。您需要以某种方式擦除旧副本。

有两种方法可以解决此问题。许多PyGame程序(大多数?)选择从头开始每个框架重新绘制屏幕。这是一种简单的方法,可以轻松处理移动的对象。但是,根据程序的不同,这可能在计算上也很繁琐。

另一种方法称为“脏矩形”,它仅重绘了您要撤消的操作所影响的屏幕部分(“脏”部分)。在您的情况下,它将删除球的旧图像(在先前的位置)。在这里,您可以绘制背景色的球,然后移动并绘制新球。或者,将背景像素保存在下一个球所在的“下方”。移动球时,通过替换背景将其擦除。

由于您说您才刚刚开始,所以最简单的方法是在每次更新时从头开始重新绘制屏幕。因此,正如@ Mike67回答的那样,对于每次更新,请在整个屏幕上填充颜料,然后在新位置重新绘制球。