2014-04-22 25 views
0

我對python相當陌生,我試圖做一個小空間入侵者遊戲。我的問題是,我不能在屏幕上有更多的子彈。我希望能夠在原始遊戲中至少擊出3次。最好的辦法是什麼?多個子彈pygame太空入侵者

這裏是我的代碼:

from pygame import * 
import random 

class Sprite: 

     def __init__(self, xpos, ypos, filename): 
       self.x = xpos 
       self.y = ypos 
       self.bitmap = image.load(filename) 
       self.bitmap.set_colorkey((0,0,0)) 
     def set_position(self, xpos, ypos): 
       self.x = xpos 
       self.y = ypos 
     def render(self): 
       screen.blit(self.bitmap, (self.x, self.y)) 

def Intersect(s1_x, s1_y, s2_x, s2_y): 
     if (s1_x > s2_x - 30) and (s1_x < s2_x + 30) and (s1_y > s2_y - 30) and (s1_y < s2_y + 30): 
       return 1 
     else: 
       return 0 

init() 
screen = display.set_mode((640,480)) 
key.set_repeat(1, 1) 
display.set_caption('PyInvaders') 
backdrop = image.load('data/backdrop.bmp') 
enemies = [] 

x = 0 
count = 0 

for count in range(10): 
    if count < 10: 
     enemies.append(Sprite(50 * x + 50, 50, 'data/baddie.bmp')) 
     x += 1 
     count += 1 
    else: 
     x = 0 
     enemies.append(Sprite(100 * x + 100, 50, 'data/baddie.bmp')) 
     x += 1 





hero = Sprite(20, 400, 'data/hero.bmp') 
ourmissile = Sprite(0, 480, 'data/heromissile.bmp') 
enemymissile = Sprite(0, 480, 'data/baddiemissile.bmp') 
gameover = image.load('data/gameover.bmp') 



quit = 0 
enemyspeed = 4 
timer = 0   


while quit == 0: 

     heromid = hero.x + 16 
     screen.blit(backdrop, (0, 0)) 

     for count in range(len(enemies)): 
       enemies[count].x += enemyspeed 
       enemies[count].render() 

     if enemies[len(enemies)-1].x > 590: 
       enemyspeed = -3 
       for count in range(len(enemies)): 
         enemies[count].y += 5 

     if enemies[0].x < 10: 
       enemyspeed = 3 
       for count in range(len(enemies)): 
         enemies[count].y += 5 

     if ourmissile.y < 640 and ourmissile.y > 0: 
      ourmissile.render() 
      ourmissile.y += -5 
      timer = timer + 1 

     if enemymissile.y >= 480 and len(enemies) > 0: 
      enemymissile.x = enemies[random.randint(0, len(enemies) - 1)].x + 16 
      enemymissile.y = enemies[0].y 

     if Intersect(hero.x, hero.y, enemymissile.x, enemymissile.y): 
      quit = 1 

     for count in range(0, len(enemies)): 
      if Intersect(ourmissile.x, ourmissile.y, enemies[count].x, enemies[count].y): 
        del enemies[count] 
        break 

     if len(enemies) == 0: 
      quit = 1 

     for ourevent in event.get(): 
       if ourevent.type == QUIT: 
         quit = 1 
       if ourevent.type == KEYDOWN: 
         if ourevent.key == K_RIGHT and hero.x < 590: 
           hero.x += 5 
         if ourevent.key == K_LEFT and hero.x > 10: 
           hero.x -= 5 
         if ourevent.key == K_SPACE: 
          if timer < 400: 
           timer = 0 
           ourmissile.x = heromid 
           ourmissile.y = hero.y 

     enemymissile.render() 
     enemymissile.y += 5 

     hero.render() 

     display.update() 
     time.delay(10) 


while quit == 1: 
    screen.blit(gameover,(0,0)) 
    display.update() 
    if ourevent.type == KEYDOWN: 
     if ourevent.key == K_SPACE: 
      quit == 0 
+0

根據您當前的代碼。這並不容易,但我會建議查看類和數據數組等。爲子彈創建一個類。爲敵人子彈創建一個班級。看看這個網站的一些靈感:http://pygame.org/tags/spaceinvaders – KodyVanRy

回答

1

而是具有一種導彈,使導彈列表。因此,而不是這樣的:

if ourevent.key == K_SPACE: 
    if timer < 400: 
     timer = 0 
     ourmissile.x = heromid 
     ourmissile.y = hero.y 

創建一個新的導彈,並將其添加到列表:

if timer < 400: 
    timer = 0 
    missiles.append(Sprite(heromid, hero.y, 'data/heromissile.bmp') 

添加循環繪製和移動所有的導彈:

for m in missiles: 
    if m.y < 640 and m.y > 0: 
     m.render() 
     m.y += -5 
+0

嘿我試過這個,它的工作表示感謝,但我現在得到一個連續的子彈我想推遲它等待50每個子彈之間的毫秒數,以防止用戶只是保持按下空格鍵,並有一個連續的子彈 – Tuytuy

+0

@ user3454855做一個計時器,檢查按空格時是否已經過了足夠的秒數 –

1

好吧,讓我們坦率地說。你將不得不重新編碼大部分。下面是我如何做到了一個例子:

我創建了一個精靈組(它擁有多個精靈)

bulletGroup = pygame.sprite.Group() 

然後我做了一個類子彈

​​

現在到創建子彈:

# You can execute this same line as many times as you want and the bullets will be seperate 
bullet = Bullet(x, y) 

如果您需要在此格式移動它們讓我知道幫助,希望它幫助!

而且不健全的意思,但我真的trynna獲得聲譽ATM :)