Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Conceptos con el Scroll

Iniciado por kennyhp, 20 de Abril de 2010, 11:53:57 AM

« anterior - próximo »

kennyhp

Hola, estoy atascado con un tema que no consigo solucionar, tal vez por no entender algunos conceptos, a ver si me podeis ayudar.

Tengo un scroll basado en este: http://www.xnadevelopment.com/tutorials/scrollinga2dbackground/ScrollingA2DBackground.shtml

Primero os pongo en antecedentes. Yo cargo todos los elementos del juego a partir de un XML, por lo tanto, tengo una clase llamada nivel que se encarga de leer el XML e ir cargando todos los enemigos del juego. Pongamos que el juego funciona a 800*600 y tengo tres imagenes para el fondo de este tamaño, por lo tanto el nivel mide 2.700 pixeles de largo. Cuando cargo los enemigos por supueto los coloco en una posicion del escenario, pongamos que coloco uno en la posicion 700, otro en la posicion 1.500 y otro en la 2.100. El enemigo tiene una logica que le hace avanzar hacia el protagonista y le dispara. La clase nivel se encarga de llamar a los update y draw de los enemigos, y ahí es donde tengo la logica de los enemigos.

Lo que me pasa es que los enemigos empiezan con su lógica desde el principio del nivel y se ponen a avanzar cuando no deben(solo deben avanzar cuando son visibles), con el consiguiente mal funcionamiento y carga innecesaria en el juego.

Lo que me gustaria es tener un flag en el enemigo tipo "estaActivo", y utilizarlo para la logica del enemigo y de las colisiones (no tiene logica que compruebe si una bala colisiona con un enemigo si este no esta en pantalla), pero no se como hacerlo, no se como conseguir que el enemigo se entere que esta visible para activarse. He estado trasteando con el viewport y demases pero no lo consigo. Tambien habia pensado que podria crear un rectangle que ocupe la pantalla y comprobarlo con este, por ejemplo cuando colisione con el rectangle del enemigo, pero no se como actualizarlo con la posición correcta. Espero haberme explicado bien :)

¿como habeis afrontado esto en vuestros juegos con scroll?

A ver si alguien me puede ayudar que estoy perdido!!!!

Un saludo y gracias!

[EX3]

Cita de: kennyhp en 20 de Abril de 2010, 11:53:57 AM
Tambien habia pensado que podria crear un rectangle que ocupe la pantalla y comprobarlo con este, por ejemplo cuando colisione con el rectangle del enemigo
Lo mas facil, deberias comprobar al recorrer tu lista de enemigos es si se encuentran en el area de vision de la pantalla (una simple colision de cajas te basta). De esta forma, si el area del enemigo esta intersectando la caja que define el area de vision de la escena, actualizas la logica del enemigo, en caso contrario no. Yo esto lo tengo implementado para la logica de dibujo, la logica de fisicas (las colisiones y distancia para traza de rayos) y de entidades (logica e IA de enemigos, items, elementos dinamicos del escenario como elevadores o puertas) de manera similar (utilizo un area mas grande que la de vision para tener cierta coherencia con la cercania de objetos en vez de solo con el area de vision).

Código (csharp) [Seleccionar]
foreach (enemigo e in listaEnemigos)
    // IntersectRectFunction() traducese por el metodo que use XNA para calcular intersecciones entre dos rectangulos o la misma que use en System.Drawing.Rectangle y su funcion Intersect() por ejemplo:
    if IntersectRectFunction(e.Rectangle, scene.Rectangle) e.Update();


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

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

kennyhp

El problema que tengo es que no se como actualizar la posición del rectangulo en cada Update... Por más intentos que hago no lo hago bien...

[EX3]

Si sabes actualizar la posicion del objeto sabes pues como actualizar su area. Teniendo en cuenta que su posicion es el centro del area del objeto:

[ X - (Width \ 2), Y - (Height \ 2)] ****************************** [ X + (Width \ 2), Y - (Height \ 2)]
*                                                                                                                                                                *
*                                                                                                                                                                *
*                                                                                                                                                                *
*                                                                           [ X , Y ]                                                                          *
*                                                                                                                                                                *
*                                                                                                                                                                *
*                                                                                                                                                                *
[ X - (Width \ 2), Y + (Height \ 2)] ****************************** [ X + (Width \ 2), Y + (Height \ 2)]

El codigo que se encarge de recalcular la posicion del rectangulo que define su area lo podrias ubicar en tu metodo o propiedad donde le indicas su posicion (yo suelo definir una propiedad publica Location de tipo POINT en mis objetos), cada vez que cambies el valor de la posicion se actualizara la posicion del rectanculo. Asi al menos lo tengo, para evitar en muchas ocasiones recalcular innecesariamente.

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

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

kennyhp

He hecho algunas pruebas y me encuentro con un problema... he mirado la posición que tiene el protagonista, y así probando lo que he visto es que, por explicarlo de alguna forma, la "camara" no se mueve, lo que se mueve es el fondo, por lo tanto, si pinto un rectangulo, este siempre esta en la misma posición y por lo tanto no colisiona nunca... ¿alguna idea?

Saludos!

Vicente

No entiendo la pregunta :S Las cámaras definen una transformación que modifica todos los demás elementos de la escena (sea 2D, 3D,...).

blau

Lo correcto es trabajar en las coordenadas de mundo, es decir, sin sumar offsets de scroll ni historias, y lo unico que mueves es la camara mediante una transformacion que aplicas a la  hora de pintar.

Por si te sirve de ayuda esta es la transformacion para que una camara siga a un personaje que este en la posicion "pos".

Las variables _rotacion y _zoom afectan a la camara y ViewportScreen define tu ventana al mundo.

Transform = Matrix.CreateTranslation(new Vector3(- pos.X , -pos.Y , 0)) *
        Matrix.CreateRotationZ(_rotation) *
        Matrix.CreateScale(new Vector3(_zoom, _zoom, 0)) *
        Matrix.CreateTranslation(new Vector3(ViewportScreen.X + ViewportScreen.Width * 0.5f, ViewportScreen.Y + ViewportScreen.Height * 0.5f, 0));


despues para pintar:

Batch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.Deferred, SaveStateMode.None, camera.Transform);

kennyhp

Hola,
creo que no me he explicado bien... mi juego es totalmente 2D y el scroll que estoy usando es este:
http://www.xnadevelopment.com/tutorials/scrollinga2dbackground/ScrollingA2DBackground.shtml

El problema que tengo es que no se como manejar a los objetos(enemigos, etc) que no estan visibles. He usado el concepto camara para definir lo que se ve en pantalla, por eso lo he entrecomillado  ;)

Si lo que se moviese es "la camara" a traves del fondo, definiria un rectangle que se posicionase en el mismo sitio y comprobaria si colisionan, pero lo que se mueve son los sprites de fondo...

El código de ejemplo esta en el link que pongo.

[EX3]

Cita de: kennyhp en 24 de Abril de 2010, 12:55:58 PM
creo que no me he explicado bien... mi juego es totalmente 2D
XNA trabaja puramente en 3D, aunque sean sprites, internamente trabajas con poligonos, y por ende puedes aplicar transformaciones de mundo de la misma manera que lo harias en 3D, lo cual te da mucha ventaja para realizar zooms, escalados o implementar una camara para desplazarte sobre tu escena 2D.

Mi metodo expuesto antes que utilizo en mi proyecto "no XNA" puede resultar un poco tosco pero en mi caso (por como esta implementada dx_lib32) no puedo aplicar transformaciones ni nada a un conjunto de objetos, si no jugar con offsets y demas calculos independientemente por objeto :-/

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

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

Sergen

#9
La verdad que los enemigos son muy malos y siempre te quieren matar  Oo, joder con los enemigos siempre dando guerra  ???.






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.