Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





juego con muchas pantallas

Iniciado por divmas, 22 de Marzo de 2011, 12:36:04 AM

« anterior - próximo »

divmas

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

[EX3]

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...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

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

divmas

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?

[EX3]

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...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

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

divmas


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

[EX3]

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...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

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

divmas

exacto... como implemento eso??

gracias

[EX3]

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...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

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

divmas

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

divmas

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

Mars Attacks

Traduce "update" y te llevarás una sorpresa sobre cuándo hay que actualizarlo :)

[EX3]

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... :)
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

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

[EX3]

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...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

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

divmas

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?

Hechelion

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]






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.