2017-02-01 6 views
-1

私の現在のプロジェクトは、pythonでスペースインベーダーを作ることです。私はそうするためにpygameライブラリを使用しています。これまでのところ、プレーヤーの発砲以外はすべて正常に動作します。プレイヤーが左のコントロールを押すと、プレイヤーは1発の弾を発射するはずです。代わりに、移動のような何かをするように指示されるまで、プレイヤーは発砲し続けます。誰もがこの問題で私を助けることができれば、それは非常に感謝される、コードは、ありがとうございます。あなたがK_LCTRLを解放するまで - あなたはすべての時間をTrue与えpygame.key.get_pressed()を使用しているためpygameでの発射

def update(self): 
    self.speed_x = 0 
    keystate = pygame.key.get_pressed() 
    if keystate[pygame.K_LEFT]: 
     self.speed_x = -10 
    if keystate[pygame.K_RIGHT]: 
     self.speed_x = 10 
    self.rect.x += self.speed_x 
    if self.rect.right > DISPLAY_WIDTH: 
     self.rect.right = DISPLAY_WIDTH 
    if self.rect.left < 0: 
     self.rect.left = 0 
    if keystate[pygame.K_LCTRL]: 
     player.shoot() 
+1

あなたはshoot' 'の定義を掲示すべきで、それを実行 - (ときボタンの変更状態pressedからnot-pressedに同じKEYUPは一度だけ作成されます)。 –

+0

これは 'pygame.key.get_pressed()'を使用しているためです。これは 'True'を常に与えています - あなたが' K_LCTRL'を解放するまでです。 'fired = True/False'を使うと、最初の弾を発射した場合に制御することができます。また、 'event'は、' event.type == pygame.KEYDOWN'を 'pygame.key.get_pressed()'の代わりに使います。 – furas

答えて

1

あなたが問題を抱えています。

最初の弾丸を発射した場合は、fired = True/Falseを使用して制御できます。

def __init__(self): 
    self.fired = False 

def update(self): 
    if keystate[pygame.K_LCTRL]: 
     if not self.fired: 
      player.shoot() 
      self.fired = True 
    else: 
     self.fired = False 

それともeventは一度だけ作成されるため、event.type == pygame.KEYDOWNの代わりpygame.key.get_pressed()を使用する - ボタンはpressednot-pressedから状態を変更したとき。

def handle_event(self, event): 
    if event.type == pygame.KEYDOWN: 
     if pygame.key == pygame.K_LCTRL: 
      player.shoot() 

をし、メインループ

for event in pygame.event.get(): 
    your_object.handle_event(event) 
関連する問題