微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PongGame桨移动,但先前绘制的桨不会擦除

如何解决PongGame桨移动,但先前绘制的桨不会擦除

左拨片工作正常,可以向上和向下移动。但是,当我不移动时,右边的行是可以的,但是当我这样做时,它会移动到我编码的方向,但不会擦除先前绘制的位置,而最终只画一条直线。尝试制作没有教程的第一款游戏,我有点卡住

这是代码

import pygame

pygame.init()

screen_width = 1280
screen_height = 720
window = pygame.display.set_mode((screen_width,screen_height),0)

pygame.display.set_caption("PongGame")

clock = pygame.time.Clock()
#background
background = pygame.image.load("C:/Users/teamb/Desktop/PythonWorkspace/myGame/background.png")

#paddle image
paddle = pygame.image.load("C:/Users/teamb/Desktop/PythonWorkspace/myGame/paddle.png")
paddle_size = paddle.get_rect().size

#left paddle
left_paddle_width = paddle_size[0]
left_paddle_height = paddle_size[1]
left_paddle_xpos = 10
left_paddle_ypos = (screen_height/2 - left_paddle_height/2)

to_x = 0
to_y = 0

character_speed = 10

#right paddle
right_paddle_width = paddle_size[0]
right_paddle_height = paddle_size[1]
right_paddle_xpos = screen_width - right_paddle_width - 10
right_paddle_ypos = (screen_height/2 - left_paddle_height/2)

to_y_2 = 0
# ball
ball = pygame.image.load("C:/Users/teamb/Desktop/PythonWorkspace/myGame/ball.png")
running = True
while running:
   dt = clock.tick(60)
   
   print("fps : " + str(clock.get_fps()))

   for event in pygame.event.get():
      if event.type == pygame.QUIT:
         running = False
   #left paddle
      if event.type == pygame.KEYDOWN:
         if event.key == pygame.K_w:
            to_y -= character_speed
         elif event.key == pygame.K_s:
             to_y += character_speed

      if event.type == pygame.KEYUP:
         if event.key == pygame.K_w or event.key == pygame.K_s:
            to_y = 0
   #right paddle
      if event.type == pygame.KEYDOWN:
         if event.key == pygame.K_UP:
            to_y_2 -= character_speed
         elif event.key == pygame.K_DOWN:
             to_y_2 += character_speed

      if event.type == pygame.KEYUP:
         if event.key == pygame.K_UP or event.key == pygame.K_DOWN:
            to_y_2 = 0

   left_paddle_ypos += to_y
   right_paddle_ypos += to_y_2

   if left_paddle_ypos < 0:
      left_paddle_ypos =  0
   
   if left_paddle_ypos > screen_height - left_paddle_height:
      left_paddle_ypos = screen_height - left_paddle_height

   window.blit(background,(0,0))
   window.blit(paddle,(left_paddle_xpos,left_paddle_ypos))
   window.blit(paddle,(right_paddle_xpos,right_paddle_ypos))
   window.blit(ball,(640,360))
   
   pygame.display.update()

pygame.quit()

解决方法

最有可能背景 Surface background)的宽度小于显示 Surface window)的宽度。

在绘制场景之前清除显示内容:

while running:
   # [...]

   window.fill(0) # <--- clear display

   window.blit(background,(0,0))
   window.blit(paddle,(left_paddle_xpos,left_paddle_ypos))
   window.blit(paddle,(right_paddle_xpos,right_paddle_ypos))
   window.blit(ball,(640,360))
   
   pygame.display.update()

或按pygame.transform.smoothscale缩放背景图像:

background = pygame.image.load("C:/Users/teamb/Desktop/PythonWorkspace/myGame/background.png")
background = pygame.transform.smoothscale(background,window.get_size())
,

此行正在重绘每一个动作的背景:

window.blit(background,0))

但是,我想您的背景图像实际上比您的运动场小,因此您不会在该侧重画背景。您可以放大背景图像,也可以使用偏移量再次绘制它,甚至可以拉伸它。这个想法是在绘制背景时覆盖整个运动场。

值得指出的是,这不一定是最优化的方法。理想情况下,您将只重绘已更改的零件,但这要复杂得多。绘制整个背景很容易。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。