2016-12-03 100 views
0

對於我的計算項目,我需要製作某種應用或遊戲。我決定我會製造太空侵略者。我已成功地獲得基礎工作,玩家精靈會催生,我可以將它與背景和音樂工作正常,但現在當我試圖創造敵人精靈我不斷收到此錯誤:產生敵人精靈

C:\Python27\python.exe "C:/Users/Harry/Desktop/Computing Project/Galaxian.py" 
Traceback (most recent call last): 
    File "C:/Users/Harry/Desktop/Computing Project/Galaxian.py", line 87, in <module> 
    mobs.add(Mob) 
TypeError: unbound method add() must be called with Mob instance as first argument (got type instance instead) 

Process finished with exit code 1 

如果任何人都可以幫助我真的很感激它!這裏是我的代碼:

import pygame 
import random 

# --- constants --- (UPPER_CASE names) 

WHITE = (255, 255, 255) 
BLACK = ( 0, 0, 0) 
RED = (255, 0, 0) 
GREEN = ( 0, 255, 0) 
BLUE = ( 0, 0, 255) 
ORANGE = (255, 255, 0) 
YELLOW = ( 0, 255, 255) 

DISPLAY_WIDTH = 720 
DISPLAY_HEIGHT = 720 

FPS = 60 

# --- classes --- (CamelCase names) 

class Player(pygame.sprite.Sprite): 
            # <-- empty line for readabelity 
    def __init__(self): 
     pygame.sprite.Sprite.__init__(self) 
     self.image = pygame.image.load("images\\user1.gif").convert() 
     self.image = pygame.transform.scale(self.image, (50, 50)) 
     self.rect = self.image.get_rect() 
     self.speed_x = 0 


    def update(self): 
     self.speed_x = 0 
     keystate = pygame.key.get_pressed() 
     if keystate[pygame.K_LEFT]: 
      self.speed_x = -7 
     if keystate[pygame.K_RIGHT]: 
      self.speed_x = 7 
     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 

class Mob(pygame.sprite.Sprite): 
    def __init__(self): 
     pygame.sprite.Sprite.__init__(self) 
     self.image = pygame.Surface((30, 40)) 
     self.image.fill(RED) 
     self.rect = self.image.get_rect() 
     self.rect.x = random.randrange(0, DISPLAY_WIDTH - self.rect.width) 
     self.rect.y = random.randrange(-100, -40) 
     self.speedy = random.randrange(1, 8) 

    def update(self): 
      self.rect.y +=self.speedy 
      if self.rect.top > DISPLAY_HEIGHT + 10: 
       self.rect.x = random.randrange(0, DISPLAY_WIDTH - self.rect.width) 
       self.rect.y = random.randrange(-100, -40) 
       self.speedy = random.randrange(1, 8) 


# --- functions --- (lower_case names) 

# empty 

# --- main --- (lower_case names) 

# - init - 

pygame.init() 
pygame.mixer.init() 

display = pygame.display.set_mode((DISPLAY_WIDTH, DISPLAY_HEIGHT)) 
display_rect = display.get_rect() 

# - objects - 

all_sprites = pygame.sprite.Group() 
mobs = pygame.sprite.Group() 

player = Player() 
player.rect.center = ((DISPLAY_WIDTH/2), 650) 

all_sprites.add(player) 
for z in range(8): 
    mobs = Mob() 
    all_sprites.add(mobs) 
    mobs.add(Mob) 


background = pygame.image.load("C:\\Users\\Harry\\Desktop\\Computing Project\\images\\background.jpg") 
background = pygame.transform.scale(background, (DISPLAY_WIDTH, DISPLAY_HEIGHT)) 

# - other - 

pygame.mixer.music.load("C:\\Users\\Harry\\Desktop\\Computing Project\\Audio\\music\\soundtrack.mp3") 
pygame.mixer.music.play(-1) 
pygame.mixer.music.set_volume(0.4) 

# - mainloop - 

crashed = False 
clock = pygame.time.Clock() 

while not crashed: 

    # - events - 

    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      crashed = True 

     print(event) 

    # - updates (without draws) - 

    all_sprites.update() 

    # - draws (without updates) - 

    display.blit(background, (0, 0)) 

    all_sprites.draw(display) 

    pygame.display.update() 

    # - FPS - 

    clock.tick(FPS) 

    # - end - 

pygame.quit() 

回答

0
TypeError: unbound method add() must be called with Mob instance as first argument (got type instance instead) 

的問題是,你叫add方法和類Mob通過,但不是Mob一個實例。

all_sprites.add(player) 
for z in range(8): 
    mobs = Mob() 
    all_sprites.add(mobs) 
    mobs.add(Mob) # This is the class name 

根據的add()界面上,你可能會想要做的:

mob = Mob() 
mobs.add(mob) 

但它是一個有點不清楚你在這裏要完成

什麼