2013-01-11 28 views
1

好的,我正在爲這個學校的項目工作。我應該製作一個太空侵略者類型的遊戲。我完成了使我的船移動和射擊。現在是問題所在,當我嘗試多火時,它會清除之前被解僱的子彈並且會觸發一個新的子彈,而這根本不是一個好站點。我如何才能真正發射多個鏡頭?我怎樣才能讓我的船發射多槍?

while (running == 1): 
    screen.fill(white) 
    for event in pygame.event.get(): 
     if (event.type == pygame.QUIT): 
      running = 0 
     elif (event.type == pygame.KEYDOWN): 
      if (event.key == pygame.K_d): 
       dir = "R" 
       move = True 
      elif (event.key == pygame.K_a): 
       dir = "L" 
       move = True 
      elif (event.key == pygame.K_s): 
       dir = "D" 
       move = True 
      elif (event.key == pygame.K_w): 
       dir = "U" 
       move = True 
      elif (event.key == pygame.K_ESCAPE): 
       sys.exit(0) 
      elif (event.key == pygame.K_SPACE): 
       shot=True 
       xbul=xgun + 18 
       ybul=ygun 
      #if key[K_SPACE]: 
       #shot = True 
     if (event.type == pygame.KEYUP): 
      move = False 

    #OBJECT'S MOVEMENTS 
    if ((dir == "R" and xgun<460) and (move == True)): 
     xgun = xgun + 5 
     pygame.event.wait 
    elif ((dir == "L" and xgun>0) and (move == True)): 
     xgun = xgun - 5 
     pygame.event.wait 
    elif ((dir == "D" and ygun<660) and (move == True)): 
     ygun = ygun + 5 
     pygame.event.wait 
    elif ((dir == "U" and ygun>0) and (move == True)): 
     ygun = ygun - 5 

    screen.blit(gun, (xgun,ygun)) 

    #PROJECTILE MOTION 
    #key = pygame.key.get_pressed() 

    if shot == True: 
     ybul = ybul - 10 
     screen.blit(bullet, (xbul, ybul)) 

    if xbul>640: 
     shot=False 

    pygame.display.flip() 
    time.sleep(0.012) 
+0

你必須第一行和第二行之間的縮進錯誤... – mgilson

+0

您需要保留屏幕項目符號的['list'](http://docs.python.org/3.3/tutorial/introduction.html#lists),並且移動bl它們全部在重畫期間等等。 – millimoose

+0

或Sprite的精靈組 – ninMonkey

回答

7

只有一個項目符號變量 - xbul和ybul。如果你想要多個子彈,那麼你應該讓每一個列表。您可以附加到每個列表以添加新的項目符號,彈出以刪除舊的項目符號,並在繪圖時迭代列表。

+0

我該怎麼做?我知道如何製作基本列表,但不是這種類型。你能給我一段可以做到的代碼嗎?我真的很新 – Whosyourdaddy

1

您可以爲包含x和y座標以及與子彈相關的其他事物創建子類。然後爲每個消防按鈕按下,創建並追加一個新實例到列表中。這樣你就可以擁有你想要的子彈。
(對於新move功能改變的代碼)

class Bullet: 
    def __init__(self,x,y,vx,vy):# you can add other arguments like colour,radius 
     self.x = x 
     self.y = y 
     self.vx = vx # velocity on x axis 
     self.vy = vy # velocity on y axis 
    def move(self): 
     self.x += self.vx 
     self.y += self.vy 

示例代碼添加到使用的list和子彈的更新現在的位置(move()是以上):

if shot == True: # if there are bullets on screen (True if new bullet is fired). 
    if new_bullet== True: # if a new bullet is fired 
     bullet_list.append(Bullet(n_x,n_y,0,10)) # n_x and n_y are the co-ords 
               # for the new bullet. 

    for bullet in bullet_list: 
     bullet.move() 
+0

你的意思是什麼?*其他論點?我怎樣才能爲它列出一個清單?我知道該怎麼做的列表的類型將不會工作 – Whosyourdaddy

+0

@Whosyourdaddy *其他參數是你想要爲子彈提供的其他參數,如顏色等,我忘了提及..(改變)和每次一個子彈被觸發,你可以創建一個Bullet類的新實例,並將它追加到列表中。將列表實現代碼部分添加到答案中。 – pradyunsg