2016-01-21 11 views
6

私はPygameで遊んだばかりで、問題を見つけました。ここに私のコードです。2人のプレーヤーが実行されたときに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に精通していないです。どんな助けもありがとうございます。

+0

私はそれが(私が最初のプレイヤーであると仮定している)「ドット」が 'elif event.type == pygame.KEYDOWN'セクションで優先順位を取っているからです。したがって、 'circle'は' dot'コントロールキーが押されていないときにのみ入力を得ることができます。 – SiHa

+0

これを修正する方法がわかりません。私はかなりの同時押下( 'SHIFT 'などの修飾子を無視して)を検出できないことがかなり確かです。 'if .. elif'を' if .. if'に変更すると、同じループ内で複数のキーを検出することができるため、少し改善されるかもしれません。 – SiHa

+0

'event.key'は1つの値しか持てないので' if ... if'はそれを変更すべきではありません。コードはOKです。 – furas

答えて

2

すべてのイベントハンドラの大部分と1つのフローでの計算は悪い習慣です。あなたの計算は、あなたの望みどおり速くないかもしれません(あなたの例では100fps)。例えば、画像の解像度をチェックします。

また、if - elseという文も多すぎます(あなたの場合は間違いではありません)。あなたはdictsと置き換えることができます。

フレームレートをより現実的にします(60)。

読むA Newbie Guide to pygame、あなたのコード内のいくつかのミスは、「あなたのブリットのうちの速さの任意の種類を取得するために」に.convert()方法でpygame.image.load('foo.png')を使用して、たとえば、あります。

+0

すべての入力をありがとう。私はフレームレートを変更しましたが、少し上手くいくようですが、しばらくするとサークルが停止し、プログラム全体が応答しなくなります。 (私はアプリケーションを強制終了する必要があります)あなたの以前のコメントに応じて、2番目の文字は単なる画像であり、ドットを移動していなくても、移動後に円はまだ遅れています。私はPygameへの初心者ガイドを読むでしょう。どうもありがとう。 –

+0

@JamieLin - コードはOKです。ハードウェア(キーボード)や操作システムに問題がある可能性があります。 – furas

+1

おそらく "* pygame.image.load( 'foo.png')*を* .convert()... *";) – elegent