Some little changes to make the code more usable to get this result. Now you can omit the vertical position. To put an empty line, use two commas ,,

import pygame
def render_multiline(data):
"Shows a multiline string with text, y pos and color for each line separated by comma"
tc = []
for line in data.split("\n"):
if line != "":
text, height, color = line.split(",")
if height == " " or height == "":
height = 0
if color == " " or color == "":
color = "red"
else:
height = int(height)
tc.append([text, height, color])
# 2. Each list of the list above is send to write to render text
cnt = 0
for t, height, c in tc:
cnt += 30
# calls write passing the text, the vertical position and the color
for i in t.split("\n"):
if height == 0:
height = cnt
write(i, 200, height, color=c)
height += 30
"""
INSERT:
text, vertical position, color
1. you can omit the vertical position
2. To put a blank line use ,,
"""
TEXT1 = """*** ARKAGAME ***, , gold
A Game by Giovanni Gatto, , red
,,
pythonprogramming.altevista.org, , coral
Game vaguely inspired by classic games, , cyan
like breakout or Arkanoid, , cyan
,,
CHOOSE YOUR GAME, , green
1 - Monochromatic, , cyan
2 - Full color, , cyan
3 - Tiny breaks, , cyan
4 - Tiny version 2, , cyan
5 - Randomized Versions, , cyan
,,
Use the mouse to move the bar, , coral
,,
************ August 2020 - Genuary 2021 *************, , gray"""
pygame.init()
def write(text, x, y, color="Coral",):
"Returns a surface with a text in the center of the screen, at y coord."
surface_text = font1.render(text, 1, pygame.Color(color))
text_rect = surface_text.get_rect(center=(500 // 2, y))
screen.blit(surface_text, text_rect)
return surface_text
def mainloop():
"""Here's where all happens"""
global screen, clock, font1, font2
screen = pygame.display.set_mode((500, 600))
clock = pygame.time.Clock()
Font = pygame.font.SysFont
font1 = Font("Arial", 24)
font2 = Font("Arial", 20)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
exit()
render_multiline(TEXT1)
clock.tick(30)
pygame.display.update()
mainloop()
Splash page with particles
import pygame
import random
class Particles(pygame.sprite.Sprite):
"Creates particles starting from pos with a color"
def __init__(self, pos, direction, color, sparse=0, turn="on"):
super(Particles, self).__init__()
self.list_of_particles = []
self.pos = pos
self.color = color
self.direction = direction
self.sparse = sparse # generate particles not from the same starting point
# self.generate_particles()
group.append(self)
self.turn = turn # this makes the effect visible
def choose_directions(self):
"Makes particles go in every direction you want"
# Make the flow go down
if self.direction == "down":
self.direction = 1
elif self.direction == "up":
self.direction = -1
# Make the particles spread all directions
elif self.direction == "all":
self.direction = random.randint(-1, 1)
def generate_particles(self):
"List with position etc of particles"
if self.sparse == 1:
self.pos[0] = random.randint(0, 600)
self.choose_directions()
if random.randint(1, 30) == 1:
self.list_of_particles.append([
[self.pos[0], self.pos[1]],
[random.randint(0, 20) / 10 - 1, self.direction],
random.randint(4,6)])
# Moving the coordinates and size of self.list_of_particles
for particle in self.list_of_particles[:]:
particle[0][0] += particle[1][0]
particle[0][1] += particle[1][1]
particle[2] -= 0.005 # how fast circles shrinks
particle[1][1] += 0.01 # circles speed
# if particle[2] <= 0:
c1 = particle[2] < 0 or particle[0][1] > 900
c2 = particle[0][1] < 0 or particle[0][0] < 0 or particle[0][0] > 800
if c1 or c2:
self.list_of_particles.remove(particle)
# do not call draw from here: it slows down the frame rate
# self.draw()
return self.list_of_particles
# def draw(self):
# "Draws particles based on data in the self.list_of_particles"
# if self.turn == "on":
# for particle in self.list_of_particles:
# pygame.draw.circle(
# window2, (self.color),
# (round(particle[0][0]), round(particle[0][1])),
# round(particle[2]))
group = []
p1 = 1
# Some random colors
RED = (255, 0, 0)
GREEN = (0, 255, 0)
YELLOW = (255, 255, 0)
CYAN = (0, 255, 255)
BLUE = (0, 0, 255)
WHITE = (255, 255, 255)
GRAY = (255, 255, 244, 100)
GRAY1 = (240, 240, 220, 200)
GRAY2 = (200, 200, 244, 0)
GRAY3 = (220, 200, 220, 200)
# Creating the list with particles ready to be drawn
Particles([0, 0], direction="down", color=GRAY, sparse=1)
Particles([0, 0], direction="down", color=GRAY1, sparse=1)
Particles([0, 0], direction="down", color=GRAY2, sparse=1)
Particles([0, 0], direction="down", color=GRAY3, sparse=1)
def generate():
"Start drawing all circles on the screen"
for par in group:
particles = par.generate_particles()
draw(par, particles)
def draw(par, particles):
for particle in particles:
pygame.draw.circle(
window2, (par.color),
(round(particle[0][0]), round(particle[0][1])),
round(particle[2]))
def render_multiline(data):
"Shows a multiline string with text, y pos and color for each line separated by comma"
tc = []
for line in data.split("\n"):
if line != "":
text, height, color = line.split(",")
if height == " " or height == "":
height = 0
if color == " " or color == "":
color = "red"
else:
height = int(height)
tc.append([text, height, color])
# 2. Each list of the list above is send to write to render text
cnt = 0
for t, height, c in tc:
cnt += 30
# calls write passing the text, the vertical position and the color
for i in t.split("\n"):
if height == 0:
height = cnt
write(i, 200, height, color=c)
height += 30
"""
INSERT:
text, vertical position, color
1. you can omit the vertical position
2. To put a blank line use ,,
"""
TEXT1 = """*** ARKAGAME ***, , gold
A Game by Giovanni Gatto, , red
,,
pythonprogramming.altevista.org, , coral
Game vaguely inspired by classic games, , cyan
like breakout or Arkanoid, , cyan
,,
CHOOSE YOUR GAME, , green
1 - Monochromatic, , cyan
2 - Full color, , cyan
3 - Tiny breaks, , cyan
4 - Tiny version 2, , cyan
5 - Randomized Versions, , cyan
,,
Use the mouse to move the bar, , coral
,,
************ August 2020 - Genuary 2021 *************, , gray"""
pygame.init()
def write(text, x, y, color="Coral",):
"Returns a surface with a text in the center of the screen, at y coord."
surface_text = font1.render(text, 1, pygame.Color(color))
text_rect = surface_text.get_rect(center=(500 // 2, y))
screen.blit(surface_text, text_rect)
return surface_text
window2 = pygame.Surface((500, 600))
def mainloop():
"""Here's where all happens"""
global screen, clock, font1, font2
screen = pygame.display.set_mode((500, 600))
clock = pygame.time.Clock()
Font = pygame.font.SysFont
font1 = Font("Arial", 24)
font2 = Font("Arial", 20)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
exit()
window2.fill(0)
generate()
screen.blit(window2, (0, 0))
render_multiline(TEXT1)
clock.tick(60)
pygame.display.update()
mainloop()
This post is the fusion of 2 older posts
- post about font and splash screen in pygame
- post about particles in pygame
Github source code
For particles: https://github.com/formazione/pygame_particles
For game Arkanoid like for the splash page: https://github.com/formazione/arkapygame
You can download it also on itch.io. There are different versions of the game.
Subscribe to the newsletter for updates
Tkinter templatesTwitter: @pythonprogrammi - python_pygame
Claude's Games
1. Memory gameVideos
Speech recognition gamePygame's Platform Game





