Top.Mail.Ru
Ответы
Аватар пользователя
Аватар пользователя
Аватар пользователя
Аватар пользователя
Программирование
+4

Плавное затухание и появление в pygame

Я начинающий программист, изучил базу python и решил для практики написать несложную игру на pygame, а заодно подучиться. Так вот возникла проблема. Я создал главное меню с кнопками и первую сцену моей игры. При нажатии кнопки в меню происходит плавное затухание fade out, а затем плавное появление fade in. Проблема заключается в том, что после fade out'а на пол секунды мелькает сцена, а уже потом воспроизводиться fade in. Я уже отчаялся и просил помощи у чата gpt, но он не помог(зато оставил комментарии и немного усложнил код). Как исправить эту проблему?

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
 def fade_out(draw_function): 
    fade_surface = pygame.Surface((wid, hei)) 
    fade_surface.fill((0, 0, 0)) 
 
    # Очищаем экран перед началом fade-out 
    screen.fill((0, 0, 0)) 
 
    # Плавное затемнение сцены 
    for alpha in range(0, 255, 10):  # Изменяем шаг для более плавной анимации 
        if draw_function: 
            draw_function()  # Отрисовываем текущую сцену (но только один раз за цикл) 
 
        fade_surface.set_alpha(alpha) 
        screen.blit(fade_surface, (0, 0))  # Добавляем затемняющий слой 
        pygame.display.update()  # Обновляем экран после наложения fade-эффекта 
        pygame.time.delay(20)  # Увеличиваем задержку для большей плавности 
 
 
def fade_in(draw_function): 
    fade_surface = pygame.Surface((wid, hei)) 
    fade_surface.fill((0, 0, 0)) 
 
    # Плавное проявление новой сцены 
    for alpha in range(255, -1, -10): 
        if draw_function: 
            draw_function()  # Отрисовываем новую сцену (только один раз за цикл) 
 
        fade_surface.set_alpha(alpha) 
        screen.blit(fade_surface, (0, 0))  # Уменьшаем прозрачность fade-слоя 
        pygame.display.update()  # Обновляем экран после наложения fade-эффекта 
        pygame.time.delay(20)  # Увеличиваем задержку для большей плавности 
 
 
def process_fade(): 
    global current_scene, next_scene, fading, in_menu 
 
    if fading and not in_menu: 
        # Плавное затемнение текущей сцены 
        fade_out(lambda: current_scene() if callable(current_scene) else None) 
 
        # Переключение на следующую сцену только после завершения fade-out 
        switch_scene(next_scene) 
 
        # Плавное проявление новой сцены 
        fade_in(lambda: current_scene() if callable(current_scene) else None) 
 
        fading = False  # Остановка процесса плавного перехода 
 
    elif not fading and current_scene:  # Отрисовка текущей сцены, если нет анимации fade 
        current_scene() 
         
По дате
По рейтингу
Аватар пользователя
Мастер
9мес

Проблема в том, что после завершения эффекта затухания (`fade_out`), происходит переключение сцены, но новая сцена отрисовывается на мгновение перед тем, как начнётся эффект появления (`fade_in`). Чтобы исправить это, нужно сделать так, чтобы новая сцена не отрисовывалась сразу после переключения, а только через `fade_in`.

Попробуй следующий подход: обнови экран только в цикле `fade_in`, а не сразу после `fade_out`.

Вот исправленный фрагмент:

def fade_out(draw_function):
fade_surface = pygame.Surface((wid, hei))
fade_surface.fill((0, 0, 0))

# Плавное затемнение сцены
for alpha in range(0, 255, 10):
if draw_function:
draw_function() # Отрисовываем текущую сцену

fade_surface.set_alpha(alpha)
screen.blit(fade_surface, (0, 0))
pygame.display.update()
pygame.time.delay(20)


def fade_in(draw_function):
fade_surface = pygame.Surface((wid, hei))
fade_surface.fill((0, 0, 0))

# Плавное проявление новой сцены
for alpha in range(255, -1, -10):
if draw_function:
draw_function() # Отрисовываем новую сцену

fade_surface.set_alpha(alpha)
screen.blit(fade_surface, (0, 0))
pygame.display.update()
pygame.time.delay(20)


def process_fade():
global current_scene, next_scene, fading, in_menu

if fading and not in_menu:
# Плавное затемнение текущей сцены
fade_out(lambda: current_scene() if callable(current_scene) else None)

# Переключение сцены, но без её отрисовки
switch_scene(next_scene)

# Плавное проявление новой сцены
fade_in(lambda: current_scene() if callable(current_scene) else None)

fading = False # Остановка процесса плавного перехода

Теперь после `fade_out` сцена переключается, но её отрисовка начнётся только с `fade_in`.

Аватар пользователя
Ученик
9мес

777778910182719910101917777+++++