Спрайты не будут появляться - PullRequest
4 голосов
/ 14 января 2020

Не могу понять, почему мой код не показывает спрайты, когда я его запускаю. Код взят из инструкции, которую я нашел в своей библиотеке, я перечитывал код несколько раз и не нашел ничего, кроме того, что говорится в книге. Это мой первый код на python, и я пока не видел ничего, что помогло бы мне решить мою проблему. Это весь код, который я написал для игры.

import pygame
from pygame import *
from random import randint

pygame.init()
WINDOW_WIDTH = 1100
WINDOW_HEIGHT = 600
WINDOW_RES = (WINDOW_WIDTH, WINDOW_HEIGHT)

WIDTH = 100
HEIGHT = 100

WHITE = (255, 255, 255)

SPAWN_RATE = 360

GAME_WINDOW = display.set_mode(WINDOW_RES)
display.set_caption('Attack of the vampire Pizzas!')

pizza_img = image.load('vampire.png')
pizza_surf = Surface.convert_alpha(pizza_img)
VAMPIRE_PIZZA = transform.scale(pizza_surf, (WIDTH, HEIGHT))

background_img = image.load('restaurant.jpg')
background_surf = Surface.convert_alpha(background_img)
BACKGROUND = transform.scale(background_surf, WINDOW_RES)


class VampireSprite(sprite.Sprite):

    def __init__(self):
        super().__init__()
        self.speed = 2
        self.lane = randint(0, 4)
        all_vampires.add(self)
        self.image = VAMPIRE_PIZZA.copy()
        y = 50 + self.lane * 100
        self.rect = self.image.get_rect(center = (1100, y))


    def update(self, game_window):
        game_window.blit(self.image, (self.rect.x, self.rect.y))


        all_vampires = sprite.Group()
        tile_color = WHITE
        for row in range(6):
           for column in range(11):
               draw.rect(BACKGROUND, tile_color, (WIDTH * column, HEIGHT * row, WIDTH, HEIGHT), 1)

        GAME_WINDOW.blit(BACKGROUND, (0,0))

-------------------------- --------------------

#Start Main Game Loop
game_running = True
#Game Loop
while game_running:

    for event in pygame.event.get():

        #Exit loop on quit
        if event.type == QUIT:
            game_running = False

   if randint(1, SPAWN_RATE) == 1:
       VampireSprite()

   for vampire in all_vampires:
       vampire.update(GAME_WINDOW)

   display.update()

pygame.quit()

1 Ответ

2 голосов
/ 14 января 2020

Код, кажется, содержит все правильные компоненты, за исключением того, что он немного перепутан.

Обычно, когда вы создаете спрайт, он имеет функцию __init__() - очевидно, для инициализации, и дополнительно update() функция. Функция update() обычно не рисует объект на дисплее / поверхности, но регулирует положение (то есть: sprite.rect) или изменяет «внешний вид» (изображение), используемый для спрайта, для рисования позже .

Спрайты обычно группируются в метко названную Sprite Group . Когда спрайты находятся в группе, один вызов group .update () вызовет функцию update() для каждого содержащегося спрайта. Это действительно удобно и хорошо работает.

Итак, настройка вашего Vampire Pizza Sprite:

class VampireSprite(sprite.Sprite):

    def __init__(self):
        super().__init__()
        self.speed = 2
        self.lane = randint(0, 4)
        self.image = VAMPIRE_PIZZA.copy()
        y = 50 + self.lane * 100
        self.rect = self.image.get_rect(center = (1100, y))

    def update(self):
        # TODO - do Vampire Pizzas Move?
        #     if so, update the self.rect
        pass

И это все, что нужно. Я удалил код рисования, он будет обработан группой спрайтов.

Итак, позже:

# Make a group of vampire sprites
all_vampires = sprite.Group()
all_vampires.add( VampireSprite() )   # Start with a single vampire

# Game Loop
game_running = True
while game_running:

    # handle events
    for event in pygame.event.get():
        #Exit loop on quit
        if event.type == QUIT:
            game_running = False

    # spawn some vampires, maybe
    if randint(1, SPAWN_RATE) == 1:
       all_vampires.add( VampireSprite() ) # add to the group

    # Update/move all vampire sprites
    all_vampires.update()                  # updates every sprite in group

    # repaint the screen
    GAME_WINDOW.blit(BACKGROUND, (0,0))
    # draw some columns(?)
    tile_color = WHITE
    for row in range(6):
       for column in range(11):
           draw.rect(GAME_WINDOW, tile_color, (WIDTH * column, HEIGHT * row, WIDTH, HEIGHT), 1)

    all_vampires.draw()                    # paints every sprite in group

    display.update()

pygame.quit()

Есть два вызова из группы all_vampires спрайтов - all_vampires.update() и all_vampires.draw()? Только с этими двумя вызовами все спрайты в группе перемещаются (настраиваются / что угодно) и отображаются на экране.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...