Проблемы генерации спрайт-изображения игрока с помощью pygame - PullRequest
1 голос
/ 12 января 2020

Я пытаюсь запустить следующий код Python Pygame из этого урока https://opensource.com/article/17/12/game-python-add-a-player. После исправления отступа, как я писал в этом вопросе Объект «Player» не имеет атрибута «rect ». Я попытался запустить приведенный ниже код python, а затем дерево файлов в локальной папке с именем images, как показано ниже. Но я не вижу hero.png в игре. Я также пробую Спрайт Pygame Player не появляется .

изображения папок:

stage.png: https://imgur.com/YyiEJ0q герой .png: https://opengameart.org/sites/default/files/spellun-sprite.png

Мой код:

import pygame  # load pygame keywords
import sys     # let  python use your file system
import os      # help python identify your OS

'''
Create class for player
'''

class Player(pygame.sprite.Sprite):
    def __init__(self):
      pygame.sprite.Sprite.__init__(self)
      self.images = []
      img = pygame.image.load(os.path.join('images','hero.png')).convert()
      self.images.append(img)
      self.image = self.images[0]
      self.rect.x = 40
      self.rect.y = 30
#cria a classe para o player

'''
Objects
'''

# put Python classes and functions here

'''
Setup
'''
worldx = 260
worldy = 220

fps   = 40  # frame rate
ani   = 4   # animation cycles
clock = pygame.time.Clock()
pygame.init()
#BUG REMOVIDO: BUG É ".convert()" da linha "backdrop = pygame.image.load(os.path.join('images','stage.png').convert())"
world    = pygame.display.set_mode([worldx,worldy])
backdrop = pygame.image.load(os.path.join('images','stage.png'))
backdropbox = world.get_rect()

BLUE  = (25,25,200)
BLACK = (23,23,23 )
WHITE = (254,254,254)

main = True

# put run-once code here

'''
Main Loop
'''

while main == True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit(); sys.exit()
            main = False

        if event.type == pygame.KEYDOWN:
            if event.key == ord('q'):
                pygame.quit()
                sys.exit()
                main = False
world.blit(backdrop, backdropbox)
# put game loop here

pygame.display.flip()
clock.tick(fps)

1 Ответ

1 голос
/ 12 января 2020

Вы должны добавить атрибут .rect к Player:

class Player(pygame.sprite.Sprite):
    def __init__(self):
      pygame.sprite.Sprite.__init__(self)
      self.images = []
      img = pygame.image.load(os.path.join('images','hero.png')).convert()
      self.images.append(img)
      self.image = self.images[0]
      self.rect = self.image.get_rect() # <----
      self.rect.x = 40
      self.rect.y = 30

Создать экземпляр Player. Создайте pygame.sprite.Group и add palyer:

player = Player()
all_sprites = pygame.sprite.Group()
all_sprites.add(player)

Используйте draw(), чтобы нарисовать все спрайты в группа. draw использует атрибуты спрайтов image и rect, чтобы нарисовать всех спрайтов в группе:

all_sprites.draw(world)

Уважать отступ :

while main == True:

    # handle events
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit(); sys.exit()
            main = False

        if event.type == pygame.KEYDOWN:
            if event.key == ord('q'):
                pygame.quit()
                sys.exit()
                main = False

    # draw background
    world.blit(backdrop, backdropbox)

    # draw scene
    all_sprites.draw(world)

    # update display
    pygame.display.flip()
    clock.tick(fps)
...