【问题标题】:Pygame lags when two players are implementedPygame 在实现两个玩家时滞后
【发布时间】:2016-01-21 12:47:30
【问题描述】:

我刚开始玩 pygame,刚刚遇到一个问题 - 当我为 2 名玩家制作游戏时,第二个角色总是滞后。这是我的代码。

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,所以请原谅我草率的代码。任何帮助表示赞赏。

【问题讨论】:

  • 我倾向于说这是因为(我假设是第一个玩家)dotelif event.type == pygame.KEYDOWN 部分中具有优先权。因此,circle 只有在没有按下任何dot 控制键时才能获得输入。
  • 不确定您将如何解决此问题,因为我相当确定同时按键(忽略 SHIFT 等修饰符)无法检测到。将 if .. elif 更改为 if .. if 可能会稍微改善一些情况,因为您可以在同一个循环中检测到多个键。
  • if ... if 不应更改它,因为event.key 只能有一个值。代码看起来不错。
  • 第二个角色是谁?即使您没有更改第一个字符的位置,第二个字符也有滞后?你能提供更多信息吗?
  • 你的代码对我有用——但我在没有pygame.mixer的情况下测试了它

标签: python pygame lag multiplayer


【解决方案1】:

首先在一个流程中处理所有事件处理程序和计算是不好的做法。因为您的计算可能没有您想要的那么快(在您的示例中为 100 fps)例如,检查图像的分辨率。

另外你有太多的if-else 语句(在你的情况下这不是一个错误)。您可以将其替换为 dicts。

让您的帧速率更逼真 (60)。

阅读A Newbie Guide to pygame,您的代码中有一些错误,例如使用pygame.image.load('foo.png').convert() 方法来“从你的blits 中获得任何类型的速度”。

【讨论】:

  • 感谢您的所有意见。我改变了帧率,似乎效果好一点,但是过了一会儿,圆圈停止了,整个程序变得没有响应。 (我必须强制退出应用程序。)针对您之前的评论,第二个字符只是一个图像,即使我没有移动点,我移动它后圆圈仍然滞后。我将阅读 Pygame 新手指南。非常感谢。
  • @JamieLin - 代码看起来不错。可能问题出在硬件(键盘)或操作系统上。
  • 你可能的意思是“使用 pygame.image.load('foo.png') *with .convert() ...*” ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多