2017-01-17 4 views
1

私の先進的な高性能コンピューティングコースでは、私はプロジェクトを行う必要があります。鉱山はスペースインベーダーを作っています。私はこれまでPythonを使用していませんでした。私は対処方法を知らないというエラーが発生しました。コードは以下の通りです。TypeError:バインドされていないメソッドsprites()

import pygame 
import random 
import sys 
# --- 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): 
    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 

    def shoot(self): 
     bullet = Bullet(self.rect.centerx, self.rect.top) 
     all_sprites.add(bullet) 

class Mob(pygame.sprite.Sprite): 
    def __init__(self): 
     pygame.sprite.Sprite.__init__(self) 
     self.image = pygame.image.load("images\\enemy1.gif").convert() 
     self.image = pygame.transform.scale(self.image, (50, 50)) 
     self.rect = self.image.get_rect() 
     self.speed_x = 0 
     self.rect.x = random.randrange(0, DISPLAY_WIDTH - self.rect.width) 
     self.rect.y = random.randrange(-500, -40) 
     self.speedy = random.randrange(5, 11) 

    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.speed_y = random.randrange(5, 11) 

class Bullet(pygame.sprite.Sprite): 

    def __init__(self, x, y): 
     pygame.sprite.Sprite.__init__(self) 
     self.image = pygame.image.load("images\\laser1.gif").convert() 
     self.image = pygame.transform.scale(self.image, (15, 25)) 
     self.rect = self.image.get_rect() 
     self.rect.bottom = y 
     self.rect.centerx = x 
     self.speed_y = -20 

    def update(self): 
     self.rect.y += self.speed_y 
     if self.rect.bottom < 0: 
      self.kill() 

# --- 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 and groups - 

all_sprites = pygame.sprite.Group() 
mobs = pygame.sprite.Group() 
bullet_group = pygame.sprite.Group 
player = Player() 
player.rect.center = ((DISPLAY_WIDTH/2), DISPLAY_HEIGHT/1.2) 

all_sprites.add(player) 

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

background = pygame.image.load("images\\background.jpg") 
background = pygame.transform.scale(background, (DISPLAY_WIDTH, DISPLAY_HEIGHT)) 

# - other - 

pygame.mixer.music.load("audio\\soundtrack.mp3") 
pygame.mixer.music.play(-1) 
pygame.mixer.music.set_volume(0.4) 

# - mainloop - 

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



while not crashed: 

    # - checks for a hit - 
    col = pygame.sprite.spritecollideany(player, mobs) 
    if col: 
     sys.exit() 

    col = pygame.sprite.groupcollide(mobs, bullet_group, True, True) 

    # - events - 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      crashed = True 
     elif event.type == pygame.KEYDOWN: 
      if event.key == pygame.K_SPACE: 
       player.shoot() 

     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() 

これは私が受け取っているエラーメッセージです。どんな助けもありがとう、ありがとう。

C:\Python27\python.exe "C:/Users/Iain/Desktop/Computing Project/Galaxian.py" 
Traceback (most recent call last): 
    File "C:/Users/Iain/Desktop/Computing Project/Galaxian.py", line 132, in <module> 
    col = pygame.sprite.groupcollide(mobs, bullet_group, True, True) 
    File "C:\Python27\lib\site-packages\pygame\sprite.py", line 1382, in groupcollide 
    c = SC(s, groupb, dokillb, collided) 
    File "C:\Python27\lib\site-packages\pygame\sprite.py", line 1339, in spritecollide 
    for s in group.sprites(): 
TypeError: unbound method sprites() must be called with Group instance as first argument (got nothing instead) 

Process finished with exit code 1 

答えて

1

「バインドされていないメソッド」は、クラスから取得されたメソッドオブジェクトです。呼び出されると、渡されたクラスのインスタンスが必要です。

"バインドされたメソッド"は、クラスのインスタンスにバインドされたメソッドです。それはすでにインスタンスを持っているので、「通常」と呼ばれることがあります。

あなたの場合、あなたは単純なタイプミスがあります。バインドされていないメソッドがありますが、バインドされたメソッドであったはずです。実際の問題はあなたがpygameに渡した引数が間違っているためです。

プログラムの132行目では、groupcollideを呼び出します。あなたが提供する引数の1つに、bullet_groupという名前の変数があります。

問題の根本的な原因は、この行です:

bullet_group = pygame.sprite.Group 

bullet_grouppygame.sprite.Groupクラスを参照し、結果ようにあなたは、括弧を逃しました。括弧を追加してクラスを呼び出すだけで、インスタンスが作成されます。

bullet_group = pygame.sprite.Group() 

あなたは正しくmobsall_spritesのための前の行にこれをしませんでした。

関連する問題