Disminuir Code[PyGame]

Tratamos sobre el manejo de APIs frecuentemente utilizadas en el desarrollo de videojuegos, como SDL, pygame o SFML.

Disminuir Code[PyGame]

Notapor Programer » Mié Dic 10, 2008 3:32 am

Hola, es que tengo esta clase, aun no esta terminada:

Código: Seleccionar todo
class cuadro():

    def __init__(self, xd, dy):
        self.imagen, self.rectn = load_image('n.jpg')
        self.imaget, self.rectt = load_image('t.jpg')
        self.imagenat, self.rectnat = load_image('NaT.jpg')
        self.imagenan, self.rectnan = load_image('NaN.jpg')
        self.imagerot, self.rectrot = load_image('RoT.jpg')
        self.imageron, self.rectron = load_image('RoN.jpg')
       
       
        self.image = [self.imagen, self.imaget,
                      self.imagenat, self.imagenan,
                      self.imagerot, self.imageron]
        self.rect = [self.rectn, self.rectt,
                      self.rectnat, self.rectnan,
                      self.rectrot, self.rectron]
       
        for i in  range(0,5):
          self.rect[i].move_ip(xd, dy)
       
       
    def update(self):
        i=0
       
        if self.rect[i].x+26 > x and self.rect[i].y+22 > y and self.rect[i].x < x and self.rect[i].y < y:
           i=1
       
        screen.blit(self.image[i], self.rect[i])
        self.rectangulo = self.rect[i]
        self.imaginacion = self.image[i]


El Problema es que, si quiero hacer 144 cuadraditos(columna 12 y fila 12), tendre que hacer muchas lineas y llamar 144 veces a la funcion update.¿Hay alguna forma de hacerlo en pocas Lineas?
Programer
 
Mensajes: 5
Registrado: Jue Dic 04, 2008 10:17 pm

Notapor endaramiz » Mié Dic 10, 2008 11:31 pm

Lo siento pero no entiendo muy bien que hace la clase. Supongo que porque no está el programa completo. Aunque, a la hora de hacer videojuegos, es mejor que intentes hacerlo de la manera más fácil y luego ir mejorándolo.

Cuando esté completa, publica el código completo y le echo otro vistazo. Pero te adelanto una cosilla: seguramente irá bien no hacer ningún blit en el método .update() (tenerlo en por ejemplo .draw()). Ya que, a lo mejor, no hace falta que hagas el blit cada vez que haces el update. Pero habría que mirarlo detalladamente.

Saludos.
Avatar de Usuario
endaramiz
 
Mensajes: 283
Registrado: Vie Ago 31, 2007 9:25 am
Ubicación: Barcelona

Notapor Programer » Jue Dic 11, 2008 3:05 am

Aqui esta mas o menos completo, cada ves que hacerca el cursosr a la imagen le da una especie de brillo...Y si haces Clik cambia a naranga y hacercas el cursor y briila pero en naranja, Blah Blah....

Código: Seleccionar todo
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os, sys
import pygame
from pygame.locals import *
from pygame import *







def load_image(name, colorkey=None, ruta=''):
    fullname = os.path.join(ruta, name)
    try:
        image = pygame.image.load(fullname)
    except pygame.error, message:
        print 'No se pudo cargar la Imagen:', name
        raise SystemExit, message
        image = image.convert()
    if colorkey is not None:
        if colorkey is -1:
            colorkey = image.get_at((0,0))
        image.set_colorkey(colorkey, RLEACCEL)
    return image, image.get_rect()


def load_sound(name, ruta=''):
    class NoneSound:
        def play(self): pass
    if not pygame.mixer:
        return NoneSound()
    fullname = os.path.join(ruta, name)
    try:
        sound = pygame.mixer.Sound(fullname)
    except pygame.error, message:
        print 'No se Pudo cargar el sonido:', wav
        raise SystemExit, message
        return sound



class cuadro():

    def __init__(self, xd, dy):
        self.imagen, self.rectn = load_image('n.jpg')
        self.imaget, self.rectt = load_image('t.jpg')
        self.imagenat, self.rectnat = load_image('NaT.jpg')
        self.imagenan, self.rectnan = load_image('NaN.jpg')
        self.imagerot, self.rectrot = load_image('RoT.jpg')
        self.imageron, self.rectron = load_image('RoN.jpg')
       
       
        self.image = [self.imagen, self.imaget,
                      self.imagenan, self.imagenat,
                      self.imageron, self.imagerot]
        self.rect = [self.rectn, self.rectt,
                      self.rectnat, self.rectnan,
                      self.rectrot, self.rectron]
       
        for self.i in  range(0,5):
          self.rect[self.i].move_ip(xd, dy)
        self.o=0
        self.h = 0
       
    def update(self,n):
       
        self.i = self.o
       
       
       
        if self.rect[self.i].x+26 > x and self.rect[self.i].y+23 > y and self.rect[self.i].x < x and self.rect[self.i].y < y and self.h is not 1:
            self.i += 1
           
           
       
           
       
       
        if self.rect[self.i].x+26 > cx and self.rect[self.i].y+23 > cy and self.rect[self.i].x < cx and self.rect[self.i].y < cy and rn is not n:
             self.i=2
             self.o=2
        elif self.rect[self.i].x+26 > cx and self.rect[self.i].y+23 > cy and self.rect[self.i].x < cx and self.rect[self.i].y < cy and rn == n:
             self.i=4
             self.o=4
             
       
           
       
        screen.blit(self.image[self.i], self.rect[self.i])
        self.rectangulo = self.rect[self.i]
        self.imaginacion = self.image[self.i]
       
       

       
       
   







