Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





como comunicar las clases entre si? ( juego )

Iniciado por wintermute83, 17 de Septiembre de 2010, 02:37:09 PM

« anterior - próximo »

wintermute83

Hola a todos, sigo en mi camino de aprender java mediante un videojuego.
Estoy planeando un sistema de entidades para mi juego de tal manera que pueda crear un mundo complejo pero ordenado.

Estoy haciendolo con java, pero la cuestion es para la programacion OO.
Que me sugerís para que un objeto tenga conocimiento de otro?
en ejemplo, un personaje del juego ( una IA ) quiere atacar a otro, despues del ataque querrá restarle puntos de vida, o chocarse con
el cuando anda, etc..

Yo estaba pensando en crear una clase que asigna un int ID a cada entidad del juego y los almacena en una tabla.
Luego cada vez que un objeto quiere interactuar con otro, comprobara las circunstancias de todos los objetos en la tabla de IDs para
ver si son las adecuadas para interactuar. ( pej, una explosion comprobará si las clases estan cerca como para verse afectadas )

O tal vez sea mejor guardar las referencias de todas los objetos como referencias clase objeto y luego ir una por una comprobando?

1 saludo y gracias por la ayuda!

tamat

#1
lo que buscas se llaman Patrones de Diseño (design patterns), son tecnicas para comunicar instancias acorde a las necesidades de cada una, es importante conocer todos los patrones porque te ahorran mucho trabajo y permite un codigo limpio y que otras personas puedan usar.

Design pattern en wikipedia

Algunos de los mas habituales son:
- Singleton (cuando todos necesitan conocer una instancia)
- Abstract Factory (para crear instancias conforme alguien las pida)

Miratelos con calma, en serio que te pueden salvar la vida cuando el proyecto crece en complejidad.
Por un stratos menos tenso

[EX3]

Las entidades las tendras en una coleccion o array se supone, yo lo que solia hacer, que no se si es la mejor manera, es guardar la referencia del padre (la coleccion) en cada hijo (entidad) que esta contiene, de esta manera, cada vez que necesitaba localizar otra entidad y acceder a sus miembros accedia mediante el padre (una propiedad mismamente de la entidad). De esta forma es sencillo conectar objetos de una misma coleccion entre ellos.

Sobre el ejemplo de la explosion que has mencionado, yo definia eventos en los cuerpos rigidos del motor de fisicas (objetos que implementaba en las entidades para dotarlos de fisica para colisiones y demas), un evento que implementaba era OnHit(), este era invocado desde dos objetos del motor de fisicas: un raytracer (para disparos por ejemplo) y un emisor para aplicar fuerza en un radio (un objeto para definir explosiones). El evento recogia quien era la fuente del impacto, en el caso de la explosion, la referencia al emisor, por lo que la entidad que implementaba el cuerpo fisico y su evento OnHit() podia saber al instante si una explosion le alcanza, en que direccion y cuanta fuerza le aplica, con lo que ya sabias lo necesario para calcular el daño o la respuesta deseada.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

wintermute83


En primer lugar gracias por descubrirme los design patterns.

En segundo, tal y como mi diseño va cogiendo forma, sera un objeto world el que cree las entidades, y guarde sus referencias
en arrays. Las entidades sabran que son hijos de world y le podran consultar por otras entidades.

De momento voy a seguir esta aproximación para ir avanzando, y hacer el aprendizaje mas dinamico.

1 saludo y muchas gracias a los 2.

Vicente

No uses arrays, Java tiene cosas mejores que arrays para manejar listas de cosas (ArrayList<T> o List<T> no estoy seguro como se llama).

IDandT

Yo hace tiempo que no toco cosillas pero recuerdo que solia montarme clases "manager" que eran las que resolvian las interacciones entre las entidades. No se que tipo de juego estas haciendo, pero en mi caso por ejemplo para un shooter de naves 2d, te pongo el ejemplo practico. No se si es la mejor forma, pero a mi me resultaba muy sencillo e intuitivo...

Tenia un "EntityManager" (entre otras cosas claro, ScenaryManager, Audio etc...) que a su vez tenia listas ("List<T>") de "Shots", "Enemys", "PowerUps" etc...

Si el jugador disparaba se añadia una entidad "Shot" a la List de shots.

La clase Shot tenia un metodo CheckCollisionWithEntity que recibia un parametro de tipo "Enemy" o "Player".

Lo que el EntityManager hacia para comprobar la interaccion entre disparos y enemigos era tan sencillo como recorrer los disparos de la lista y comprobar si colisionaban con un enemigo. Algo así


            //Control de colisiones entre entidades.
            foreach (Shot s in shotList)
            {
                foreach (Enemy e in enemyList)
                {
                    if (s.CheckCollisionWithEnemy(e))
                    {
                        e.IsDeath = true;
                        s.IsDeath = true;
                    }
                }
            }

            //Eliminamos las entidades muertas.
            enemyList.RemoveAll(Enemy.IsDeath);
            shotList.RemoveAll(Shot.IsDeath);



Como digo no se si es lo mejor, pero es una forma sencilla de hacer que entidades diferentes interaccionen. Pero claro esto ya depende del tipo de juego y lo que quieras conseguir. Para interacciones mas complejas que una simple colision pues supongo que deberás utilizar otro tipo de tecnicas.

wintermute83

Gracias por vuestras sugerencias.

Estoy haciendo un diseño en el que el entitymanager crea las entidades y las registra en un ArrayList<entity>. Las entidades son dadas una referencia al padre (entitymanager) de tal forma que pueden accerder al ArrayList de la siguiente manera:
entityManager.getEntityList();  y hacer las comprobaciones necesarias.

Si encuentran una entidad con la que interactuar llaman a entityManager y le pasan el indice correspondiente a la entidad que quieren alterar.

Todavia no lo he implementado, es solo la idea.

1saludo

Buffon

Puestos a hacer las cosas con diseño y ordenadas puedes tener un BattleFactory del cuál creas BattleManagers que se encargan de gestionar cada una de las batallas y tienen información tipo (unidades que participan, etc).

De todas formas cada Entity debe tener un set y un get de cada uno de sus elementos principales, además, si un Airship hereda de un Entity (abstracta), Entity puede tener una operación programada.

public boolean dropLife(int quantity); //devuelve si ha muerto la unidad

Además los Managers se utilizan más para calcular cosas como (resistencia mágica, penetración mágica) y todas esas cosas que los de Magic, blizzard etc se van inventando para darle más vida a sus juegos.

--

Hacer managers tiene su complicación:

_battleManager1 (tiene 2 contrincantes)
_battleManager2 (tiene 4 contrincantes).

Uno de los contrincantes de battleManager1 golpea accidentalmente a uno de los contrincantes de battleManager2, qué haces ? Cómo separas contrincantes ?

Etc.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.