Intro PygameCapitulo 3
Upcoming SlideShare
Loading in...5
×
 

Intro PygameCapitulo 3

on

  • 1,256 views

 

Statistics

Views

Total Views
1,256
Views on SlideShare
1,256
Embed Views
0

Actions

Likes
1
Downloads
67
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Intro PygameCapitulo 3 Document Transcript

  • 1. Curso de: Programación de Juegos con PyGame Por: Ricardo D. Quiroga – L2Radamanthys → l2radamanthys@gmail.com Programación de Juegos con PyGame Capitulo 3: Módulos: Event, Mouse y Draw1
  • 2. Curso de: Programación de Juegos con PyGame Por: Ricardo D. Quiroga – L2Radamanthys → l2radamanthys@gmail.comEventos en PyGame PyGame nos proporciona un modulo especifico para manejar e interactuar con dichoseventos, el manejo de los mismos los hace atraves de la implementación de una Cola deEventos. Algo importante a resaltar es que la cola de eventos no funcionara a menos que sehalla inicializado el modulo display y el de video. La cola de eventos es una lista de Objectos Event, y posee varios métodos paratrabajar con los eventos, ya sea desde consultar por si se lanzo un evento determinado,borrar dicho evento, extraerlo de la cola etc. Hay que notar que todos los eventos tienen untipo definido, los tipo de eventos mas comunes son:QUIT noneACTIVEEVENT gain, stateKEYDOWN unicode, key, modKEYUP key, modMOUSEMOTION pos, rel, buttonsMOUSEBUTTONUP pos, buttonMOUSEBUTTONDOWN pos, buttonJOYAXISMOTION joy, axis, valueJOYBALLMOTION joy, ball, relJOYHATMOTION joy, hat, valueJOYBUTTONUP joy, buttonJOYBUTTONDOWN joy, buttonVIDEORESIZE size, w, hVIDEOEXPOSE noneUSEREVENT code Aunque para obtener el estado de los dispositivos de entrada de una manera maslimpia es preferible acceder a ellos mediante los modulos encargados de manejarlos en vesde estar accediendo a la cola de eventos, si usa este método, recuerde que pygame requierealguna forma de comunicación con el sistema de ventanas y otras partes del sistema. Paramantener a pygame en coherencia con el sistema necesita llamar a pygame.event.pumpperiódicamente, usualmente una vez por ciclo del bucle de juego. La cola de eventos ofrece una forma de filtro simple. Esto puede ayudar a mejorar elrendimiento bloqueando ciertos tipos de eventos de la cola, use las funcionespygame.event.set_allowed() y pygame.event.set_blocked() para trabajar con este filtrado.Por defecto todos los eventos están permitidos.Nota: Los Controles del Joystick no emitiran ningún evento a menos que estos esténinicializado.Event Un objecto de tipo Evento contiene un tipo de evento y un conjunto de miembros, oatributos, de solo lectura. El objeto Evento no contiene métodos, solo información. Estosobjetos se obtienen desde la cola de eventos. E incluso puede crear sus propios eventos conuna llamada a pygame.event.Event().pygame.event.Event(type, dict): return Eventpygame.event.Event(type, * * attributes): return Event2
  • 3. Curso de: Programación de Juegos con PyGame Por: Ricardo D. Quiroga – L2Radamanthys → l2radamanthys@gmail.com Genera un nuevo evento a partir del tipo de evento dado. El evento se construye conlos valores y atributos dados. Los atributos pueden venir desde un argumento diccionario, ocomo cadenas claves de un diccionario. Todos los objetos Event contienen un identificador de tipo en el atributo Event.type.Usted puede obtener acceso a todos los atributos del evento a través el método Event.dict.Todas las otras búsquedas de atributos pasarán a través de los valores de diccionario delevento. Ademas Su programa debe seguir ciertos pasos para evitar que la cola de eventos sesobrepase del límite. Si el programa no limpia o elimina los eventos de la cola de eventos enintervalos regulares, esta podría desbordarse. Se lanzará una excepción si la cola desborda.Pump Normalmente durante cada bucle o ciclo de juego se deve hacer alguna clase dellamada a la cola de eventos para poder permitirle a PyGame interactuar con el SistemaOperativo, ya que hay varias tareas importantes que PyGame internamente devenrealizarse , por ejemplo: La ventana principal podría necesitar responderle al sistema o serre-dibujada. Si usted no consulta la cola de eventos por mucho tiempo, el sistema podríainterpretar que su programa está inactivo o que hubo un error. Esta funcion deja que pygame se encargue internamente de la cola de eventos, lamisma no es necesaria si usted maneja los eventos a traves de otras funciones del modulopygame.event.sintaxis:pygame.event.pump(): return NoneGet Permite obtener todos los eventos de la cola de eventos ademas de eliminarlos de lacola. opcionalmente se puede pasar como parametro el tipo o listado de tipo de eventosaunque hay que tener cuidado al extraer un solo tipo o grupo de eventos ya queeventualmente podria haber un desbordamiento en la cola de eventos.sintaxis:pygame.event.get(): return Eventlistpygame.event.get(type): return Eventlistpygame.event.get(typelist): return EventlistPoll Permite obtener un solo evento de la cola, al igual que con Get el evento obtenido eseliminado de la cola de eventos, su sintaxis es:pygame.event.poll(): return Event3
  • 4. Curso de: Programación de Juegos con PyGame Por: Ricardo D. Quiroga – L2Radamanthys → l2radamanthys@gmail.comWait Este metodo coloca al programa en espera (lo duerme) hasta que se genere un nuevoevento, si es que la cola de eventos esta vacia.sintaxis:pygame.event.wait(): return EventPeek Consulta si un tipo especifico de evento esta esperando en la cola de eventos, si sepasa una lista de eventos retornara True si hay alguno de esos eventos esperando en la cola.sintaxis:pygame.event.peek(type): return boolpygame.event.peek(typelist): return boolClear Sirve para Limpiar la cola de evento, opcionalmente se puede pasar el tipo o la listacon los tipo de eventos que se desean borrar de la cola de eventos.sintaxis:pygame.event.clear(): return Nonepygame.event.clear(type): return Nonepygame.event.clear(typelist): return NoneSet_blocked y Set_allowed El primero permite escluir un tipo de evento, o listados de tipos de eventos para queno aparescan en la cola, el segundo tiene efecto inverso y permite incluir un tipo de evento ala cola.Nota: por defecto todos los eventos podran ser colocados en la cola de eventos.sintaxis:pygame.event.set_blocked(type): return Nonepygame.event.set_blocked(typelist): return Nonepygame.event.set_blocked(None): return Nonepygame.event.set_allowed(type): return Nonepygame.event.set_allowed(typelist): return Nonepygame.event.set_allowed(None): return None4
  • 5. Curso de: Programación de Juegos con PyGame Por: Ricardo D. Quiroga – L2Radamanthys → l2radamanthys@gmail.comGet_blocked permite consultar si un tipo de evento esta bloqueado, su sintaxis es:pygame.event.get_blocked(type): return boolSet_grab Permite controlar la posibilidad, de compartir o no los dispositivos de entrada, porejemplo cuando ejecutamos nuestro programa en modo ventana este comparte losdispositivos con otras aplicaciones que esten selecionadas, si el programa llama aset_grab(True) este bloqueara todos los dispositivos de entrada. S recomienda usar concuidado este metodo ya que imposibilita al usuario realizar otra tarea en el sistema.sintaxispygame.event.set_grab(bool): return NoneGet_grab Consulta si el programa está compartiendo los dispositivos en entrada, retornara Truecuando los eventos de entrada son exclusivos de esta aplicación. Usepygame.event.set_grab() para controlar este estado.sintaxispygame.event.get_grab(): return boolPost Permite colocar manualmente un evento al final de la cola de eventos, estos eventosseran leidos mas tarde que los eventos previamente existentes en la cola, se utilizanormalmente para colocar eventos de tipo USEREVENT aunque es posible agregar eventos decualquier tipo:sintaxispygame.event.post(Event): return NoneConcluciones Aunque PyGame proporciona un modulo para el manejo de eventos, este esraramente es usado explicitamente para manejar la cola de eventos normalmente solobastara con agregar las siguientes lineas dentro del bucle de principal del juego paraprocesar todos los eventos, ya que posiblemente el unico evento en particular que nos ha deinteresar sera cuando se genere un evento QUIT osea que se pida finalizar la ejecucion delprograma, por que al manejo de los dispositivos de entrada lo haremos mediantes losmodulos que nos ofrece PyGame:5
  • 6. Curso de: Programación de Juegos con PyGame Por: Ricardo D. Quiroga – L2Radamanthys → l2radamanthys@gmail.comfor evento in pygame.event.get(): if evento.type == pygame.QUIT: #terminar el bucle de juego y salir return Otra posible variacion es que normalmente tambien nos interese capturar cuando seprecione la tecla Escape salir automaticamente del juego:for evento in pygame.event.get(): if evento.type == pygame.QUIT or ((evento.type == KEYDOWN) and (event.key == K_ESCAPE)): #terminar el bucle de juego y salir returnControl del Mouse Las funciones de este módulo se pueden usar para obtener el estado actual delmouse. Estas funciones también pueden modificar el tipo de cursor del sistema. Cuando sedefine el modo de video, la cola de eventos comenzará a recibir eventos de mouse. Losbotones del mouse generan los eventos:pygame.MOUSEBUTTONDOWNpygame.MOUSEBUTTONUP Estos eventos contienen un atributo button que representa el botón que se hapulsado. La rueda del mouse generará eventos pygame.MOUSEBUTTONDOWN, el atributobutton será 4 si la rueda gira hacia arriba y 5 cuando la rueda gire hacia abajo. Se generaráel evento pygame.MOUSEMOTION en cualquier momento que se mueva el mouse. Elmovimiento de mouse se divide en pequeños y precisos eventos MOUSEMOTION. Loseventos de movimiento que no se eliminan de la cola de eventos apropiadamente son larazón principal de que la cola de eventos se llene.Listado de MetodosAca abajo enlisto todos los metodos que nos brinda PyGame para manejar el mouse, no hagouna explicacion detallada de cada uno de los metodos por considerarlo imnecesario ya que lamayoria de ellos y su uso se explican por si solos.pygame.mouse.get_pressed(): return (button1, button2, button3)Permite obtener el estado de todos los botones del Mousepygame.mouse.get_pos(): return (x, y)Obtiene la posicion actual del cursor dentro de la ventana.pygame.mouse.get_rel(): return (x, y)Obtiene la distancia de movimiento del mouse, desde la llamada previa del mismo.pygame.mouse.set_pos([x, y]): return NoneDefine la posicion antual del mouse dentro de la ventanapygame.mouse.set_visible(bool): return boolMuestra o Oculta el cursor del mouse6
  • 7. Curso de: Programación de Juegos con PyGame Por: Ricardo D. Quiroga – L2Radamanthys → l2radamanthys@gmail.compygame.mouse.get_focused(): return boolRetorna True si la ventana tiene Foco y esta reciviendo eventos del mousepygame.mouse.set_cursor(size, hotspot, xormasks, andmasks): return None Permitedefinir la imagen del cursor del Mouse, existen cursores predefinidos, que se pueden usarpara cambiar la imagen del cursor, ellos son:-pygame.cursors.arrow-pygame.cursors.diamond-pygame.cursors.broken_x-pygame.cursors.tri_left-pygame.cursors.tri_rightpygame.mouse.get_cursor(): return (size, hotspot, xormasks, andmasks)Obtiene la imagen actual del cursor. Aqui dejo un pequeño ejemplo que lo que hara es cambiar la imagen del cursos cadaves que el usuario haga click en la ventana de PyGame, paso muestro lo sencillo que esmanejar el cursor en PyGame:#!/usr/bin/env python# -*- coding: utf-8 -*-""" Descripcion: Ejemplo canbia el cursor del mouse cada ves que se hace click sobre la ventana."""import pygamefrom pygame.locals import *#Datos de PantallaANCHO = 400ALTO = 400RESOLUCION = (ANCHO, ALTO)def main(): pygame.init() #inicializo pygame #defino el tamaño de la ventana y la variable que hara referencia screen = pygame.display.set_mode(RESOLUCION) reloj = pygame.time.Clock() #temporizador para el juego #coloque aqui sus variables cursores = [ #lista con todos los cursores por defecto pygame.cursors.arrow, pygame.cursors.diamond, pygame.cursors.broken_x, pygame.cursors.tri_left, pygame.cursors.tri_right ]7
  • 8. Curso de: Programación de Juegos con PyGame Por: Ricardo D. Quiroga – L2Radamanthys → l2radamanthys@gmail.com indice = 0 #identificador para el array de cursores loop = True while loop: # escriba aca el codigo del juego screen.fill((255,255,255)) #pinto la pantalla de blanco #redusco la velocidad de actualizacion de pantalla a 10 cuadros #o frames por segundo para que el efecto se note reloj.tick(10) #retorna el estado de los botones btns = pygame.mouse.get_pressed() #si se preciono el boton izquierdo incremento el indice if btns[0]: indice += 1 #si se preciono el boton derecho decremento el indice elif btns[2]: indice -= 1 #controlo que la variable indice no se salga de rango if indice < 0: indice = 0 elif indice >= len(cursores): indice = len(cursores) - 1 #defino el cursor actual pygame.mouse.set_cursor(*cursores[indice]) #actualizo la pantalla pygame.display.flip() #leo todos los eventos en busqueda de un evento QUIT for evento in pygame.event.get(): if evento.type == pygame.QUIT or ((evento.type == KEYDOWN) and (event.key == K_ESCAPE)): #terminar el bucle de juego y salir loop = Falseif __name__ == __main__: main() Bueno como se ve el manejo del cursor es muy sencillo, y no requiere mucho esfuerzoel manejo del mismo. Sobre el codigo creo que este esta muy bien documentado y se explicapor si solo ademas casi todos los modulos que se utilizan en el fueron explicados en sumomento, solo puede que tenga una duda con la tercera linea de la funcion main:reloj = pygame.time.Clock() Bueno por el momento solo dire que este objecto funciona como temporizador ypermite que el juego se ejecute a la misma velocidad en todos los ordenadores (bueno todoslos ordenadores o PC donde corra Python y PyGame no creo que nadie tenga u n 386 o unaComodore usando para programar juegos :P). Sobre los cursores que se pueden usar, PyGame solo maneja cursores en Blanco y8
  • 9. Curso de: Programación de Juegos con PyGame Por: Ricardo D. Quiroga – L2Radamanthys → l2radamanthys@gmail.comNegro y probee y probee un modulo llamado pygame.cursors para cargarlos desde unXBM, si desean saber mas acerca de ese modulo pueden mirar la documentacion de PyGamesu uso es sencillo y no requiere mucho esfuerzo ademas mas adelante veremos comosubsanar el problema de solo poder usar cursores en Blanco y Negro.Figuras Basicas Al igual que la mayoria de las librerias graficas, PyGame trae consigo un conjunto demétodos para el dibujado de figuras basicas, que son lineas rectangulos, circulos, arcos, etc. Todas la funciones requieren como primer argumento un objecto Surface, que es lasuperficie donde se dibujara la figura, el segundo argumento el el color el cual puede serpasado mediante un objecto color o una tupla que represente un color. Otro atributo que casitodas tienen es el atributo width o ancho, que se refiere al ancho de la linea si el valor dewidth es 0, pygame dibujara una figura rellena con ese color. Estas funciones bloquearan temporalmente la superficie donde están operante. Asíque muchas llamadas de dibujo se pueden acelerar bloqueando y desbloqueando lasuperficie donde se trabaja antes y después de llamar a las funciones de dibujo.Rectdibuja una figura rectangular, el parametro rectangulo puede ser un objecto pygame.Rect ouna tupla con alguno de estos 2 formas:(x, y, ancho, alto)((x, y), (ancho, alto))sintaxis:pygame.draw.rect(Surface, color, Rect, width=0): return RectEjemplos:pygame.draw.rect(screen, VERDE, (50, 50, 250, 100), 0)pygame.draw.rect(screen, VERDE, (50, 50, 250, 100), 2)9
  • 10. Curso de: Programación de Juegos con PyGame Por: Ricardo D. Quiroga – L2Radamanthys → l2radamanthys@gmail.comCircleDibuja un circulo, el agumentos pos es una tupla (x, y) con la posicion central del mismo, elargumento radius representa el radio del circulo en pixels, el radio no puede ser menor queel grosor.sintaxispygame.draw.circle(Surface, color, pos, radius, width=0): return RectEjemplo:pygame.draw.circle(screen, CYAN, (200, 200), 70, 6)Ellipse El circulo en matematica es un caso especial de elipse, y este ocurre cuando ladistancia del centro a borde o radio se mantiene constante. Pygame utilizan un atributo paradefinir una elipse.Sintaxispygame.draw.ellipse(Surface, color, Rect, width=0): return RectEjemplos:si pasamos un rectangulo cuadrado como parametro obtendremos un ciruculopygame.draw.ellipse(screen, ROJO, (10, 10, 100, 100), 0)10
  • 11. Curso de: Programación de Juegos con PyGame Por: Ricardo D. Quiroga – L2Radamanthys → l2radamanthys@gmail.compygame.draw.ellipse(screen, MAGENTA, (100, 100, 250, 80), 0)ArcDibuja un arco elíptico en una superficie. La figura se dibujará en el área delimitada por elrectángulo. Los dos argumentos angle son los ángulos inicial y final en radianes, donde 0representa la izquierda.Sintaxis:pygame.draw.arc(Surface, color, Rect, start_angle, stop_angle, width=1):return RectEjemplo:pygame.draw.arc(screen, NEGRO, (100, 100, 200, 200), radians(45),radians(180), 2)line Dibuja un segmento de linea recto en una superficie. No se dibujan puntas en losextremos de la linea, las terminaciones serán cuadradas para lineas muy gruesas.sintaxispygame.draw.line(Surface, color, start_pos, end_pos, width=1): return Rectejemplo:11
  • 12. Curso de: Programación de Juegos con PyGame Por: Ricardo D. Quiroga – L2Radamanthys → l2radamanthys@gmail.compygame.draw.line(screen, NEGRO, (100, 100), (200, 200), 10)lines Dibuja una secuencia de lineas en una superficies. El argumento pointlist es una seriede puntos que se conectarán por una linea. Si el argumento closed es true se dibujará unsegmento de linea adicional entre el primer y último punto.Esta función no dibuja ningunapunta o nodo. Las lineas con esquinas afiladas y grosor de linea muy grande podrían mostrarlas intersecciones de segmentos de manera inapropiada.Sintaxis:pygame.draw.lines(Surface, color, closed, pointlist, width=1): return Rectejemplo:pygame.draw.lines(screen, ROJO, False, [(100, 100), (200, 200), (320, 45)], 5)aaline Dibuja una linea suavizada en una superficie. Esta función estima el rectánguloafectado. Se retorna el rectángulo que representa el área afectada. Si el parámetro blendestá en valor True, las figuras se mezclarán con la tonalidad de los pixels existentes en lugarde sobre-escribirlos. Esta función acepta valores en números realizar para los extremos delos segmentos.Sintaxis:pygame.draw.aaline(Surface, color, startpos, endpos, blend=1): return Rect12
  • 13. Curso de: Programación de Juegos con PyGame Por: Ricardo D. Quiroga – L2Radamanthys → l2radamanthys@gmail.comaalines Dibuja una secuencia de lineas en una superficie. Debe indicar al menos dos puntosen la secuencia de puntos (parámetro pointlist). El argumento closed es un valor booleano, sies True se dibujará un segmento de linea adicional entre el primer y último punto. Si elargumento blend se define a True la figura se dibujará con las tonalidades existentes enlugar de reemplazarlas. Esta función acepta valores en números reales para especificar lospuntos.Sintaxis:pygame.draw.aalines(Surface, color, closed, pointlist, blend=1): return RectPolygon Dibuja una figura poligonal en una superficie. El argumento pointlist es una lista delos vértices del polígono. El argumento width es el espesor para dibujar el borde de la figura.Si width es 0 entonces el polígono se pinta por completo.sintaxis:pygame.draw.polygon(Surface, color, pointlist, width=0): return RectEjemplo:puntos = [ (10, 150), (120, 150), (340, 50), (250, 330)]pygame.draw.polygon(screen, NARANJADO, puntos, 0)13
  • 14. Curso de: Programación de Juegos con PyGame Por: Ricardo D. Quiroga – L2Radamanthys → l2radamanthys@gmail.com Como se ve dibujar figuras basicas no es cosa de otro mundo, pero bueno no sonpocas las cosas que se pueden hacer dibujando solamente figuras basicas muchos fisicos queusan pygame (Si como oyero PyGame no se usa solo para hacer Juegos) las utilizan en sussimulaciones.Un Reloj Analogico Como ultimo ejemplo practico de este capitulo, aunque no es un Juego, vamos ahacer paso por paso un pequeño reloj Analogico, osea de Agujas :P. queremo llegar a algocomo lo siguiente:Bien Empecemos: A primera vista vemos que el reloj nos tiene que mostrar la hora actual de nuestra PCpor lo que aparte de pygame vamos a necesitar importar el modulo time estandar y algunasfunciones matematicas del modulo math ya que trabajaremos con un poco de trigonometria,pues bien los ingredientes son:import timefrom math import cos, sin, degrees, radiansimport pygamefrom pygame.locals import * Segundo, es necesario definir algunas constantes, tanto para la resolcion de laventana, como algunas tuplas que representen los colores que usaremos:#coloresBLANCO = (250, 250, 250)NEGRO = (0, 0, 0)GRIS = (100, 100, 100)AZUL = (0, 0, 255)ROJO = (255, 0, 0)VERDE = (0, 255, 0)#datos de pantallaANCHO = 120ALTO = 120RESOLUCION = (ANCHO, ALTO)CENTRO = (ANCHO / 2, ALTO / 2)RADIO = (ANCHO + ALTO)/ 414
  • 15. Curso de: Programación de Juegos con PyGame Por: Ricardo D. Quiroga – L2Radamanthys → l2radamanthys@gmail.com Bien despues de haver definido todo esto, llego la hora de empesar a escribir codigo;yo para separar un poco el mismo decidi separar las diferentes tareas que conllevan a dibujarel reloj y las separe en: dibujar la base del reloj dibujar la aguja de las hora dibujar la aguja de los minutos dibujar la aguja de los segundos Para dibujar la base del reloj, notaran que lo primero que devemos hacer es dibujarun circulo, pues bien hagamoslo:pygame.draw.circle(surface, NEGRO, CENTRO, RADIO, 1) Ahora para dibujar los indicadores de horas y minutos la cosa se nos complicara unpoco, por que vamos a tener que hacer algunos calculos trigonometricos (a los que no sepantrigonometria les recomiendo leer un poco de el tema antes de continuar, en internet hayvarios apuntes relacionados con el tema). Sabemos que una hora tiene 60 minutos y 1 minuto 60 segundos, pero ademassabemos que un circulo tiene 360 grados, por lo que necesitamos saber cuantos gradosocupa un segundo o minuto osea:360 / 60 = 6 grados Y hacer lo mismos con las horas, con la salvedad de que un reloj analogico marca 12y no 24 horas.360 / 12 = 30 grados Ahora con todo esto podemos dibujar los indicadores de hora y minuto, antes que ellorecordar que en un circulo la posicion x, y en el borde se calcula como sigue:x = cos(alfa) * radioy = sen(alfa) * radio Donde alfa, es el angulo formado por anbos puntos, lo que haremos sera trazarpequeñas lineas de longitud 5 y para ello vamos a hacerlo mediante 2 ciclos for,comenzaremos en cada caso con alfa = 0 y recordando que para los segundo el incrementoes de 6 grados y para las horas de 30 grados, por lo que el codigo quedaria asi: for a in range(60): ang = radians(6) #* a - radians(90) x1 = CENTRO[0] + cos(ang) * (RADIO - 3) y1 = CENTRO[1] + sin(ang) * (RADIO - 3)15
  • 16. Curso de: Programación de Juegos con PyGame Por: Ricardo D. Quiroga – L2Radamanthys → l2radamanthys@gmail.com x2 = x1 + cos(ang) * 3 y2 = y1 + sin(ang) * 3 pygame.draw.line(surface, NEGRO, (x1,y1), (x2,y2), 1) for a in range(12): ang = radians(30) * a - radians(90) x1 = CENTRO[0] + cos(ang) * (RADIO - 5) y1 = CENTRO[1] + sin(ang) * (RADIO - 5) x2 = x1 + cos(ang) * 5 y2 = y1 + sin(ang) * 5 pygame.draw.line(surface, GRIS, (x1,y1), (x2,y2), 2)Hasta ahora hemos logrado lo siguiente y solo nos faltan dibujar las agujas que marcan lashoras: Algo a recalcar el angulo 0 normalmente enpieza donde el reloj daria las 3, por lo quetendremos que descontarles 3 * 30 = 90 grados para que empieze en las 12, sobre elcentido de giro no habra problema, ya que este se deplazara en sentido horario y no ensentido antihorario como tendria que ser. Ahora devemos obtener la Hora, los minutos y los segundos, es para ello queutilizaremos el modulo time:hh = time.localtime().tm_hour % 12mm = time.localtime().tm_minss = time.localtime().tm_sec Bien ahora para finalizar solo tendremos que dibujar las agujas del reloj de manerasimilar a como lo hicimos anteriormente con los indicadores de segundos y horas, la longitudde las agujas puede ser cualquiera yo use las siguientes longitudes:long_aguja_de_hora = radio – 15long_aguja_de_minuto = radio – 10long_aguja_de_segundo = radio – 5 Ahora tendremos que calcular las posiciones x, y y dibujar una linea desde el centrohacia la posicion de cada aguja dependiendo alngulo y el radio:#dibujo la aguja de la horaang = radians(30) * hh - radians(90)x = CENTRO[0] + cos(ang) * (RADIO - 15)y = CENTRO[1] + sin(ang) * (RADIO - 15)16
  • 17. Curso de: Programación de Juegos con PyGame Por: Ricardo D. Quiroga – L2Radamanthys → l2radamanthys@gmail.compygame.draw.line(surface, VERDE, CENTRO, (x,y), 3)#aguja de los minutosang = radians(6) * mm - radians(90)x = CENTRO[0] + cos(ang) * (RADIO - 10)y = CENTRO[1] + sin(ang) * (RADIO - 10)pygame.draw.line(surface, AZUL, CENTRO, (x,y), 2)#aguja de los segundosang = radians(6) * ss - radians(90)x = CENTRO[0] + cos(ang) * (RADIO - 5)y = CENTRO[1] + sin(ang) * (RADIO - 5)pygame.draw.line(surface, ROJO, CENTRO, (x,y), 1) Y eso es todo, omiti el codigo del la secion de incializar pygame, crear la pantalla, leerlos eventos etc, por que no venian al caso y casi siempre es lo mismo, bueno en fin aca estael codigo completo con todas las cosas que no mencione incluidas:#!/usr/bin/env python# -*- coding: utf-8 -*-import timefrom math import cos, sin, degrees, radiansimport pygamefrom pygame.locals import *#coloresBLANCO = (250, 250, 250)NEGRO = (0, 0, 0)GRIS = (100, 100, 100)AZUL = (0, 0, 255)ROJO = (255, 0, 0)VERDE = (0, 255, 0)#datos de pantallaANCHO = 120ALTO = 120RESOLUCION = (ANCHO, ALTO)CENTRO = (ANCHO / 2, ALTO / 2)RADIO = (ANCHO + ALTO)/ 4def draw_hhline(surface, color, hh): """ funcion para dibujar la aguja de la hora """ ang = radians(30) * hh - radians(90) x = CENTRO[0] + cos(ang) * (RADIO - 15) y = CENTRO[1] + sin(ang) * (RADIO - 15) pygame.draw.line(surface, color, CENTRO, (x,y), 3)def draw_mmline(surface,color,mm): """ funcion para dibujar la aguja del minutero""" ang = radians(6) * mm - radians(90) x = CENTRO[0] + cos(ang) * (RADIO - 10) y = CENTRO[1] + sin(ang) * (RADIO - 10)17
  • 18. Curso de: Programación de Juegos con PyGame Por: Ricardo D. Quiroga – L2Radamanthys → l2radamanthys@gmail.com pygame.draw.line(surface, color, CENTRO, (x,y), 2)def draw_ssline(surface,color,ss): """ funcion para dibujar la aguja del segundero """ ang = radians(6) * ss - radians(90) x = CENTRO[0] + cos(ang) * (RADIO - 5) y = CENTRO[1] + sin(ang) * (RADIO - 5) pygame.draw.line(surface, color ,CENTRO, (x,y), 1)def draw_rl(surface): """ dibuja el fondo del reloj """ pygame.draw.circle(surface, NEGRO, CENTRO, RADIO, 1) for a in range(60): ang = radians(6) * a x1 = CENTRO[0] + cos(ang) * (RADIO - 3) y1 = CENTRO[1] + sin(ang) * (RADIO - 3) x2 = x1 + cos(ang) * 3 y2 = y1 + sin(ang) * 3 pygame.draw.line(surface, NEGRO, (x1,y1), (x2,y2), 1) for a in range(12): ang = radians(30) * a x1 = CENTRO[0] + cos(ang) * (RADIO - 5) y1 = CENTRO[1] + sin(ang) * (RADIO - 5) x2 = x1 + cos(ang) * 5 y2 = y1 + sin(ang) * 5 pygame.draw.line(surface, GRIS, (x1,y1), (x2,y2), 2)def main(): pygame.init() screen = pygame.display.set_mode(RESOLUCION) loop = True while loop: screen.fill(BLANCO) hh = time.localtime().tm_hour % 12 mm = time.localtime().tm_min ss = time.localtime().tm_sec draw_rl(screen) draw_hhline(screen,VERDE,hh) draw_mmline(screen,AZUL,mm) draw_ssline(screen,ROJO,ss) pygame.display.flip() for evento in pygame.event.get():18
  • 19. Curso de: Programación de Juegos con PyGame Por: Ricardo D. Quiroga – L2Radamanthys → l2radamanthys@gmail.com if evento.type == pygame.QUIT: loop = False returnif __name__ == __main__: main() La unica variacion que notaran es que yo coloque todo el codigo que venia mostrandodentro de algunas funciones.Despedida Para terminar y para que no se aburran con los ejemplos de este capitulo y ya queesto es un curso de programacion de Juegos inclui un sencillo tic-tac-toe sin IA para 2jugadores, escrito en apenas 300 lineas incluyendo comentarios separacion por lineas enblanco, en fin yo diria buen estilo de codigo, el mismo esta realizado esclusivamente usandoformas basicas. Espero que les guste el juego y hasta el proximo capitulo, aquí dejo unacaptura de pantalla del juego: (véase tictactoe.pyw)19