Анимация дельфина [PYGAME] - PullRequest
0 голосов
/ 20 января 2019

Я пытаюсь оживить двух персонажей в моей игре. Я хочу, чтобы анимация воспроизводилась без нажатия какой-либо клавиши. Каждый урок, который я видел, требует, чтобы игрок нажимал клавишу для воспроизведения анимации. Как бы вы заставили дельфина быть анимированным, но по-прежнему работать с имеющимся у меня кодом? В настоящее время у меня установлен дельфин frame[0], поэтому он виден при запуске. Любая помощь приветствуется!

Изображения и Sound FX скачать: https://mega.nz/#F!7O5zRQDK!YQhrs_zavCvdSdAMwEXEIQ

Игра, на которой я базируюсь: https://www.youtube.com/watch?v=9jjy9PjbeiA&t=3s

import pygame
import random
import time
import os
os.environ['SDL_VIDEO_WINDOW_POS'] = "%d, %d" %(0, 20)
pygame.init()

SIZE = W, H = 400, 700
screen = pygame.display.set_mode(SIZE)
clock = pygame.time.Clock()

# colours
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
BACKGROUND = (94, 194, 222)
STRIPE = (60, 160, 190)
LANELINE = (255, 255, 255)

x1 = 30
x2 = 330
lane1 = 30
lane2 = 130
lane3 = 230
lane4 = 330
y = 530
width = 40
height = 64

toggle1 = 0
toggle2 = 0

target_x1 = 30
target_x2 = 330
vel_x = 10

def drawScene():
    screen.fill(BACKGROUND)
    pygame.draw.polygon(screen, STRIPE, ((200, 700), (300, 700), (400, 600), (400, 500)))
    pygame.draw.polygon(screen, STRIPE, ((0, 700), (100, 700), (400, 400), (400, 300)))
    pygame.draw.polygon(screen, STRIPE, ((0, 500), (0, 600), (400, 200), (400, 100)))
    pygame.draw.polygon(screen, STRIPE, ((0, 300), (0, 400), (400, 0), (300, 0)))
    pygame.draw.polygon(screen, STRIPE, ((0, 100), (0, 200), (200, 0), (100, 0)))
    pygame.draw.line(screen, LANELINE, (100, 0), (100, 700), 2)
    pygame.draw.line(screen, LANELINE, (200, 0), (200, 700), 4)
    pygame.draw.line(screen, LANELINE, (300, 0), (300, 700), 2)


dolphinSheet = pygame.image.load("dolphinSheet.png").convert()
cells = []
for n in range(6):
    dolphinW, dolphinH, = (31, 74)
    rect = pygame.Rect(n * dolphinW, 0, dolphinW, dolphinH)
    image = pygame.Surface(rect.size).convert()
    image.blit(dolphinSheet, (0, 0), rect)
    alpha = image.get_at((0, 0))
    image.set_colorkey(alpha)
    cells.append(image)


playerImg = cells[0]


# main loop
run = True
while run:
    clock.tick(60)

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

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_a:
                pygame.mixer.music.load('percussiveHit.mp3')
                pygame.mixer.music.play()
                toggle1 += 1
                if toggle1 % 2 == 1:
                    target_x1 += 100
                else:
                    target_x1 -= 100
            elif event.key == pygame.K_d:
                pygame.mixer.music.load('percussiveHit.mp3')
                pygame.mixer.music.play()
                toggle2 += 1
                if toggle2 % 2 == 1:
                    target_x2 -= 100
                else:
                    target_x2 += 100

    if x1 < target_x1:
        x1 = min(x1 + vel_x, target_x1)
    else:
        x1 = max(x1 - vel_x, target_x1)

    if x2 < target_x2:
        x2 = min(x2 + vel_x, target_x2)
    else:
        x2 = max(x2 - vel_x, target_x2)

    pygame.draw.rect(screen, RED, (x1, y, width, height))
    pygame.draw.rect(screen, RED, (x2, y, width, height))
    drawScene()
    # players
    screen.blit(playerImg, (x1 + 4, y - 5))
    screen.blit(playerImg, (x2 + 4, y - 5))
    pygame.display.update()

pygame.quit()

1 Ответ

0 голосов
/ 21 января 2019

Обновите изображение на основе значения миллисекунды в реальном времени, используя pygame.time.get_ticks(), которое возвращает количество миллисекунд с момента pygame.init().

Идея состоит в том, что код запоминает время, в течение которого кадр был изменен, а затемждет, пока не пройдет X секунд (playerImg_show_for ниже), прежде чем перейти к следующему изображению в наборе.

...

playerImg = cells[0]
playerImg_cell     = -1   # start at first cell
playerImg_shown_at = 0    # time when this frame (cell) was shown
playerImg_show_for = 200  # milliseconds


# main loop
run = True
while run:
    clock.tick(60)
    ms_now = pygame.time.get_ticks()  # milliseconds since start

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

    # ... handle keys, etc. removed for the sake of brevity

    pygame.draw.rect(screen, RED, (x1, y, width, height))
    pygame.draw.rect(screen, RED, (x2, y, width, height))
    drawScene()

    # players
    # If this frame of animation has been shown for long enough, then
    # switch to the next frame
    if ( ms_now - playerImg_shown_at > playerImg_show_for ):
        playerImg_cell += 1   # find the next cell, with wrap-around
        if ( playerImg_cell >= len( cells ) ):
            playerImg_cell = 0
        playerImg_shown_at = ms_now        # use new start time
        playerImg = cells[playerImg_cell]  # use new animation cell

    screen.blit(playerImg, (x1 + 4, y - 5))
    screen.blit(playerImg, (x2 + 4, y - 5))
    pygame.display.update()

pygame.quit()

animation demo

Конечно, это лучше подходит для использования в качестве объекта спрайта PyGame, и все это обрабатывается в функции update() спрайта.

...