#!/usr/bin/env python # -*- coding: utf-8 -*- # Graficos_JAMtank.py por: # Flavio Danesse # CeibalJAM! - Uruguay - Plan Ceibal # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import pygame from pygame.locals import * import gc gc.enable() BLANCO = pygame.Color ("white")#(255, 255, 255, 1) AMARILLO = pygame.Color ("yellow")#(255, 255, 0, 1) ROJO = pygame.Color ("red")#(255, 0, 0, 1) # para las balas MAGENTA = (255, 0, 255) VELOCIDAD = 8 from math import sin, cos, radians from pygame.sprite import Sprite class Graficos_JAMtank(): ''' Maneja todos los objetos gráficos y de audio del juego. ''' def __init__(self, resolucion_monitor, directorio_de_imagenes, directorio_de_sonidos): # Monitor self.resolucion_monitor = resolucion_monitor # Ventana y Escenario self.directorio_de_imagenes = directorio_de_imagenes self.fondo = None self.ventana = None # Sonido self.directorio_de_sonidos = directorio_de_sonidos self.sonido_disparo = None self.sonido_motor = None self.sonido_juego = None # sprites y grupos de sprits self.tanques = pygame.sprite.RenderUpdates() # todos los tanques en el juego self.todas_las_balas = pygame.sprite.RenderUpdates() # todas las balas en el juego self.textos = pygame.sprite.RenderUpdates() # información en pantalla para puntaje y energia de tanques self.protagonista = None self.explosiones = pygame.sprite.RenderUpdates() # Fuente y textos del menú energía y puntaje self.fuente_menu = None self.img_puntaje = pygame.sprite.Sprite() self.img_energia = pygame.sprite.Sprite() self.textos_jugadores = pygame.sprite.RenderUpdates() def set_menu_puntaje(self): # Crea el menu de energía y puntaje del jugador local puntos = 1000 energia = 100 titulo_puntaje = pygame.sprite.Sprite() titulo_energia = pygame.sprite.Sprite() x = 5 titulo_puntaje.image = self.fuente_menu.render("Puntos:", 1, (BLANCO)) titulo_puntaje.rect = titulo_puntaje.image.get_rect() titulo_puntaje.rect.x = x titulo_puntaje.rect.y = 0 self.textos.add(titulo_puntaje) x += int(titulo_puntaje.rect.width + 10) self.img_puntaje.image = self.fuente_menu.render(str(puntos), 1, (AMARILLO)) self.img_puntaje.rect = self.img_puntaje.image.get_rect() self.img_puntaje.rect.x = x self.img_puntaje.rect.y = 0 self.textos.add(self.img_puntaje) x += int(self.img_puntaje.rect.width + 10) titulo_energia.image = self.fuente_menu.render("Energia:", 1, (BLANCO)) titulo_energia.rect = titulo_energia.image.get_rect() titulo_energia.rect.x = x titulo_energia.rect.y = 0 self.textos.add(titulo_energia) x += int(titulo_energia.rect.width + 10) self.img_energia.image = self.fuente_menu.render(str(energia), 1, (AMARILLO)) self.img_energia.rect = self.img_energia.image.get_rect() self.img_energia.rect.x = x self.img_energia.rect.y = 0 self.textos.add(self.img_energia) def set_menu_jugadores(self, lista): # Crea el menu de energía y puntaje del jugador local for texto in self.textos_jugadores: texto.kill() #lista.sort() ancho_pantalla = self.resolucion_monitor[0] distancia = 10 y = 0 for elemento in lista: puntos, nombre = elemento img_nombre = pygame.sprite.Sprite() img_puntaje = pygame.sprite.Sprite() img_puntaje.image = self.fuente_menu.render(str(puntos), 1, (AMARILLO)) img_puntaje.rect = img_puntaje.image.get_rect() img_nombre.image = self.fuente_menu.render(str(nombre), 1, (AMARILLO)) img_nombre.rect = img_nombre.image.get_rect() img_puntaje.rect.x = ancho_pantalla - img_puntaje.rect.w - distancia - img_nombre.rect.w img_puntaje.rect.y = y img_nombre.rect.x = ancho_pantalla - img_nombre.rect.w img_nombre.rect.y = y self.textos_jugadores.add(img_nombre) self.textos_jugadores.add(img_puntaje) y += 20 def set_menu_ip_server(self, ip): # Para mostrar la ip del servidor del juego texto = "IP del Servidor: %s" %(ip) img_texto = pygame.sprite.Sprite() img_texto.image = self.fuente_menu.render(str(texto), 1, (BLANCO)) img_texto.rect = img_texto.image.get_rect() img_texto.rect.x = 0 img_texto.rect.y = 860 self.textos.add(img_texto) def actualiza_puntaje(self, puntos=0, energia=100): # Actualiza en pantalla el puntaje y la energia del jugador local self.img_puntaje.image = self.fuente_menu.render(str(puntos), 1, (AMARILLO)) color = AMARILLO if energia < 50: color = ROJO self.img_energia.image = self.fuente_menu.render(str(energia), 1, (color)) def actualizar(self): # dibuja los sprites y el fondo # Actualiza la imagen de los tanques self.tanques.clear(self.ventana, self.fondo) cambios = self.tanques.draw(self.ventana) # Actualiza la imagen del menú self.textos.clear(self.ventana, self.fondo) cambios.extend( self.textos.draw(self.ventana) ) # Actualiza las balas en pantalla if self.todas_las_balas: self.todas_las_balas.clear(self.ventana, self.fondo) for bala in self.todas_las_balas: x, y = bala.Actualizar() if x < 0 or x > self.resolucion_monitor[0] or y < 0 or y > self.resolucion_monitor[1]: # Si se sale de la pantalla se elimina for tanque in self.tanques: # buscar entre los tanques al que tenga el mismo nombre y poner bala en None if tanque.nombre == bala.autor: tanque.bala = None bala.kill() else: # si no se sale de la pantalla ver si le pega a alguien self.detectar_colisiones(bala) cambios.extend( self.todas_las_balas.draw(self.ventana) ) # Actualiza las explosiones if self.explosiones: self.explosiones.clear(self.ventana, self.fondo) for explosion in self.explosiones: explosion.Actualizar() cambios.extend( self.explosiones.draw(self.ventana) ) # Actualiza la imagen del ranking self.textos_jugadores.clear(self.ventana, self.fondo) cambios.extend( self.textos_jugadores.draw(self.ventana) ) pygame.display.update(cambios) # dibuja el personaje y las balas '''# efecto sello self.tanques.draw(self.ventana) pygame.display.update()''' def detectar_colisiones(self, bala): # Detecta las colisiones entre balas y tanques. for tanque in self.tanques: if bala.autor != tanque.nombre: # si la bala no pertenece al tanque que está tocando. if bala.rect.colliderect(tanque.rect): # Si la bala toca al tanque if tanque == self.protagonista: # Si me pegan a mi, pierdo energia self.protagonista.energia -= 10 self.protagonista.nuevos_datos_puntos = True elif bala.autor == self.protagonista.nombre: # si yo le pego a otro, cobro punto tanque.energia -= 10 if tanque.energia < 1: tanque.energia = 100 self.protagonista.puntaje += 1 self.protagonista.nuevos_datos_puntos = True else: # si se pegan entre ellos pass # dibujar explosión angulo, x, y = bala.get_posicion() bala.kill() self.explosiones.add(Explosion(x=x, y=y, image_explosion=self.image_explosion, sonido_explosion=self.sonido_explosion)) for tanque1 in self.tanques: # buscar entre los tanques al que tenga el mismo nombre y poner bala en None if tanque1.nombre == bala.autor: tanque1.bala = None else: # si la bala pertenece a este tanque no hacer nada. pass def set_play_motor(self): self.sonido_motor.play(-1) def set_play_bala(self): self.sonido_disparo.play() def iniciar_escenario(self): # levanta el Escenario print "Iniciando el Escenario de JAMtank" self.ventana.blit(self.fondo, (0,0)) pygame.display.update() def setup(self, Jugador_JAMtank=None): # Configurar objetos gráficos y de sonido para el juego print "Seteando Modo Gráfico, Sonidos y Fuentes para JAMtank" pygame.init() self.protagonista=Jugador_JAMtank # Monitor y Ventana pygame.display.set_mode(self.resolucion_monitor, 0, 0) pygame.display.set_caption("JAMtank - fdanesse@hotmail.com - CeibalJAM! - Uruguay") # Ventana y Escenario self.fondo = pygame.transform.scale(pygame.image.load(self.directorio_de_imagenes+"fondo.png"), self.resolucion_monitor).convert_alpha() self.ventana = pygame.display.get_surface() # la ventana del juego # Mouse pygame.mouse.set_visible(False) # Sonido pygame.mixer.init(44100, -16, 2, 2048) pygame.mixer.music.set_volume(1.0) self.sonido_disparo = pygame.mixer.Sound(self.directorio_de_sonidos+"Tanque-M60.ogg") self.sonido_motor = pygame.mixer.Sound(self.directorio_de_sonidos+"motor.ogg") self.sonido_juego = pygame.mixer.Sound(self.directorio_de_sonidos+"Juego.ogg") self.sonido_juego.play(-1) # Explosiones self.sonido_explosion = pygame.mixer.Sound(self.directorio_de_sonidos+"explosion.ogg") self.image_explosion = pygame.image.load(self.directorio_de_imagenes+"explosion.png").convert_alpha() # Fuentes pygame.font.init() self.fuente_menu = pygame.font.Font(pygame.font.match_font('Purisa', True, False), 25) # http://efectos-de-sonido.anuncios-radio.com/gratis/ # http://www.tuwebdeinformatica.com/Crearjuegos/massprites3.html class Explosion(pygame.sprite.Sprite): # Las Balas del tanque. def __init__(self, x=0, y=0, image_explosion=None, sonido_explosion=None): pygame.sprite.Sprite.__init__(self) self.image = image_explosion self.rect = self.image.get_rect() self.rect.center = (x, y) self.contador = 0 self.sonido_explosion = sonido_explosion self.sonido_explosion.play() self.Actualizar() def Actualizar(self): self.contador += 1 if self.contador == 5: self.kill()