Событие Pygame Key On Press, другое событие в ожидании - PullRequest
0 голосов
/ 18 февраля 2019

Я ищу плавные спрайтовые анимации с анимациями перехода между ними.вместо того, чтобы главный персонаж мигал влево или вправо, а затем выполняет анимацию движения, он выполняет еще одну анимацию поворота перед продолжением.

Итак, я хочу, чтобы событие KEYDOWN для Pygame выполняло задачу, затем я хочу, чтобы анимация прошла (Я думаю, что это 270 ~ миллисекунд, или 16 кадров при 60 кадрах в секунду), тогда я хочу, чтобы другая анимация воспроизводилась многократно, пока нажата кнопка, без повторения перехода снова и снова, что я сейчас и делаюполучил.соответствующий цикл здесь:

while Playing:
dt = Clock.tick()/1000
keys=pygame.key.get_pressed()


for event in pygame.event.get():

    if event.type == QUIT:
        pygame.quit()

if event.type == KEYDOWN:


    if keys[K_RIGHT]:
        walkerspritesheet = WalkerStandToSlow_Right_List
        walkerxlocation += walkermovespeed
        if Walker_Counter == 16:
            walkerspritesheet = WalkerSlow_Right_List

    if keys[K_LEFT]:
        walkerspritesheet = WalkerStandToSlow_Left_List
        walkerxlocation -= walkermovespeed
        if Walker_Counter == 16:
            walkerspritesheet = WalkerSlow_Left_List

Переменные XXXXX_List являются списками срезов листов спрайтов.Далее по главному циклу while он воспроизводит анимацию Walker, используя изображения, содержащиеся в листе WalkersPritesheet.Walker_Counter - это кадр из 60, в котором анимация.

Дайте мне знать, если я пропускаю любую необходимую информацию, спасибо.

1 Ответ

0 голосов
/ 20 февраля 2019

Я пытался создать минимальный пример.При нажатии клавиш со стрелками вправо или влево спрайт будет двигаться.Сначала спрайт изменится на светлый, затем на темный.Когда ключ отпущен, он вернется к своему первоначальному цвету.

Example animation

import pygame
pygame.init()

width = 320
height = 240
FPS = 30

clock = pygame.time.Clock()
screen = pygame.display.set_mode([width, height])

class Player(pygame.sprite.Sprite):
    def __init__(self, starting_position=(0,0)):
        pygame.sprite.Sprite.__init__(self)
        width, height = 10, 20
        self.color= pygame.Color("brown")
        self.image = pygame.Surface([width, height])
        self.image.fill(self.color)
        # Fetch the rectangle object that has the dimensions of the image
        self.rect = self.image.get_rect()
        #initialise position
        self.rect.center = starting_position
        self.velx = 0
        self.counter = 0

    def animate(self):
        if self.velx == 0:
            self.image.fill(self.color)  # reset to original image
        else:
            self.counter += 1  # increment counter
        if self.velx > 0:  # moving right
            if self.counter < 20:
                self.image.fill(pygame.Color("lightgreen"))
            else:
                self.image.fill(pygame.Color("darkgreen"))
        elif self.velx < 0:  # moving left
            if self.counter < 20:
                self.image.fill(pygame.Color("lightblue"))
            else:
                self.image.fill(pygame.Color("darkblue"))

    def stop(self):
        self.velx = 0
        self.counter = 0

    def move_left(self):
        self.velx -= 1

    def move_right(self):
        self.velx += 1        

    def update(self):
        self.animate()
        self.rect.x += self.velx
        # check bounds
        if not 0 < self.rect.x < (width - 20):
            self.rect.x -= self.velx  # out of bounds, undo movement

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

player = Player((50, 100))
done = False
# main loop
while not done:
    for event in pygame.event.get():            
        if event.type == pygame.QUIT:
            done = True
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                done = True
            elif event.key == pygame.K_LEFT:
                player.move_left()
            elif event.key == pygame.K_RIGHT:
                player.move_right()
        elif event.type == pygame.KEYUP:
            if event.key in (pygame.K_LEFT, pygame.K_RIGHT):
                player.stop()

    # update sprite(s)
    player.update()
    #redraw screen
    screen.fill(pygame.Color("black")) # use black background
    # draw sprite
    player.draw(screen)
    # update screen
    pygame.display.update()
    clock.tick(FPS)
pygame.quit()
quit()

Дайте мне знать, если у вас есть какие-либо вопросы.

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