Pygame спрайт не будет обновляться после того, как я использую pygame.Surface () - PullRequest
0 голосов
/ 17 апреля 2020

Я делаю простой платформер, используя pygame, но я не могу понять, как обновить мой спрайт (который пока является только прямоугольником). Любая подсказка была бы по достоинству оценена.

Вот мой код:

class Player(pygame.sprite.Sprite):
def __init__(self):
    pygame.sprite.Sprite.__init__(self) 
    self.image = pygame.Surface((50, 50))
    self.image.fill(WHITE)
    self.rect = self.image.get_rect()
    self.rect.center = (WIDTH / 2, HEIGHT / 2)
    self.pos = vect(WIDTH / 2, HEIGHT / 2)
    self.vel = vect(0, 0)
    self.acc = vect(0, 0)



def update(self):
    self.acc = vect(0, 0)
    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        self.acc.x = -0.5
    if keys[pygame.K_RIGHT]:
        self.acc.y = 0.5
    self.vel += self.acc
    self.pos += self.vel + 0.5 * self.acc
    self.rect.center = self.pos



player = Player()
FPS = 40
RECT_WIDTH = 50
RECT_HEIGHT = 50
run = True



while run:
pygame.time.Clock().tick(FPS)

for event in pygame.event.get():
    if event.type == pygame.QUIT:
        run = False

screen.fill(LIGHT_PURPLE)

player.update()


pygame.display.flip()

Я не помещал все это как присваивания переменных цвета, но я почти уверен, что ошибка здесь

Ответы [ 2 ]

0 голосов
/ 17 апреля 2020

Как Большой Кахуна уже сказал , используйте группу, чтобы обновить и нарисовать все ваши спрайты.

Вот полный, работающий пример, основанный на вашем коде:

import pygame
pygame.init()

WHITE = pygame.Color('WHITE')
LIGHT_PURPLE = pygame.Color('PURPLE')
vect = pygame.Vector2

class Player(pygame.sprite.Sprite):
    def __init__(self, screen_r):
        pygame.sprite.Sprite.__init__(self) 
        self.image = pygame.Surface((50, 50))
        self.image.fill(WHITE)
        self.rect = self.image.get_rect()
        self.rect.center = screen_r.center
        self.pos = vect(self.rect.center)
        self.vel = vect(0, 0)
        self.acc = vect(0, 0)



    def update(self):
        self.acc = vect(0, 0)
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT]:
            self.acc.x = -0.5
        if keys[pygame.K_RIGHT]:
            self.acc.x = 0.5
        self.vel += self.acc
        self.pos += self.vel + 0.5 * self.acc
        self.rect.center = self.pos

screen = pygame.display.set_mode((800, 600))
screen_r = screen.get_rect()

player = Player(screen_r)
FPS = 60
RECT_WIDTH = 50
RECT_HEIGHT = 50
run = True


all_sprites = pygame.sprite.Group(player)

while run:
    pygame.time.Clock().tick(FPS)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    all_sprites.update()
    screen.fill(LIGHT_PURPLE)
    all_sprites.draw(screen)
    pygame.display.flip()
0 голосов
/ 17 апреля 2020

2 варианта:

A). Добавьте функцию рисования и нарисуйте спрайт-простое исправление

B). создать группу спрайтов и нарисовать все спрайты - хорошо, если используется много спрайтов

Функция рисования

 def update(self):
        self.acc = vect(0, 0)
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT]:
            self.acc.x = -0.5
        if keys[pygame.K_RIGHT]:
            self.acc.y = 0.5
        self.vel += self.acc
        self.pos += self.vel + 0.5 * self.acc
        self.rect.center = self.pos
        self.draw() # draw the sprite

    def draw(self):
        screen.blit(self.image,self.rect)

Группа спрайтов:

Sprites = pygame.sprite.Group()

player = Player()
Sprites.add(player)

, затем в l oop

Sprites.update() # calls the update function in every sprite
Sprites.draw(screen) # draws every sprite onto the screen
...