if __name__ == '__main__':
   

    cx, cy = 500, 500
    rn=11
    color = (255, 240, 220)
    salir = False
   # creacion de la ventana
    pygame.init()

    screen = pygame.display.set_mode((5*25,5*22))
    pygame.display.set_caption("Mi Juego y de Nadie Mas")
    cuadro1=cuadro(0, 0)  #A esto me refiero, tendre que hacer 500s de estos?
    cuadro2=cuadro(0, 22)
    cuadro3=cuadro(25, 0)
    cuadro4=cuadro(25, 22)
    cuadro5=cuadro(50, 0)
    cuadro6=cuadro(0, 44)
    cuadro7=cuadro(50, 22)
    cuadro8=cuadro(25, 44)
    cuadro9=cuadro(50, 44)
    cuadro10=cuadro(100, 0)
    cuadro11=cuadro(0, 88)
    cuadro12=cuadro(100, 88)
    cuadro13=cuadro(75, 0)
    cuadro14=cuadro(0, 66)
    cuadro15=cuadro(75, 66)
    cuadro16=cuadro(75, 22)
    cuadro17=cuadro(100, 22)
    cuadro18=cuadro(100, 44)
    cuadro19=cuadro(100, 66)
    cuadro20=cuadro(75, 44)
    cuadro21=cuadro(25, 66)
    cuadro22=cuadro(75, 88)
    cuadro23=cuadro(25, 88)
    cuadro24=cuadro(50, 66)
    cuadro25=cuadro(50, 88)
   
   
   
   
   
   
    # objetos
    temporizador = pygame.time.Clock()
   

    while not salir:
       
       
        x, y = mouse.get_pos()
       
       
       
       
        print x, y
       
        cuadro1.update(1)
        cuadro2.update(2)
        cuadro3.update(3)
        cuadro4.update(4)
        cuadro5.update(5)
        cuadro6.update(6)
        cuadro7.update(7)
        cuadro8.update(8)
        cuadro9.update(9)
        cuadro10.update(10)
        cuadro11.update(11)
        cuadro12.update(12)
        cuadro13.update(13)
        cuadro14.update(14)
        cuadro15.update(15)
        cuadro16.update(16)
        cuadro17.update(17)
        cuadro18.update(18)
        cuadro19.update(19)
        cuadro20.update(20)
        cuadro21.update(21)
        cuadro22.update(22)
        cuadro23.update(23)
        cuadro24.update(24)
        cuadro25.update(25)
       
       
        # actualizacion grafica
        pygame.display.flip()
       
        temporizador.tick(60)
        # gestion de eventos
        for evento in pygame.event.get():
            if evento.type == pygame.QUIT:
                salir = True
            elif evento.type == pygame.MOUSEBUTTONDOWN:
              cx, cy = evento.pos

              print "ha hecho click en la posicion: ", cx, cy
Programer
 
Mensajes: 5
Registrado: Jue Dic 04, 2008 10:17 pm

Notapor hugoruscitti » Jue Dic 11, 2008 1:38 pm

Podrías utilizar listas, por ejemplo si quieres tener todos
los cuadrados agrupados ejecutas:

Código: Seleccionar todo
cuadros = []

for fila in range(0, 5):
    for columna de range(0, 5):

        # define la posicion que debe tener
        # el cuadro.

        x = columna * 25
        y = fila * 22

        # imprime la posicion.
        print "creando cuadro en (%dx%d)

        # genera el elemento y lo coloca en la lista.
        nuevo = cuadro(x, y)
        cuadros.append(nuevo)


luego de ejecutar ese código tendrías el objecto "cuadros" con
todos los elementos dentro.

Algo interesante de usar listas, es que luego te puedes despreocupar
por la cantidad de elementos; los ciclos de actualización y
dibujo serán mucho mas sencillos, y funcionarán si tienes 0, 1, o
mas elementos almacenados. Por ejemplo, para llamar al método
update de cada uno de los objetos cuadro:

Código: Seleccionar todo
for elemento in cuadros:
    elemento.update()


lo malo de esta forma es que tu método update recibe un parámetro, lo
mas sencillo sería planificarlo para que ese parámetro no sea necesario,
de otra forma tendrías que adaptar el bucle a algo así:

Código: Seleccionar todo
for indice, elemento in enumerate(cuadros):
    elemento.update(indice)


y siguiendo la recomendación de dvd, que por cierto es muy
acertada, tendrías que tener un método para indicarle al
cuadro que "se imprima en pantalla":

Código: Seleccionar todo
for elemento un cuadros:
    elemento.draw()


el método draw podría recibir una referencia a la pantalla
principal si quieres.

Un saludo, y ten en cuenta que no me interioricé mucho en tu
programa por falta de tiempo, estas recomendaciones son muy generales...
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina

Notapor Programer » Jue Dic 11, 2008 6:57 pm

Gracias amigo, vere que hago con eso.
Programer
 
Mensajes: 5
Registrado: Jue Dic 04, 2008 10:17 pm


Volver a Sobre las bibliotecas multimedia

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado