2013-12-18 117 views
0

我試圖在屏幕上顯示一組精靈,但是,我的下面的代碼顯示一個空白屏幕。我一直在這一段時間,我不知道爲什麼這不工作的邏輯似乎是正確的。主要問題發生在精靈方法中,我試圖在隨機位置添加精靈。然後用gameLoop方法繪製精靈。將精靈添加到組

有什麼建議嗎?

import pygame, sys, random 
pygame.init() 
troll = pygame.image.load("image.png") 
black = (0, 0, 0) 

SCREEN_WIDTH = 640 
SCREEN_HEIGHT = 400 
sprite_width = 5 
sprite_height = 5 
spriteCount = 5 


class Sprite(pygame.sprite.Sprite): 
    pygame.init() 
    sprite = pygame.sprite.Group() 
    clock = pygame.time.Clock() 

    def __init__(self): 
     pygame.sprite.Sprite.__init__(self) 

    def __init__(self, Image, pos): 
     pygame.sprite.Sprite.__init__(self) 
     self.image =pygame.Surface([0, 0]) 
     self.rect = self.image.get_rect() 
     self.rect.topleft = pos 

    @classmethod 
    def sprite(self): 
     for i in range(spriteCount): 
      tmp_x = random.randrange(0, SCREEN_WIDTH) 
      tmp_y = random.randrange(0, SCREEN_HEIGHT) 
      # all you have to do is add new sprites to the sprite group 
      self.sprite.add(Sprite(troll, [tmp_x, tmp_y])) 

    def update(self): 
     self.rect.x += 1 
     self.rect.y += 2 
     if self.rect.y > SCREEN_HEIGHT: 
      self.rect.y = -1 * sprite_height 
     if self.rect.x > SCREEN_WIDTH: 
      self.rect.x = -1 * sprite_width 

    @classmethod 
    def setImage(self,Image): 
     self.image=pygame.image.load(Image) 

    @classmethod  
    def gameLoop(self): 
     screen = pygame.display.set_mode([640, 400]) 
     while True: 
      for event in pygame.event.get(): 
       if event.type == pygame.QUIT: 
        pygame.quit() 
        sys.exit() 
      screen.fill(black) 

      # to update or blitting just call the groups update or draw 
      # notice there is no for loop 
      # this will automatically call the individual sprites update method 

      self.actor.update() 
      self.actor.draw(screen) 

      pygame.display.update() 
      self.clock.tick(20) 

Sprite.sprite() 
Sprite.setImage("image.png") 
Sprite.gameLoop() 

回答

0
@classmethod 
def setImage(self,Image): 
    self.image=pygame.image.load(Image) 

在這裏,你應該名字的第一個參數cls,不self,因爲它是一個類的方法,而不是一個實例方法。另外,參數名應該是小寫(image而不是Image)。


@classmethod  
def gameLoop(self): 
    screen = pygame.display.set_mode([640, 400]) 
    while True: 
     ... 

同樣在這裏。此外,我不知道爲什麼你的gameloop是你的Sprite類的一部分。另外,你不應該把你的課程名稱命名爲Sprite,因爲它只會讓pygame的Sprite課程變得混亂。


class Sprite(pygame.sprite.Sprite): 
    ... 
    sprite = pygame.sprite.Group() 
    ... 

    @classmethod 
    def sprite(self): 
     ... 

這裏有一個域名爲sprite和一流水平的功能sprite。這將不起作用,因爲該方法將覆蓋該字段。因此,只要您想訪問sprite字段,您就可以訪問功能sprite


@classmethod  
def gameLoop(self): 
    ... 
    self.actor.update() 

Sprite.actor不會退出。你從未創造過這樣的領域。


def __init__(self, Image, pos): 
    pygame.sprite.Sprite.__init__(self) 
    self.image =pygame.Surface([0, 0]) 
    self.rect = self.image.get_rect() 
    self.rect.topleft = pos 

在這裏,你傳遞一個參數,稱爲Image。但是,您不使用它,而是使用空的Surface


這是你的代碼的運行版本:

import pygame, sys, random 

pygame.init() 
troll = pygame.image.load("image.png") 
black = pygame.color.Color('black') 
SCREEN_WIDTH = 640 
SCREEN_HEIGHT = 400 
spriteCount = 5 


class Sprite(pygame.sprite.Sprite): 
    actors = pygame.sprite.Group() 
    clock = pygame.time.Clock() 

    def __init__(self): 
     pygame.sprite.Sprite.__init__(self) 

    def __init__(self, image, pos): 
     pygame.sprite.Sprite.__init__(self) 
     self.image = image 
     self.rect = self.image.get_rect() 
     self.rect.topleft = pos 

    @classmethod 
    def init(self): 
     for i in range(spriteCount): 
      tmp_x = random.randrange(0, SCREEN_WIDTH) 
      tmp_y = random.randrange(0, SCREEN_HEIGHT) 
      self.actors.add(Sprite(troll, [tmp_x, tmp_y])) 

    def update(self): 
     self.rect.x += 1 
     self.rect.y += 2 
     if self.rect.y > SCREEN_HEIGHT: 
      self.rect.y = -1 * self.rect.height 
     if self.rect.x > SCREEN_WIDTH: 
      self.rect.x = -1 * self.rect.width 

    @classmethod  
    def gameLoop(self): 
     screen = pygame.display.set_mode([SCREEN_WIDTH, SCREEN_HEIGHT]) 
     while True: 
      for event in pygame.event.get(): 
       if event.type == pygame.QUIT: 
        pygame.quit() 
        sys.exit() 
      screen.fill(black) 

      self.actors.update() 
      self.actors.draw(screen) 

      pygame.display.update() 
      self.clock.tick(20) 

Sprite.init() 
Sprite.gameLoop() 
+0

感謝這個,說如果我不希望使用類的方法和我代替 '巨魔=雪碧() 巨魔。 init() troll.gameLoop()' init方法只有類第一個,它不執行方法重載,我該如何解決這個問題? –