Спрайт не работает / не отображается (Python / Pygame)

2
задан Kingsley 15 January 2019 в 22:01
поделиться

1 ответ

Я думаю, что реальная проблема в том, что код не добавляет playerSprite в all_sprites_list. Если спрайта нет в этом списке, обновление спрайта и вызовы рисования не включают его. Сначала я думал, что начальное положение спрайта может быть вне экрана, поэтому я параметризовал размеры экрана и поместил спрайт посередине.

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

Я очистил и реорганизовал код, кажется, он запускается, и нажатие влево / вправо перемещает коричневую рамку.

Я объединил оба файла, чтобы облегчить отладку, извинения.

import pygame, random

pygame.init()
BROWN     = (205,192,176)
DEEPBROWN = (139,131,120)
CL        = (156,102,31)
WHITE     = (255,255,255)

WINDOW_WIDTH=500
WINDOW_HEIGHT=500

# Setup the pyGame window
size = (WINDOW_WIDTH, WINDOW_HEIGHT)
screen = pygame.display.set_mode(size)
pygame.display.set_caption("Adventure")

class LittleMan (pygame.sprite.Sprite):

    def __init__(self, color, width, height):
        super().__init__()
        self.image = pygame.Surface([50, 75])
        self.image.fill(CL)
        self.image.set_colorkey(WHITE)
        self.rect = self.image.get_rect()
        self.rect.center = ( WINDOW_WIDTH//2 , WINDOW_HEIGHT//2 )

    def moveRight(self, pixels):
        self.rect.x += pixels

    def moveLeft(self, pixels):
        self.rect.x -= pixels

# Create the player sprite
playerSprite = LittleMan(CL, 200, 300)

# Add user sprite into PyGame sprites list
all_sprites_list = pygame.sprite.Group()
all_sprites_list.add(playerSprite);

clock = pygame.time.Clock()
carryOn = True
while carryOn:

    # Handle user input
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            carryOn = False

        if event.type==pygame.KEYDOWN:
            if event.key==pygame.K_x: #Pressing the x Key will quit the game
                carryOn=False
            keys = pygame.key.get_pressed()
            if keys[pygame.K_LEFT]:
                playerSprite.moveLeft(5)
            if keys[pygame.K_RIGHT]:
                playerSprite.moveRight(5)

    # Update and Reapint the screen
    screen.fill(BROWN)
    pygame.draw.rect(screen, DEEPBROWN, [55, 250, 900, 70],0)
    all_sprites_list.update()
    all_sprites_list.draw(screen)
    pygame.display.flip()
    clock.tick(60)

Класс LittleMan не включает функцию update(), которую обычно вызывал бы all_sprites_list.update(). Я полагаю, вам просто не нужна эта часть.

РЕДАКТИРОВАТЬ: Дополнительные примечания к функции обновления спрайта () ~

Функция спрайта update() вызывается pygame во время функции all_sprites_list.update(). Таким образом, это означает, что любой спрайт, добавленный в эту группу, будет автоматически обновляться. В идеале все спрайты имеют функцию обновления, которая обрабатывает внешний вид, положение и столкновения (и т. Д.) Спрайта.

Идея этой функции заключается в том, чтобы обновлять спрайт. Итак, у вас был спрайт, который двигался, эта функция рассчитала следующую позицию и установила спрайт self.rect. Или, возможно, этот спрайт анимирован - функция обновления установит для спрайта image следующий кадр анимации, основанный на времени.

Очевидно, что вся эта работа может быть выполнена вне функции обновления. Но он предоставляет простой и чистый механизм программирования для механики спрайтов.

0
ответ дан Kingsley 15 January 2019 в 22:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: