Pygame: атрибут Sprite существует после убийства спрайта - PullRequest
0 голосов
/ 19 января 2020

Я довольно новичок в Python и после изучения принципов я хочу улучшить свои навыки, программируя игры. Итак, я начал с игры, в которой игроку просто нужно было собирать книги (это не так скучно).

Для книг у меня есть два списка: list_classes с разными именами (например, Book1, Book2, Book3 ... Book 15) и list_book_images, который включает в себя четыре разных изображения для книг. Поскольку должны быть видны только три книги одновременно, я создаю их с помощью следующего метода в главном l oop:

def draw_books(list_classes, reset=False, degree=BACHELOR):
   global num_books_drawn

    while len(books_sprites) < BOOKS_MAX_VISIBLE:
        name = random.randint(0,len(list_classes)-1)
        image = random.randint(0,len(list_book_images)-1)
        ects = random.randint(3,5)
        value = random.randint(100,1000)

        book = Book(str(list_classes[name]), list_book_images[image], value, ects)
        book.draw()
        books_sprites.add(book)
        all_sprites.add(book)
        num_books_drawn += 1 

Вот класс Book с методом draw.

class Book(pygame.sprite.Sprite):
    def __init__(self, ID, image, value, ECTS, onscreen=False):
        pygame.sprite.Sprite.__init__(self)
        self.onscreen = onscreen
        self.ID = ID
        self.value = value
        self.ECTS = ECTS
        self.image = image
        self.costs = 50
        self.text = font_books.render(str(ID), True , WHITE)
        self.rect = self.image.get_rect()
        self.x = random.randint(0,WIDTH_IN_CLASSES-self.rect.width)
        self.y = random.randint(MENUHEIGHT_IN_CLASSES, HEIGHT_IN_CLASSES-self.rect.height)

    def draw(self):
            #get width and height of text for destination
            w = self.text.get_rect().width
            h = self.text.get_rect().height

            #blits the image on x and y 
            self.rect.x = self.x
            self.rect.y = self.y

            #prints the name of the book
            self.image.blit(self.text, [int(w/2),h+10])  

Так что книги почти нарисованы так, как я хочу, три книги одновременно, и они появляются случайно. Но, как вы можете видеть из функции рисования (класс Book), я также хочу пометить имя (self.text). Каждый раз, когда появляется новая книга с изображением, которое уже было показано, название новой книги будет перекрывать старую, и она больше не будет читаться. Я не знаю, почему это происходит, потому что старая книга была убита с помощью .kill () (она полностью исчезла, также имя), когда столкновение обнаружено.

Как получается, что книги убивают, но self.text "выживает" и все еще отображается, когда рисуется следующая книга.? Я пока не могу найти решение для этого - не могли бы вы дать мне дополнительную информацию, как решить эту проблему?

Большое спасибо!

...