2017-08-15 42 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() 

我想這代碼管理消失的問題,但它使更糟糕 因爲它曾經截枝後,我按一次鍵

 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

如果你只是想拍攝子彈,然後創建一個列表,並追加'pygame.Rect's(代表子彈)當你射擊。要向上移動矩形,使用'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對象。如果你不這樣做,你會在每一幀第二或者第一發子彈中發射60發子彈,這可能是也可能不是太多。

如果您想爲每個keydown事件觸發一顆子彈,請使用此代碼。

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

感謝球員,但我發現我在這個How to create bullets in pygame?

尋找創建子彈列表,然後用append方法添加方向FO每一個子彈當我按下X鍵我拍,並從removeing他們的答案名單,如果他們是我的遊戲表面

這裏是我的代碼看起來像現在

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