Pygame: гладкое изображение - PullRequest
       30

Pygame: гладкое изображение

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

Может кто-нибудь помочь мне в этом?:

Я пытаюсь сделать заголовок, который плавно отображается на экране пользователя:

def image(name,x,y,u):
   screen.blit(name,(x,y))
   if u = 1
      pygame.display.update()

Window == 'main'
While windows = 'main':
   image(background,0,0)
   image(title, 640, 120)
   pygame.display.update()

Но текстовые сообщения появляются неожиданно, а не так, как хотелось бы ...

Ответы [ 2 ]

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

Вы хотите использовать прозрачность, а pygame использует три различных типа :

В pygame поддерживаются три типа прозрачности: цветовые клавиши, поверхностные альфа и пиксельные альфа.Поверхностные альфа можно смешивать с цветными клавишами, но изображение с альфа-разрешением на пиксель не может использовать другие режимы.Прозрачность Colorkey делает одно значение цвета прозрачным.Любые пиксели, соответствующие цветовой клавише, не будут нарисованыАльфа-значение поверхности - это одно значение, которое изменяет прозрачность всего изображения.Альфа-поверхность 255 непрозрачна, а значение 0 полностью прозрачно.

Альфа-данные на пиксель отличаются, поскольку они хранят значение прозрачности для каждого пикселя.Это учитывает самые точные эффекты прозрачности, но это также самый медленный.Для каждого пикселя альфа нельзя смешивать с альфа-поверхностью и цветными клавишами.

Так что давайте используем colorkey, чтобы создать прозрачный Surface и добавим к нему текст, а затем используем альфа-поверхность, чтобы создать эффект затухания.позвонив по номеру set_alpha и Surface:

import pygame

def main():
    screen = pygame.display.set_mode((300, 100))
    FONT = pygame.font.SysFont(None, 64)
    text = FONT.render('Hello World', False, pygame.Color('darkorange'))
    surf = pygame.Surface(text.get_rect().size)
    surf.set_colorkey((1,1,1))
    surf.fill((1,1,1))
    surf.blit(text, (0, 0))
    clock = pygame.time.Clock()
    alpha = 0
    while True:
        for e in pygame.event.get():
            if e.type == pygame.QUIT:
                return

        alpha = (alpha + 1) % 256
        surf.set_alpha(alpha)

        screen.fill(pygame.Color('dodgerblue'))
        screen.blit(surf, (20, 20))
        clock.tick(120)
        print(alpha)
        pygame.display.update()

if __name__ == '__main__':
    pygame.init()
    main()

enter image description here

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

pygame.Surface.blit() уже делает то, что вы хотите.Он наклоняет поверхность к другой поверхности, в зависимости от ее альфа-канала.Все, что вам нужно сделать, это установить альфа-канал с помощью pygame.Surface.set_alpha():

image.set_alpha(min(1.0,alpha)*255)

Написать функцию, которая «смешивает» поверхность с экраном.В следующей функции BlendSurface параметр alpha является значением непрозрачности поверхности в диапазоне [0, 1].0.0 создаст полностью прозрачную (невидимую) поверхность.1.0 создаст полностью непрозрачную поверхность:

def BlendSurface(image, pos, alpha):
    image.set_alpha(min(1.0,alpha)*255)
    screen.blit(image, pos)

См. Простую демонстрационную программу:

import pygame
import pygame.font
pygame.init()

BLUE    = (  0,   0, 255)
YELLOW  = (255, 255,   0)

size = (800,600)
screen = pygame.display.set_mode(size)

def BlendSurface(image, pos, alpha):
    image.set_alpha(min(1.0,alpha)*255)
    screen.blit(blendImage, pos)

clock = pygame.time.Clock()

font = pygame.font.SysFont('Times New Roman', 100)
text = font.render('blend text', False, YELLOW)

i = 0
done = False
while not done:
    clock.tick(60)
    i += 1
    if i > 200:
        i = 0

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True

    screen.fill(BLUE)
    BlendSurface(text, (100, 100), i/200) 
    pygame.display.flip()
...