Pygame实现双人游戏时出现卡顿问题

6

我刚开始尝试使用pygame,但是遇到了一个问题 - 当我为两个玩家制作游戏时,第二个角色总是会有延迟。以下是我的代码。

import pygame, sys
from pygame.locals import *

pygame.init()

clock = pygame.time.Clock()

background_img = pygame.image.load('Data/background.jpg')
size = background_img.get_size()

pygame.mixer.init()                         
pygame.mixer.music.load('Data/song.wav')   
pygame.mixer.music.set_volume(0.7)          
pygame.mixer.music.play(-1)    

dot_img = pygame.image.load('Data/dot.png')
dotx = 0
doty = 0
dotx_speed = 0
doty_speed = 0

circle_img = pygame.image.load('Data/circle.png')
circlex = 0
circley = 0
circlex_speed = 0
circley_speed = 0

display = pygame.display.set_mode(size)

pygame.display.set_caption('Game')

while 1: 
  for event in pygame.event.get():
      if event.type == pygame.QUIT:
          pygame.quit()
          sys.exit()

      elif event.type == pygame.KEYDOWN:
          if event.key == pygame.K_LEFT:
            dotx_speed = -10
          elif event.key == pygame.K_RIGHT:
            dotx_speed = 10
          elif event.key == pygame.K_UP:
            doty_speed = -10
          elif event.key == pygame.K_DOWN:
            doty_speed = 10
          elif event.key == pygame.K_a:
            circlex_speed = -10
          elif event.key == pygame.K_d:
            circlex_speed = 10
          elif event.key == pygame.K_w:
            circley_speed = -10
          elif event.key == pygame.L.s:
            circley_speed = 10            

    elif event.type == pygame.KEYUP:
        if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
            dotx_speed = 0
        elif event.key == pygame.K_UP or event.key == pygame.K_DOWN:
            doty_speed = 0
        elif event.key == pygame.K_a or event.key == pygame.K_d:
            circlex_speed = 0
        elif event.key == pygame.K_w or event.key == pygame.K_s:
            circley_speed = 0              

  dotx += dotx_speed
  doty += doty_speed

  circlex += circlex_speed
  circley += circley_speed    

  display.blit(background_img,(0,0))
  display.blit(dot_img,(dotx,doty))
  display.blit(circle_img,(circlex,circley))

  pygame.display.update()
  clock.tick(100)

我对pygame或者python并不是很熟悉,所以请原谅我的代码可能有些粗糙。非常感谢您的帮助。


不确定如何修复此问题,因为我相当确定不能检测到同时按下的按键(忽略像SHIFT等修饰符)。将if..elif更改为if..if可能会稍微改善情况,因为您可以在同一循环中检测多个键。 - SiHa
if ... if 不应该改变它,因为 event.key 只能有一个值。代码看起来没问题。 - furas
第二个字符是谁?即使您没有改变第一个字符的位置,第二个字符也会有延迟吗?您能提供更多信息吗? - Alexey Astahov
顺便说一下:你应该使用 pygame.K_s 而不是 pygame.L.s - furas
我不认为优先级是个问题,但还是会去检查一下。对于没有检查我的工作我感到抱歉 —— pygame.L_s 是一个明显的错误。谢谢! - Jamie Lin
显示剩余3条评论
1个回答

2
首先,将事件处理程序和计算放在一个流程中是不好的实践。因为你的计算可能不如你所希望的那样快(例如你的例子中的100 fps)。例如,检查你的图像分辨率。
另外,你有太多的if-else语句(在你的情况下这并不是错误)。你可以用字典来替换它。
把你的帧速率设得更现实一些(60)。
阅读Pygame新手指南,你的代码中有一些错误,例如使用pygame.image.load('foo.png')方法和.convert()方法“获取任何类型的blits速度”。

感谢您的所有建议。我已经更改了帧率,看起来运行效果好了一些,但是一段时间后,圆形停止,并且整个程序变得无响应。(我不得不强制退出应用程序。)回应您早期的评论,第二个角色只是一张图片,即使我没有移动点,圆形仍然会在我移动它后滞后。我将阅读关于Pygame的入门指南。非常感谢。 - Jamie Lin
@JamieLin - 代码看起来没问题。可能问题在硬件(键盘)或操作系统上。 - furas
1
你可能是想说 "使用pygame.image.load('foo.png').convert()一起使用..." ;) - elegent

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接