2017-08-15 13 views
0

私はキーを押したときにpygame.draw.rect()でシェイプを描画しようとしていますが、シェイプは別のキーやイベントが発生しても保持されません。船の移動が、私はそれが私がそれを撮影したときに移動し、その場所に滞在し、私はキーpygame.draw.rect()に貼り付け

import pygame 

pygame.init() 

display_width = 800 
display_hight = 600 
colors = {"black": (0, 0, 0), "white": (255, 255, 255), "green": (0, 255, 0), "red": (255, 0, 0), "blue": (0, 0, 255)} 
ship_width = 75 
ship_hight = 72 
gameDisplay = pygame.display.set_mode((display_width, display_hight)) 
pygame.display.set_caption('test') 
clock = pygame.time.Clock() 

shipimg = pygame.image.load('D:\\index.png') 

def ship(x, y): 
    gameDisplay.blit(shipimg, (x, y)) 



def Game_Loop(): 
    x = (display_width * 0.41) 
    y = (display_hight * 0.8) 
    x_change = 0 
    fire_start_y = y - ship_hight 
    fire_start_x = x + (ship_width/2) 

    GameExit = False 


    while not GameExit: 
     if fire_start_y < 0: 
      fire_start_y = y - 30 
     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: 
       GameExit = True 
      if event.type == pygame.KEYDOWN: 
       if event.key == pygame.K_LEFT: 
        x_change = -5 
       if event.key == pygame.K_RIGHT: 
        x_change = 5 

      if event.type == pygame.KEYUP: 
       if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT: 
        x_change = 0 
     x += x_change 

     gameDisplay.fill(colors["white"]) 

     if event.type == pygame.KEYDOWN: 
      if event.key == pygame.K_x: 
       pygame.draw.rect(gameDisplay, colors["green"], [fire_start_x, fire_start_y, 2, 10]) 

     ship(x, y) 
     if x <= 0 or x >= display_width - ship_width: 
      x -= x_change 
     fire_start_y -= 5 
     fire_start_x = x + (ship_width/2) 


     pygame.display.flip() 
     clock.tick(60) 


Game_Loop() 
pygame.quit() 

iが消失問題を管理するには、このコードを試してみました、そのリリース後の形状は文句を言わない表面に滞在したいが、それは作られましたそれ私がキーを押した後、それが今までloppingとして 悪化し

 if event.type == pygame.KEYDOWN: 
      if event.key == pygame.K_x: 
       pygame.draw.rect(gameDisplay, colors["green"], [fire_start_x, fire_start_y, 2, 10]) 
       fire_start_x = x + (ship_width/2) 
     elif event.type == pygame.KEYUP: 
      if event.key == pygame.K_x: 
       pygame.draw.rect(gameDisplay, colors["green"], [fire_start_x, fire_start_y, 2, 10]) 
       fire_start_x = x + (ship_width/2) 
+0

次のようになります弾丸)を撃つときに。 rectを上に動かすには、 'for'ループを使って' y'値を減らしてください。 – skrx

+0

私はあなたに例を示すことができますが、本当にほんの数の弾丸を撃ってみたいのかどうかは分かりません。目標を詳細に記述してください。 – skrx

答えて

0

かつての場合あなたがボタンを押したままにすると、このコードを使用して多くの弾丸を発射したい。

if pygame.key.get_pressed[pygame.K_x] != 0: 
    # Add code to add Rect objects to a list. 
    # Add in code to add the Rect objects in intervals. 

上記のコードでは、ゲームループを行うたびにrectオブジェクトを追加しないようにコードを追加する必要があります。あなたがしない場合は、1秒間に60個の弾丸を発射します。

キーダウンイベントごとに1発の弾丸を発射したい場合は、このコードを使用してください。

if pygame.event.type == pygame.KEYDOWN: 
    if pygame.event.key == pygame.K_x: 
     # Add code to add Rect objects to a list. 

ゲームループのレンダリング中に、rectオブジェクトをレンダリングする必要があります。

for bullet in bullets: 
    # Blit the bullet to the screen 
    # Increment/Decrement the x/y values so they move. 

もちろん、このリストから弾丸を削除する必要があります。また、衝突検出でコードを作成する必要があります。

もっと詳しく説明すれば、私は答えに追加します。 これが助けてくれることを願っています!

編集:コードの最初のブロックを使用して弾丸を「押し下げる」必要があります。これらのrectオブジェクトをリストに追加します。

if pygame.key.get_pressed[pygame.K_x] != 0: 
    bullets.append(pygame.Rect(x, y, 10, 3)) 
    # Add in a time delay. 

必ず箇条書きリストを作成してください。 xとyの値は、船に関連して弾丸を発射させたい場所になります。

これをレンダリングします。

for bullet in bullets: 
    window.blit(bullet, [bullet.x, bullet.y]) 
    bullet.x += 3 # This will make the bullet go EAST. 

画面から消えた弾を削除します。

for bullet in bullets: 
    if bullet.x < 0 or bullet.x + bullet.width > window_width: 
     bullets.remove(bullet) 
    # Add in some collision detection with other ships here. 

希望がこれを助けました!

+0

ここで私の目標は私の目標です私は特定のキーを押すと弾丸を出したいと思っています。そのキーはxだと仮定して弾丸を別のオブジェクトから始めることを望みます。弾丸の方向は、その射撃方向の変更だけを変更するつもりはない私はあなたに詳細を与えることを望む –

+0

ちょうどあなたの答えを見た。 Nevermid。 –

0

みんなありがとうしかし、私は弾丸のリストを作成し、私はxキーを押したときに、私が撮影したすべての弾丸foの方向性を追加するためにappendメソッドを使用してからそれらをremoveingこのHow to create bullets in pygame?

に探しています答えを見つけました彼らは私のゲームの表面、ここで

の外にある場合は、リストには、私のコードを表す(あなただけの、その後、弾丸を撃つリストを作成し、 `pygame.Rect`sを追加したい場合は、今

bullets = [] 
bullet_width = 2 
bullet_hight = 10 
def Game_Loop(): 
    x = (display_width * 0.41) 
    y = (display_hight * 0.8) 
    x_change = 0 
    bullet_y = y - (ship_hight/2) 

    GameExit = False 

    while not GameExit: 
     bullet_x = x + (ship_width/2) 
     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: 
       GameExit = True 
      if event.type == pygame.KEYDOWN: 
       if event.key == pygame.K_LEFT: 
        x_change = -5 
       if event.key == pygame.K_RIGHT: 
        x_change = 5 
       if event.key == pygame.K_x: 
        bullets.append([bullet_x,bullet_y]) 
      if event.type == pygame.KEYUP: 
       if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT: 
        x_change = 0 
     x += x_change 

     gameDisplay.fill(colors["white"]) 

     for bullet in bullets: 
      pygame.draw.rect(gameDisplay, colors["green"], (bullet[0], bullet[1], bullet_width, bullet_hight)) 

     ship(x, y) 
     if x <= 0 or x >= display_width - ship_width: 
      x -= x_change 
     for bullet in bullets: 
      bullet[1] -= 5 
      if bullet[1] < 0: 
       bullets.remove(bullet) 
     pygame.display.flip() 
     clock.tick(60) 
+0

反復処理中にリストを変更しないでください。これは予期しない結果を招き、すべての必要な項目が削除されるわけではありません。新リストを作成するか、箇条書き[:]: 'の箇条書きのコピーを反復処理してください。 – skrx

関連する問題