Duda sobre eficiencia

Agrupa todas las consultas sobre los lenguajes de programacion como C, C++, Python, Java ...

Duda sobre eficiencia

Notapor Juanxo » Jue Jun 11, 2009 12:05 am

Buenas a todos.
Estoy desarrollando un juego estilo plataformas, MarioBros y demás y me encuentro con un problemilla.
Tengo dos archivos cada uno con los estados del personaje(saltar, pegar, correr,....) y otro con los de los enemigos( ojear, patrullar, localizado, perseguir, etc).
Pero me encuentro con un problema:
En algunos de los estados, principalmente los de los enemigos, me encuentro con que en estados como localizado( que ejecuta una animacion cuando ve al personaje) no necesito un parámetro en la función que me represente al personaje, pero si que lo necesito para hacer la llamada desde Localizado al estado Perseguir( no se si se me entiende bien :( ).
La pregunta era, hay alguna manera más eficiente de poder acceder al personaje sin tener que pasar un parámetro a todas las funciones de estados??

Perdón por la explicación
Juanxo
Avatar de Usuario
Juanxo
 
Mensajes: 437
Registrado: Sab Ene 31, 2009 2:34 am
Ubicación: Madrid(España)

Notapor lacabra25 » Vie Jun 12, 2009 12:05 pm

Hola, como no estoy seguro de que lo que he entendido sea el problema que tienes primero voy a comentarte lo que he entendido a ver si he entendido bien el problema y despues abordare el problema y la soluciones que te pueda dar:

Si no te he entendido mal tienes un protagoonista con funciones que solo usas con el protagonista, y varios enemigos con funciones que usas para todos los enemigos, a una funcion de los enemigos no necesitas pasarle un parametro pero esta llama a otra funcion de los enemigos que si necesita un parametro y quieres no tener que pasarle el argumento a la primera funcion para que pueda llamar a la segunda que es la que necesita el argumento en cuestion.

Bueno, si es eso, seria util saber si estas en Python, C o C++ y si el personaje y los enemigos son una estructura que modificas con las funciones con las que tienes el problema de los argumentos y ese tipo de detalles. Como el tema de las variables ya lo habras pensado y preferiras no usarlas como la mayoria de los que programamos pasare directamente a otras soluciones mejores, si el argumento que necesita la funcion (por ejemplo la funcion perseguir) es la posicion del protagonista podrias hacer una funcion que guardase el puntero a la estructura del protagonista como una variable static y asi puedas cambiarlo cuando creas el personaje y acceder a el desde la funcion perseguir llamando a la funcion para que te lo devuelva y acceder al personaje (es parecido a usar variables globales pero sin que sean globales, otra opcion es que localizado no llame a perseguir es decir que la persecucion no la inicies cuando estas actualizando el estado de los enemigos sino cuando actualizas el estado del protagonista de forma que los enemigos los pones en estado de localizado en esa ejecucion del bucle del juego y en la siguiente cuando estas actualizando al protagonista puedes llamar a perseguir para todos los enemigos que se encuentren en el estado de localizado pasandole el argumento (estoy suponiendo que el argumento es la situacion del protagonista para que lo persigan) de este modo pasas a todos los enemigos que esten en localizado a perseguir y continuas actualizando el estado del protagonista (por ejemplo para que haga una animacion de que lo estan persiguiendo y quiere huir o cualquier otra cosa que hagas en el juego) en resumen solo cambia desde que parte del juego llamas a la funcion que necesita el argumento.

Espero haber sido de ayuda y haberme podido explicar bien.
Esta cuenta ahora a pasado a la cuenta jhg
Avatar de Usuario
lacabra25
 
Mensajes: 222
Registrado: Mié Abr 02, 2008 9:45 pm
Ubicación: Tenerife (España)

Notapor Juanxo » Vie Jun 12, 2009 6:18 pm

Gracias por responder lacabra.
Mi problema, como bien has comentado es que quiero acceder a la posicion del personaje en las funciones de los enemigos( que se encargan de gestionar el comportamiento y la imagen a mostrar). Para que quede más claro todo, ahí va un ejemplo de estado.

Por cierto, es en python/pygame, en el que creo que no existen punteros :(

Código: Seleccionar todo
class Patrullar(Estado):

    def __init__(self,enemigo, pt1, pt2, personaje):
        Estado.__init__(self, enemigo)
        self.enemigo.animacion.poner_imagenes([1,0])
        self.pt1 = pt1
        self.pt2 = pt2
        self.destino = pt1
        self.personaje = personaje

    def update(self):

       
        if self.enemigo.rect.x < self.destino:
            self.enemigo.invertir(True)
            self.enemigo.rect.move_ip(2,0)
        elif self.enemigo.rect.x == self.destino:
            origen = self.destino
            self.destino = self.cambiar_destino()
            self.enemigo.cambiar_estado(Ojear(self.enemigo, self.destino, origen, self.personaje))
        else:
            self.enemigo.rect.move_ip(-2,0)
            self.enemigo.invertir(False)


Esto se encarga de mover de un punto a otro el enemigo, como si estuviera patrullando, "echando una ojeada" alrededor cuando llega al destino.
Si te fijas, el atributo personaje no lo utilizo en la clase, únicamente lo necesito para hacer la llamada a ojear, que comprueba si el enemigo está visible.

Creo que en esta ocasión mi explicación ha sido algo más clara, espero que ahora se me haya entendido.

En cuanto a lo de la solución que tu has comentado de actualizar en el personaje en vez de en el enemigo, estaríamos quizás en las mismas creo yo.

Pero de todas formas gracias por la ayuda, como siempre
Avatar de Usuario
Juanxo
 
Mensajes: 437
Registrado: Sab Ene 31, 2009 2:34 am
Ubicación: Madrid(España)

Notapor lacabra25 » Sab Jun 13, 2009 5:02 pm

Efectivamente, Python no tiene punteros y tiene su propio recolector de basura, el no tener punteros al estar acostumbrado a usarlos me limita. Ya que Python esta orientado a objetos se me ocurre que si lo que el enemigo necesita es la posicion del personaje para perseguirlo en lugar de pasarla como un argumento podria el enemigo obtenerla accediendo a las propiedades de la clase del personaje, es decir, si hay una clase enemigo que se usa para crear varios enemigos y una clase personaje que se usa para crear un unico personaje principal se puede hacer que la propiedad posicion de el personaje sea publica podiendo acceder a la posicion del personaje todos los enemigos de forma que no necesitases pasarla como un argumento del metodo persecucion de los enemigos, espero que esto te sea de utilidad, de todas formas puede que otro con mas experiencia en lenguajes orientados a objetos pueda tener alguna solucion mejor.
Esta cuenta ahora a pasado a la cuenta jhg
Avatar de Usuario
lacabra25
 
Mensajes: 222
Registrado: Mié Abr 02, 2008 9:45 pm
Ubicación: Tenerife (España)


Volver a Sobre lenguajes de programación

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados

cron