Pygame: как реализовать падающие буквы с верхней строки экрана?
Как сделать так, чтобы буквы падали по одному в случайной точки верхней строки экрана.
код:
import pygame
from random import choice, randrange, randint
import sys, time
from pygame.locals import *
from pygame.sprite import Sprite
# Константы
RES = WIDTH, HEIGHT = 1600, 900
FONT_SIZE = 40
FPS = 60
SPEED = 5
X = randint(0, WIDTH)
Y = 0
# классы\функции
class Letter():
def __init__(self, screen):
self.screen = screen
english = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q',
'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
c = choice(english)
# self.ascii = symbol
font = pygame.font.SysFont('ms mincho', FONT_SIZE, bold=True)
if c == 'a':
font_render_c = font.render('a', True, (128, 128, 128))
self.screen.blit(font_render_c, (X, Y))
elif c== 'b':
font_render_c = font.render('b', True, (128, 128, 128))
self.screen.blit(font_render_c, (X, Y))
elif c== 'c':
font_render_c = font.render('c', True, (128, 128, 128))
self.screen.blit(font_render_c, (X, Y))
elif c== 'e':
font_render_c = font.render('e', True, (128, 128, 128))
self.screen.blit(font_render_c, (X, Y))
elif c== 'f':
font_render_c = font.render('f', True, (128, 128, 128))
self.screen.blit(font_render_c, (X, Y))
elif c== 'g':
font_render_c = font.render('g', True, (128, 128, 128))
self.screen.blit(font_render_c, (X, Y))
pygame.init()
screen = pygame.display.set_mode(RES)
clock = pygame.time.Clock()
while True:
# Задержка
clock.tick(FPS)
# Цикл обработки событий
for i in pygame.event.get():
if i.type == pygame.QUIT:
sys.exit()
Y = Y + SPEED
if Y > HEIGHT:
X = randrange(0, WIDTH)
Y = -25
Letter(screen)
pygame.display.flip()
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Попробуйте так:
import os
import pygame as pg
from random import choice, randrange
class Symbol:
def __init__(self, x, y, speed):
self.x, self.y = x, y
self.speed = speed
self.value = choice(green_katakana)
self.interval = randrange(5, 30)
def draw(self, color):
frames = pg.time.get_ticks()
if not frames % self.interval:
self.value = choice(green_katakana if color == 'green'
else lightgreen_katakana)
self.y = self.y + self.speed if self.y < HEIGHT else -FONT_SIZE
surface.blit(self.value, (self.x, self.y))
class SymbolColumn:
def __init__(self, x, y):
self.column_height = randrange(8, 24)
self.speed = randrange(3, 7)
self.symbols = [
Symbol(x, i, self.speed) for i in
range(y, y - FONT_SIZE * self.column_height, -FONT_SIZE)
]
def draw(self):
[symbol.draw('green') if i else symbol.draw('lightgreen')
for i, symbol in enumerate(self.symbols)]
os.environ['SDL_VIDEO_CENTERED'] = '1'
RES = WIDTH, HEIGHT = 1600, 900
FONT_SIZE = 40
alpha_value = 0
pg.init()
screen = pg.display.set_mode(RES)
surface = pg.Surface(RES)
surface.set_alpha(alpha_value)
clock = pg.time.Clock()
katakana = [chr(int('0x30a0', 16) + i) for i in range(96)]
font = pg.font.Font('font/ms mincho.ttf', FONT_SIZE, bold=True) #! MS Mincho.ttf
green_katakana = [font.render(char, True, (40, randrange(160, 256), 40))
for char in katakana]
lightgreen_katakana = [font.render(char, True, pg.Color('lightgreen'))
for char in katakana]
symbol_columns = [SymbolColumn(x, randrange(-HEIGHT, 0))
for x in range(0, WIDTH, FONT_SIZE)]
while True:
screen.blit(surface, (0, 0))
surface.fill(pg.Color('black'))
[symbol_column.draw() for symbol_column in symbol_columns]
if not pg.time.get_ticks() % 20 and alpha_value < 170:
alpha_value += 6
surface.set_alpha(alpha_value)
[exit() for i in pg.event.get() if i.type == pg.QUIT]
pg.display.flip()
clock.tick(60)
