2013-12-18 7 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

Спасибо за это, скажем, если я не хочу использовать методы класса и я вместо этого использовал 'тролль = Sprite() тролля. init() troll.gameLoop() ' Метод init только первый класс, он не выполняет перегрузку метода, как мне обойти эту проблему? –

Смежные вопросы