Bienvenidos un día más al curso de Python. En este capítulo continuaremos con la creación de nuestro primer videojuego con la librería Pygame. En el capítulo anterior ya fuimos capaces de cargar una imagen de fondo y un “sprite”. Hoy os enseñaremos a mover el “sprite” por la ventana. Así que pongámonos manos a la obra.
Moviendo la imagen
Como os hemos comentado, vamos a hacer que “tux” se mueva por la pantalla. En este caso lo moveremos hacia la izquierda de la ventana debido a que nuestro «sprite» de «tux» lo tenemos situado en la parte derecha de la pantalla. Para moverlo bastará con ir restando uno a la posición del eje X dentro del bucle principal de la aplicación. El código quedaría del siguiente modo:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# ---------------------------
# Importacion de los módulos
# ---------------------------
import pygame
from pygame.locals import *
import sys
# -----------
# Constantes
# -----------
SCREEN_WIDTH = 640
SCREEN_HEIGHT = 480
# ------------------------------
# Clases y Funciones utilizadas
# ------------------------------
# ------------------------------
# Funcion principal del juego
# ------------------------------
def main():
pygame.init()
# creamos la ventana y le indicamos un titulo:
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("Mi primer juego")
# cargamos el fondo y una imagen (se crea objetos "Surface")
fondo = pygame.image.load("fondo.jpg").convert()
tux = pygame.image.load("tux.png").convert_alpha()
tux_pos_x = 550
tux_pos_y = 200
# Indicamos la posicion de las "Surface" sobre la ventana
screen.blit(tux, (tux_pos_x, tux_pos_y))
screen.blit(fondo, (0, 0))
# se muestran lo cambios en pantalla
pygame.display.flip()
# el bucle principal del juego
while True:
# le restamos 1 a la coordenada x de tux
# asi se mueve un poquito a la izquierda
tux_pos_x = tux_pos_x - 1
screen.blit(tux, (tux_pos_x, tux_pos_y))
# se muestran lo cambios en pantalla
pygame.display.flip()
# Posibles entradas del teclado y mouse
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
if __name__ == "__main__":
main()
El resultado que obtendréis será el de la imagen moviéndose hacia la izquierda pero se quedará una especie de sombra a su derecha esto es debido a que no hemos refrescado la pantalla. Lo único que estamos haciendo es repintar a “tux” en una nueva posición, por eso deja un rastro. Tampoco hemos puesto un límite por lo que se estará moviendo de manera infinita y se saldrá de la pantalla.
Si se quisiera desplazar hacia la derecha tendríamos que ir sumando uno en vez de restarlo. Y si por el contrario lo que quisiéramos es subir o bajar nuestro «sprite» sería tan sencillo como restar uno a nuestro eje Y para subir y sumar uno para bajar.
Refresco/borrado de la pantalla
La solución más sencilla para eliminar ese «rastro» que ha dejado “tux” al moverse, es repintar toda la pantalla en cada ciclo del juego, esto quiere decir que dentro del bucle principal una vez que hayamos actualizado la posición de “tux”, le diremos al programa que repinte toda la pantalla usando la función “blit()” y “pygame.display.flip()”.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# ---------------------------
# Importacion de los módulos
# ---------------------------
import pygame
from pygame.locals import *
import sys
# -----------
# Constantes
# -----------
SCREEN_WIDTH = 640
SCREEN_HEIGHT = 480
# ------------------------------
# Clases y Funciones utilizadas
# ------------------------------
# ------------------------------
# Funcion principal del juego
# ------------------------------
def main():
pygame.init()
# creamos la ventana y le indicamos un titulo:
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("Mi primer juego")
# cargamos el fondo y una imagen (se crea objetos "Surface")
fondo = pygame.image.load("fondo.jpg").convert()
tux = pygame.image.load("tux.png").convert_alpha()
tux_pos_x = 550
tux_pos_y = 200
# Indicamos la posicion de las "Surface" sobre la ventana
screen.blit(tux, (tux_pos_x, tux_pos_y))
screen.blit(fondo, (0, 0))
# se muestran lo cambios en pantalla
pygame.display.flip()
# el bucle principal del juego
while True:
# le restamos 1 a la coordenada x de tux y comprobamos
# que no alcance el borde de la pantalla
tux_pos_x = tux_pos_x - 1
if tux_pos_x
tux_pos_x = 550
# Redibujamos todos los elementos de la pantalla
screen.blit(fondo, (0, 0))
screen.blit(tux, (tux_pos_x, tux_pos_y))
# se muestran lo cambios en pantalla
pygame.display.flip()
# Posibles entradas del teclado y mouse
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
if __name__ == "__main__":
main()
Habréis podido comprobar que después de actualizar la posición de “tux” comprobamos si la posición es menor que 1, ya que eso significa que nos vamos a salir de la ventana, para volver a dibujar a “tux” en el lado derecho de la ventana. De este modo, se crea el efecto óptico de que ha salido por el lado izquierdo y vuelve a entrar por el lado derecho de la ventana.
Hemos escogido la posición 550 ya que nuestro “sprite” mide 90 píxeles de ancho y si lo sumamos nos dará 640 píxeles, que es el ancho de la pantalla, por lo que nuestro «sprite» saldrá pegado al lado derecho de la ventana, por esta razón vemos a “tux” salir por la derecha.
Aquí lo dejamos por hoy para que podáis ir asimilando los nuevos conceptos que os hemos explicado, os invitamos como siempre a que vayáis probando todo lo aprendido hasta el momento. Intentar utilizar «sprites» y fondos de pantalla de distintos tamaños, y también cambiar el tamaño de la ventana.
En el próximo capítulo empezaremos a crear un videojuego de verdad, ya que en estos dos primeros capítulos hemos abordado lo básico. Recrearemos uno de los videojuegos mas importantes de la historia, ese juego es el «Pong».
Para todos los que se acaban de incorporar indicarles que tenemos un índice con todos los capítulos del curso, ya que nunca es tarde para empezar.