2014-06-26 38 views
1

我試圖創建一個風景,圖像以不同的速度從屏幕的一側移動到另一側,創建視差效果。我使用一個名爲BackgroundObject的Sprite類,但是當我嘗試使用BackgroundObject創建一個Sprite時,我得到一個TypeError。Pygame在創建自定義精靈類時拋出「TypeError」

我正在使用的代碼如下:

import pygame 
from pygame.locals import * 
import sys, random, os 
import vector 

# Background objects (for parallax) 
class BackgroundObject(pygame.sprite.Sprite): 
    def _init_(self, x, y, image, speed): 
    pygame.sprite.Sprite._init_(self) 
    self.image = image 
    self.rect = self.image.get_rect() 
    self.rect.topleft = (x,y) 
    self.speed = speed 

    def update(self, time_passed): 
    moved_distance = time_passed * self.speed 
    self.rect.left += moved_distance 
    if self.rect.right < 0: 
     self.rect.left= self.rect.width 


pygame.init() 
screen = pygame.display.set_mode((768, 1024), 0, 32) 

obstacleImage = "obstacle.png" 
fenceImage = "fences.png" 
cloudImage = "clouds.png" 
cityImage = "cityscape.png" 
groundImage = "bottom.png" 
backgroundImage = "background.png" 

pathName = "Assets" 

# Sprites in the game 
obstacles = pygame.sprite.Group() 
backgrounds = pygame.sprite.OrderedUpdates() 
backgroundOrder = [] 
backdrop = pygame.image.load(os.path.join(pathName + os.sep + backgroundImage)) 

fences = pygame.image.load(os.path.join(pathName + os.sep + fenceImage)) 
clouds = pygame.image.load(os.path.join(pathName + os.sep + fenceImage)) 
cityscape = pygame.image.load(os.path.join(pathName + os.sep + cityImage)) 
ground = pygame.image.load(os.path.join(pathName + os.sep + cityImage)) 

sprite = BackgroundObject(1280, 192, clouds, 192) 
backgrounds.add(sprite) 
backgrounds.add(BackgroundObject(0, 192, clouds, 192)) 
backgrounds.add(BackgroundObject(832, 768, cityscape, 154)) 
backgrounds.add(BackgroundObject(0, 768, cityscape, 154)) 
backgrounds.add(BackgroundObject(1728, 768, fences, 384)) 
backgrounds.add(BackgroundObject(0, 768, fences, 384)) 
backgrounds.add(BackgroundObject(992, 896, ground, 512)) 
backgrounds.add(BackgroundObject(0, 896, ground, 512)) 

titleScreen = pygame.image.load(os.path.join(pathName + backgroundImage)) 

clock = pygame.time.Clock() 

while True: 

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

    screen.blit(titleScreen, titleScreen.rect) 

    backgrounds.update(time_passed) 

    backgrounds.draw() 

    for item in background: 
    if item.rect.right < 0: 
     item.rect.right += (item.rect.width * 2) 

我recieving該錯誤消息如下,我不能弄明白它:

Traceback (most recent call last): 
    File "test.py", line 45, in <module> 
    sprite = BackgroundObject(1280, 192, clouds, 192) 
    File "/usr/lib/python2.7/dist-packages/pygame/sprite.py", line 114, in __init__ 
    if groups: self.add(groups) 
    File "/usr/lib/python2.7/dist-packages/pygame/sprite.py", line 129, in add 
    else: self.add(*group) 
    File "/usr/lib/python2.7/dist-packages/pygame/sprite.py", line 129, in add 
    else: self.add(*group) 
TypeError: add() argument after * must be a sequence, not int 

回答

1

你拼寫錯誤__init__;使用強調前後:

class BackgroundObject(pygame.sprite.Sprite): 
    def __init__(self, x, y, image, speed): 
     pygame.sprite.Sprite.__init__(self) 
     self.image = image 
     self.rect = self.image.get_rect() 
     self.rect.topleft = (x,y) 
     self.speed = speed 

你回溯顯示BackgroundObject()去直接Sprite.__init__沒有先經過你的方法。

+0

這樣做的竅門!這是我再也不會做的錯誤了。謝謝! –