Escribir texto
Escribir texto con Pygame es relativamente pesado. Hay que dar los siguientes pasos:
- Escoger un tipo de letra y un tamaño
- Convertir un texto a imagen ("renderizarlo"), indicando qué texto concreto será, si queremos que los contornos estén suavizados ("antialias"), el color para el texto (a partir de sus componentes r,g,b) y el color de fondo (r,g,b)
- Preparar el rectángulo que contendrá esa imagen. Lo habitual es obtener detalles como el tamaño a partir de la propia imagen, usando "get_rect", pero luego fijar su posición con "left" y "top".
- Si queremos que el texto esté centrado, podemos conseguirlo si no damos valor a "left" y "top" sino a "centerx" y/o "centery".
Que se convertiría en algo como:
letra30 = pygame.font.SysFont("Arial", 30) imagenTextoPresent = letra30.render("Pulsa Espacio para jugar", True, (200,200,200), (0,0,0) ) rectanguloTextoPresent = imagenTextoPresent.get_rect() rectanguloTextoPresent.centerx = pantalla.get_rect().centerx rectanguloTextoPresent.centery = 520
Y sea nueva "imagen creada a partir del texto" la podríamos mostrar en cualquier punto del programa:
pantalla.blit(imagenTextoPresent, rectanguloTextoPresent)
El fuente completo quedaría:
# Mini-invaders, version 0.09 # (Escribir texto) # Parte de la intro a Pygame, por Nacho Cabanes import pygame from pygame.locals import * import random pygame.init() ancho = 800 alto = 600 cantidadMarcianos = 10 pantalla = pygame.display.set_mode( (ancho, alto) ) pygame.key.set_repeat(1,25) reloj = pygame.time.Clock() imagenNave = pygame.image.load("nave.png") rectanguloNave = imagenNave.get_rect() imagenUfo = pygame.image.load("ufo.png") rectanguloUfo = imagenUfo.get_rect() imagenMarciano = pygame.image.load("spaceinvader.png") rectangulosMarcianos = { } marcianosVisibles = { } velocidadesX = { } velocidadesY = { } imagenDisparo = pygame.image.load("disparo.png") rectanguloDisparo = imagenDisparo.get_rect() imagenPresent = pygame.image.load("invadersIntro.png") rectanguloPresent = imagenPresent.get_rect() rectanguloPresent.top = 60 rectanguloPresent.left = 80 letra30 = pygame.font.SysFont("Arial", 30) # Nuevo 0.09 imagenTextoPresent = letra30.render('Pulsa Espacio para jugar', # Nuevo 0.09 True, (200,200,200), (0,0,0) ) # Nuevo 0.09 rectanguloTextoPresent = imagenTextoPresent.get_rect() # Nuevo 0.09 rectanguloTextoPresent.centerx = pantalla.get_rect().centerx # Nuevo 0.09 rectanguloTextoPresent.centery = 520 # Nuevo 0.09 partidaEnMarcha = True while partidaEnMarcha: # ---- Presentacion ---- pantalla.fill( (0,0,0) ) pantalla.blit(imagenPresent, rectanguloPresent) pantalla.blit(imagenTextoPresent, rectanguloTextoPresent) # Nuevo 0.09 pygame.display.flip() entrarAlJuego = False while not entrarAlJuego: pygame.time.wait(100) for event in pygame.event.get(KEYUP): if event.key == K_SPACE: entrarAlJuego = True # ---- Comienzo de una sesion de juego ---- rectanguloNave.left = ancho/2 rectanguloNave.top = alto-50 rectanguloUfo.top = 20 for i in range(0,cantidadMarcianos+1): rectangulosMarcianos[i] = imagenMarciano.get_rect() rectangulosMarcianos[i].left = random.randrange(50,751) rectangulosMarcianos[i].top = random.randrange(10,301) marcianosVisibles[i] = True velocidadesX[i] = 3 velocidadesY[i] = 3 disparoActivo = False ufoVisible = True terminado = False while not terminado: # ---- Comprobar acciones del usuario ---- for event in pygame.event.get(): if event.type == pygame.QUIT: terminado = True partidaEnMarcha = False keys = pygame.key.get_pressed() if keys[K_LEFT]: rectanguloNave.left -= 8 if keys[K_RIGHT]: rectanguloNave.left += 8 if keys[K_SPACE] and not disparoActivo: disparoActivo = True rectanguloDisparo.left = rectanguloNave.left + 18 rectanguloDisparo.top = rectanguloNave.top - 25 # ---- Actualizar estado ---- for i in range(0,cantidadMarcianos+1): rectangulosMarcianos[i].left += velocidadesX[i] rectangulosMarcianos[i].top += velocidadesY[i] if rectangulosMarcianos[i].left < 0 or rectangulosMarcianos[i].right > ancho: velocidadesX[i] = -velocidadesX[i] if rectangulosMarcianos[i].top < 0 or rectangulosMarcianos[i].bottom > alto: velocidadesY[i] = -velocidadesY[i] rectanguloUfo.left += 2 if rectanguloUfo.right > ancho: rectanguloUfo.left = 0 if disparoActivo: rectanguloDisparo.top -= 6 if rectanguloDisparo.top <= 0: disparoActivo = False # ---- Comprobar colisiones ---- for i in range(0,cantidadMarcianos+1): if marcianosVisibles[i]: if rectanguloNave.colliderect( rectangulosMarcianos[i] ): terminado = True if disparoActivo: if rectanguloDisparo.colliderect( rectangulosMarcianos[i]) : marcianosVisibles[i] = False disparoActivo = False if disparoActivo: if rectanguloDisparo.colliderect( rectanguloUfo) : ufoVisible = False disparoActivo = False cantidadMarcianosVisibles = 0 for i in range(0,cantidadMarcianos+1): if marcianosVisibles[i]: cantidadMarcianosVisibles = cantidadMarcianosVisibles + 1 if not ufoVisible and cantidadMarcianosVisibles == 0: terminado = True # ---- Dibujar elementos en pantalla ---- pantalla.fill( (0,0,0) ) for i in range(0,cantidadMarcianos+1): if marcianosVisibles[i]: pantalla.blit(imagenMarciano, rectangulosMarcianos[i]) if ufoVisible: pantalla.blit(imagenUfo, rectanguloUfo) if disparoActivo: pantalla.blit(imagenDisparo, rectanguloDisparo) pantalla.blit(imagenNave, rectanguloNave) pygame.display.flip() # ---- Ralentizar hasta 40 fotogramas por segundo ---- reloj.tick(40) # ---- Final de partida ---- pygame.quit()
Y la apariencia sería: