Foros - Stratos

Proyectos => Proyecto dx_lib32 => Mensaje iniciado por: divmas en 22 de Marzo de 2011, 12:36:04 AM

Título: juego con muchas pantallas
Publicado por: divmas en 22 de Marzo de 2011, 12:36:04 AM
Hola,

está claro que la libreria está diseñada para trabajar en una única ventana, así que mi duda es: se puede hacer un juego que requiere de muchas pantallas(ventanas) diferentes?

como se implementaria?

Gracias
Título: Re: juego con muchas pantallas
Publicado por: [EX3] en 22 de Marzo de 2011, 01:03:57 AM
No se puede por que dx_lib32 solo puede gestionar un render grafico al mismo tiempo. Puedes probar a crear varias instancias de la clase gráfica en el programa pero no se si te dara problemas (no recuerdo si lo llegue a probar alguna vez), y ten en cuenta que cada instancia de la clase grafica necesitara sus propios graficos (es como si fueran programas distintos).

Salu2...
Título: Re: juego con muchas pantallas
Publicado por: divmas en 22 de Marzo de 2011, 09:16:32 AM
Lo que no entiendo entonces es como programan esos juegos que tienen tantas pantallas porque aunque esta libreria no soporte mas de un render a la vez, en realidad programar sobre directx es igual si no me equivoco. Estoy mirando y no entiendo como se puede hacer eso.

Alguna sugerencia?
Título: Re: juego con muchas pantallas
Publicado por: [EX3] en 22 de Marzo de 2011, 09:51:00 AM
No es tan sencillo. Para programar en varias pantallas a la vez se ha de usar un mecanismo llamado Swap Chains, y esto es en tanto en DirectX como en OpenGL. Ese sistema se supone permite crear varios renders asociados a distintos contenedores (Ventanas por ejemplo) y todos asociados a la misma instancia y recursos de Direct3D. Piensa tambien que no es comun hacer juegos que utilicen mas de un monitor, yo de hecho en mas de 10 años nunca he jugado ninguno en PC que lo haga y no me era necesidad implementar esa función. Realmente ese mecanismo se utiliza para mas desarrollar herramientas como editores 3D que necesitas diferentes vistas de una misma escena que en juegos donde solo usas una sola vista.

Salu2...
Título: Re: juego con muchas pantallas
Publicado por: divmas en 22 de Marzo de 2011, 10:16:27 AM

Quizás me he explicado mal, es que yo lo que necesito es:

quiero hacer un juego tipo manager y por lo tanto necesito varias pantallas: alineación, tácticas, etc....

como puedo hacer eso???


gracias por todo
Título: Re: juego con muchas pantallas
Publicado por: [EX3] en 22 de Marzo de 2011, 10:30:42 AM
Cita de: divmas en 22 de Marzo de 2011, 10:16:27 AM
quiero hacer un juego tipo manager y por lo tanto necesito varias pantallas: alineación, tácticas, etc....
Por diferentes pantallas me hablas de diferentes secciones/estados de tu juego? (Introducción, menú principal, configuración, juego, game over, créditos, etc...)

Salu2...
Título: Re: juego con muchas pantallas
Publicado por: divmas en 22 de Marzo de 2011, 10:46:24 AM
exacto... como implemento eso??

gracias
Título: Re: juego con muchas pantallas
Publicado por: [EX3] en 22 de Marzo de 2011, 12:16:06 PM
La respuesta son Maquinas de estados. La idea es separar logicamente secciones del juego como compartimentos aislados con su propio codigo y desde de un punto principal del programa, mediante x estados ejecutar el compartimento o seccion correspondiente. Piensalo como si hablaramos de un select case y cada caso fuera un estado diferente del juego. Lo mas comodo para programarlo es que separes en clases cada seccion de tu juego y siguieras un patron tipo Actualizar y Dibujar, dos metodos que tuvieran cada compartimento para tal acciones, de esa forma en ese select case solo tendrias llamadas al metodo Update() y el metodo Draw() de cada estado:

Una lista de estados predefinda:
enum GameStates
    menu
    juego
    configuracion
    gameover
end enum


Variable global que controlara el estado en que se encuentra el programa:
public estado as gameStates

estado = menu


Codigo para actualizar los estados del programa:
select case estado
    case menu
        claseMenu.Update()
    case juego
        claseJuego.Update()
    case configuracion
        claseConfiguracion.Update()
    case gameover
        claseGameOver.Update()
end select


Codigo para actualizar la vista del programa:
select case estado
    case menu
        claseMenu.Draw()
    case juego
        claseJuego.Draw()
    case configuracion
        claseConfiguracion.Draw()
    case gameover
        claseGameOver.Draw()
end select


La idea por ejemplo seria que si estas en el estado juego y matan a tu personaje querras mostrar la pantalla de Game Over y las opciones de continuar o volver al menu del juego, eso seria principalmente cambiar el estado de "juego" a "gameover" para que el Select Case ejecute el codigo de la pantalla de gameover, y dicho codigo tendra las opciones pertinentes para o bien volver al estado de juego (inicializando el codigo necesario del juego por ejemplo para resetear el nivel) o bien para volver al menu principal del programa.

Esto en verdad te lo puedes montar de mil maneras pero la idea es generalmente esta.

Salu2...
Título: Re: juego con muchas pantallas
Publicado por: divmas en 22 de Marzo de 2011, 12:50:18 PM
Muchas gracias por tu ayuda. Intentaré implementar esas pantallas como has comentado esperando tener éxito.

Aprovecho para darte la enhorabuena, tanto por la libreria como por la labor de ayuda constante.

Un saludo
Título: Re: juego con muchas pantallas
Publicado por: divmas en 22 de Marzo de 2011, 05:51:53 PM
estaba probando tus consejos y perdona, sólo una cosa:

el select case del metodo draw está claro que ha de ir dentro del loop pero el método update donde iria? ya que no hay que ir actualizando constantemente.

Entiendo que en draw va todo el dibujado y en update la carga de recursos. Es asi?

Gracias una vez más
Título: Re: juego con muchas pantallas
Publicado por: Mars Attacks en 22 de Marzo de 2011, 08:01:37 PM
Traduce "update" y te llevarás una sorpresa sobre cuándo hay que actualizarlo :)
Título: Re: juego con muchas pantallas
Publicado por: [EX3] en 22 de Marzo de 2011, 10:31:55 PM
Update/Actualizar - Siempre antes que los graficos:
- Fisicas/Colisiones
- IA
- Estados de los personajes y elementos del juego
- Lectura del input
- Calculos varios
- Etc...

Draw/Dibujar - Siempre despues de actualizar todo:
- Solo dibujo, nada de calculo ni logica alguna. Los calculos necesarios y cambios de estado en los graficos los habras realizado en la actualización.

Salu2... :)
Título: Re: juego con muchas pantallas
Publicado por: [EX3] en 22 de Marzo de 2011, 10:40:56 PM
Piensa que tu bucle principal tendria que tener simplemente una estructura tan sencilla como esta:
Do While Condicion
    Juego.Update()
    Juego.Actualizar()
Loop


Juego.Update() tendria todas las llamadas a los metodos Update de cada elemento de tu juego:
Sub Update()
    Dim Elemento As ElementoJuego
    For Each Elemento In ListaElementos
        If Elemento.Enabled Then Elemento.Update()
    Next
End Sub


Juego.Draw() todas las llamada a los metodos Draw de cada elemento de tu juego.
Sub Draw()
    Dim Elemento As ElementoJuego
    For Each Elemento In ListaElementos
        If Elemento.Visible Then Elemento.Draw()
    Next
End Sub


ElementoJuego es una definicion de lo que vendria a ser cualquier clase que definas en tu juego que tenga su metodo Update() y Draw() y sus propiedades Enabled y Visible.

Cada una de estas funciones internamente pueden dividirse en mas niveles y asi sucesivamente segun como diseñes tu codigo. Resultado? Un bonito arbol de llamadas facil de seguir y de depurar asi como de limpio y organizado a la par de facil de mantener. Esto, muy en base, es el sistema de componentes que tanto hablo en otros post y que desde hace años implemento en mis desarrollos y no es nada nuevo bajo el sol ya que este tipo de implementacion la vas a encontrar en la mayoria de software y herramientas como XNA o Unity3D :)

Salu2...
Título: Re: juego con muchas pantallas
Publicado por: divmas en 24 de Marzo de 2011, 11:57:51 PM
Se supone que la carga de recursos iria en update?

si va en el método update de la clase de la pantalla en cuestión  se carga constantemente, si se pone en draw igual....

entonces?
Título: Re: juego con muchas pantallas
Publicado por: Hechelion en 25 de Marzo de 2011, 01:17:20 AM
La carga de recursos sólo se hace una vez y tienes dos formas de hacerlo, si el juego es pequeño te puedes cargar todo antes. Si el juego es grande puedes hacer una máquina de estados donde uno de los estados sea cargar los recursos y que solo se ejecute una vez.


Cargar_Recursos

Do while.....
ciclo principal
Loop

Descargar_recursos



Do while MainLoop
     Select Case Estados
            case 0: CargarRecursos
            case 1: ciclo principal
     end select
Loop

Private sub CargarRecursos
     ....
     ....
     ....
      Estados = 1 'mueves el estado del juego una vez cargado los recursos
End sub

[code]

No es necesario que uses el mismo código, estoy solo ejemplificando la forma de hacerlo.
[/code]
Título: Re: juego con muchas pantallas
Publicado por: [EX3] en 25 de Marzo de 2011, 01:54:25 AM
La logica y el dibujado nada tienen que ver con la gestion o carga de recursos. La logica solo comprende la parte no visible del elemento como son calculos, lecturas de input, colisiones, etc...  y el dibujado unicamente la parte visible, solo las llamadas graficas que reflejan los cambios realizados en la logica (de ahi que siempre se ejecute la logica antes del dibujado). La carga de recursos es un proceso puntual del juego.

Cita de: Hechelion en 25 de Marzo de 2011, 01:17:20 AM
La carga de recursos sólo se hace una vez y tienes dos formas de hacerlo, si el juego es pequeño te puedes cargar todo antes.
En XNA por ejemplo viene predefinido en la clase principal del proyecto un método llamado LoadContent() y otro llamado UnloadContent() que es donde se escribe todo el codigo de carga y descarga de recursos del juego. Esto viene bien si tu juego es pequeño, defines toda la carga en un mismo punto que solo se ejecutara una única vez al iniciar el programa. Cuando el juego es mas grande puedes seguir la idea de Hechelion o definir bien la estructura de tu juego, por ejemplo, la carga de recursos puede ser parte del constructor de la clase principal que representa el nivel del juego, que en base a un archivo listado cargue e inicialice los elementos definidos de dicho escenario. Entidades como los enemigos, su constructor puede realizar la carga de los recursos relacionados.

Salu2...