Есть ли способ передать класс в качестве аргумента в функции без запуска всего класса?

#python #class #methods #pygame

#python #класс #методы #pygame

Вопрос:

Я использую Pygame, чтобы попытаться передать класс в качестве аргумента в функции, чтобы я мог вызвать метод, а не весь класс. Каждый раз, когда я передаю аргумент class, кажется, что он запускает класс, и поскольку он находится в цикле, это довольно быстро сокращает его. Кто-нибудь может помочь сделать это? Также мой код структурирован нормально? Я пытаюсь удалить капли дождя из группы, а затем сгенерировать новую строку, но пока просто пытаюсь придумать способ удаления капель дождя из группы. Спасибо!!! Кстати, немного новичок в Python и кодировании в целом (не считая HTML5 и CSS3).

Я попытался установить класс в качестве переменной (drop = Droplet()), а затем попытаться запустить функцию для удаления. Я также пытался установить функцию внутри класса в качестве метода, и это тоже не удалось. Я действительно ценю любую помощь. Спасибо! Я провел исчерпывающее исследование Stack Overflow и в Google. Я пробовал .kill и .remove.

 class Droplet(Sprite):
    def __init__(self):
        super(Droplet, self).__init__(rainfall)
        self.screen = screen
        self.screen_rect = screen.get_rect
        self.image = pygame.image.load('images/Glossy_Raindrop.bmp')
        self.rect = self.image.get_rect()
        self.rect.x = self.rect.width
        self.rect.y = self.rect.height

    def blitme(self):
        self.screen.blitme(self.image, self.rect)


def dropground(Droplet):
    drop = Droplet()
    screenie = screen.get_rect()
    if not screen.get_rect().contains(drop.rect):
        print("delete")
        drop.kill()


def update_screen(rainfall):
    screen.fill((135, 206, 235))
    print(len(rainfall))
    rain_y_move(Droplet, rainfall)
    dropground(Droplet)
    rainfall.draw(screen)
    pygame.display.flip()
  

В конечном итоге я просто получил тонну дождевых капель, генерируемых одновременно, что замедляет его. Я бы хотел, чтобы он удалил raindrop в группе, а затем перешел оттуда и сгенерировал новую строку. Как дождь на экране.

Ответ №1:

Вы должны создать Droplet объект и передать объект функциям.

Но я рекомендую использовать pygame.sprite.Group .

Добавьте .update метод к Droplet классу, который выполняет y-перемещение и «убивает» падение, если оно упало на землю. Все параметры, которые передаются .update методу Group , делегируются .updtate методу содержащихся элементов:

 class Droplet(Sprite):

   # [...]

   def update(self)

       self.rect = self.rect.move(0, speed)           

       screenie = screen.get_rect()
       if not screen.get_rect().contains(self.rect):
           print("delete")
           self.kill()    
  

Создайте группу и добавьте drops:

например

 rainfall = pygame.sprite.Group()
my_drop = Droplet()
rainfall.add(my_drop)
  

Droplet.blitme может быть удален, потому что pygame.sprite.Group предоставляет .draw метод, который «размывает» каждую поверхность группы — для этого должен быть установлен .rect и .image атрибут Sprite .

 def update_screen(rainfall):
    screen.fill((135, 206, 235))
    print(len(rainfall))

    rainfall.update();
    rainfall.draw(screen)        

    pygame.display.flip()

while run:

    update_screen(rainfall)
  

Комментарии:

1. Должен ли я использовать drop = Droplet() в качестве глобальной переменной?

2. Почему, если не screen.get_rect().contains(drop.rect): не становится true после того, как капля дождя покидает экран и предположительно rect?

3. Спасибо Rabbid76! Ты потрясающий! Я поддержал ваш ответ, но я слишком новичок, чтобы иметь в виду что-либо здесь. Но я вам благодарен!