Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Dx_lib32 Version 2.1 Liberada

Iniciado por [EX3], 08 de Abril de 2006, 05:57:18 PM

« anterior - próximo »

[EX3]

 Wenas, pBarros.

Lo primero que cualquier duda que vayais a preguntar os agradeceria que lo hicierais en un nuevo tema y no en uno ya abierto, de esa forma me es mas facil localizar nuevas dudas al igual que para otros localizar una posible solucion a un problema similar ;)

Respondiendo a tu consulta, dx_GFX_Class.DEVICE_SetDisplayMode() permite cambiar totalmente el modo de video establecido en dx_GFX, si te fijas uno de los parametros Windowed, al igual que en dx_GFX_Class.Init() indica a dx_GFX si debe ejecutarse en modo ventana o en pantalla completa.

Supongamos que iniciastes tu programa en modo pantalla completa y quieres pasar a modo ventana con la misma resolucion, la llamada seria asi:
'suponiendo que dx_GFX esta instanciada en la variable m_GFX:
Call m_GFX.DEVICE_SetDisplayMode(m_GFX.Screen.Width, m_GFX.Screen.Height, m_GFX.Screen.Bpp,  Not m_GFX.Windowed, m_GFX.TripleBuffer, m_GFX.vSync, m_GFX.Screen.RefreshRate)

Esta llamada establece el mismo modo de video que teniamos establecido obteniendo los datos del objeto/propiedad Screen de dx_GFX (no confundir con la propiedad Screen de Visual Basic 6.0) que almacena las propiedades del modo de video establecido, y altera el valor del parametro Windowed para que se asigne el valor contrario, en este caso al estar el modo de video en modo pantalla completa el valor de dx_GFX.Windowed es Falso, al aplicarle el operador Not lo invierte a Verdadero, de esta forma el parametro Windowed de dx_GFX_Class.DEVICE_SetDisplayMode() seria Verdadero y el modo de video se estableceria en tiempo de ejecucion a modo ventana con los mismos parametros de la resolucion que teniamos. De esta forma evitas tener que hacer lo que decias:
Citar¿Debo hacer un terminate y luego un init nuevamente?
Ya que de esta forma perderias toda la informacion de graficos cargados en memoria al igual que cualquier configuracion establecida en dx_GFX amen aparte de ser un proceso mas costoso que el realizado por dx_GFX_Class.DEVICE_SetDisplayMode().

Sobre como realizar esta llamada al hacer Alt-Enter mira el evento KeyUp del Formulario en Visual Basic 6.0. La forma seria asi mas o menos:
Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer)
   If KeyCode = vbKeyReturn And Shift = 1 Then
       Call m_GFX.DEVICE_SetDisplayMode(m_GFX.Screen.Width, m_GFX.Screen.Height, m_GFX.Screen.Bpp,  Not m_GFX.Windowed, m_GFX.TripleBuffer, m_GFX.vSync, m_GFX.Screen.RefreshRate)

   End If

End Sub

De todas formas, ahora me encuentro en mitad de una clase y puede que haya cometido algun error en lo expuesto arriba (mi memoria es muy traicionera :P) asi que cuando llegue a casa te confirmo lo expuesto, pero aun asi pruebalo.

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

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

pbarros

 Hola,
probé el código, pero no hubo caso, se me cuelga el PC... voy a seguir intentando, en una de esas es una incompatibilidad de los eventos de teclas de Visual y los de DirectX.

Poco después...
Comprobé lo de las teclas... no es ese el problema, creo q el problema es de la rutina DEVICE_SetDisplayMode, por favor José M. revisa eso si tienes tiempo.

Gracias

[EX3]

 Sorry que al final se me paso revisar lo que puse  (nooo)

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If Shift = 4 And KeyCode = vbKeyReturn Then
   Call DebugPrint("Cambiando modo de video...")
   
   Call m_GFX.DEVICE_SetDisplayMode(m_GFX.Screen.Width, m_GFX.Screen.Height, m_GFX.Screen.Bpp, Not m_GFX.Windowed, m_GFX.TripleBuffer, m_GFX.VSync, m_GFX.Screen.RefreshRate)
   
End If

End Sub

Este es el codigo que uso en la ventana del TLSA Engine (el motor del juego que pretendo desarrollar). Este codigo actuaria en cuanto hicieras Alt+Enter, cada vez que se ejecuta alternarias entre el modo ventana o pantalla completa.

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

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

pbarros

 Hola José,
no me resulta, lo del Alt+Enter si lo hice (la combinación de teclas), ningún problema, pero la sentencia:

   Call m_GFX.DEVICE_SetDisplayMode(m_GFX.Screen.Width, m_GFX.Screen.Height, m_GFX.Screen.Bpp, Not m_GFX.Windowed, m_GFX.TripleBuffer, m_GFX.VSync, m_GFX.Screen.RefreshRate)


es la que me está colgando Visual... el código es el mismo, sólo que instancio a la clase con otro nombre:


Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
 If Shift = 4 And KeyCode = vbKeyReturn Then
  Call DebugPrint("Cambiando modo de video...")
  Call Grafico.DEVICE_SetDisplayMode(Grafico.Screen.Width, Grafico.Screen.Height, Grafico.Screen.Bpp, Not Grafico.Windowed, Grafico.TripleBuffer, Grafico.VSync, Grafico.Screen.RefreshRate)
 End If
End Sub


uso Visual Basic 6, y tengo la librería... la 2.1.188, no sé que puede ser...  :(  

[EX3]

 Dices que te da error (una excepcion de windows, error de VB...) o que te cuelga el programa? Si es lo segundo trata de leer el valor devuelto por la funcion DEVICE_SetDisplayMode() (Verdadero o falso) y la funcion Frame() y comprueba que error te devuelve. Tienes la descripccion de cada error en la documentacion. En teoria el unico error por asi decirlo que puede dar es que el Device de Direct3D no logre resetearse aunque a mi solo me ha ocurrido una vez de tropecientas^2 que he probado esta funcion, es mas, en el TLSA Engine que es donde mas testeo ultimamente la dx_lib32 todavia no me ha fallado nunca.

Otra pregunta, segun recuerdo tratabas de pasar de modo ventana a pantalla completa, que resolucion estas usando en modo ventana? (recuerdo que en modo ventana se puede aplicar cualquier resolucion sea o no generica) Si la resolucion no es generica (640x480, 800, 600, etc...) en modo pantalla completa no lo aceptara.

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

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

pbarros

 Sólo se me cuelga el PC, más bien dicho Visual, no lo tengo compilado, sólo le pongo ejecutar y cuando presiono las teclas se cuelga, por lo tanto, no alcanza a arrojar mensaje alguno, debo finalizar la tarea. Estoy usando 800x600 y el bpp por defecto (16 creo).

Option Explicit
Dim Grafico As dx_GFX_Class
Dim Looping As Boolean

Private Sub Form_Load()
Me.Show

Set Grafico = New dx_GFX_Class

Call Grafico.Init(Me.hWnd, 800, 600, , True)

Looping = True

Dim Fondo As Long

Fondo = Grafico.MAP_Load(App.Path & "\space.png", 0)
Do While Looping

   Grafico.DRAW_Map Fondo, 0, 0, 8, Grafico.Screen.Width, Grafico.Screen.Height
   Call Grafico.Frame

Loop
Grafico.MAP_Unload Fondo

Call Grafico.Terminate

Set Grafico = Nothing
End Sub

Private Sub Form_Unload(Cancel As Integer)
 Looping = False
End Sub

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
 If Shift = 4 And KeyCode = vbKeyReturn Then
  Grafico.DEVICE_SetDisplayMode(Grafico.Screen.Width, Grafico.Screen.Height, Grafico.Screen.Bpp, Not Grafico.Windowed, Grafico.TripleBuffer, Grafico.VSync, Grafico.Screen.RefreshRate)
 End If
End Sub


ése es el código... y simplemente se cuelga...

[EX3]

 Genial, encontre un bug en el nucleo de dx_GFX que he podido solucionar facilmente :) El error venia por que si no habia ninguna fuente de texto cargada en memoria dx_lib32 al tratar de resetear el Device se colgaba (con razon no petaba el TLSA), cuando lo logico en este caso en concreto el codigo deberia dar error de indice fuera de intervalo pero weno, cosas de VB6, ya se sabe :P (tengo desactivados todos los controladores internos de VB6 para ganar velocidad y aligerar peso al ejecutable y ya no me suele avisar de desbordamientos y errores tipicos como este ;))

Para la proxima version queda actualizado y solucionado el error. De momento tendras que cargar una fuente de texto en memoria como minimo si pretendes hacer cambios de modo de pantalla, no hay otra solucion en la 2.1.188 :P Este codigo deberia funcionarte:
Option Explicit
Dim Grafico As dx_GFX_Class
Dim Looping As Boolean

Private Sub Form_Load()
Me.Show

Set Grafico = New dx_GFX_Class

Call Grafico.Init(Me.hWnd, 800, 600, , True)

Looping = True

Dim Fondo As Long

Fondo = Grafico.MAP_Load(App.Path & "\space.png", 0)

' Cargamos una fuente en falso para evitar el error al resetear:
Call Grafico.FONT_LoadSystemFont("arial", 10, False, False, False, False)

Do While Looping

  Grafico.DRAW_Map Fondo, 0, 0, 8, Grafico.Screen.Width, Grafico.Screen.Height
  Call Grafico.Frame

Loop
Grafico.MAP_Unload Fondo

Call Grafico.Terminate

Set Grafico = Nothing
End Sub

Private Sub Form_Unload(Cancel As Integer)
Looping = False
End Sub

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
If Shift = 4 And KeyCode = vbKeyReturn Then
 Grafico.DEVICE_SetDisplayMode(Grafico.Screen.Width, Grafico.Screen.Height, Grafico.Screen.Bpp, Not Grafico.Windowed, Grafico.TripleBuffer, Grafico.VSync, Grafico.Screen.RefreshRate)
End If
End Sub


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

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

 Hola, llevo mucho tiempo buscando a alguien que me resuelva un problema y creo que aquí puedo encontrar a esa persona.

Estoy programando en VB6 y tengo una imagen en un Picture. Necesito pasar esa imagen a ARGB y ponerla en un array unidemensional. Si la imagen es de 100x200  el array será Dim array(100x200) as Long.

Cómo se hace esto?


Muchisimas gracias por adelantado


Roberto.

Lex

 Que buena es la ayuda del MSDN para estos casos... Yo te ayudaría, sino fuera porque me da pereza abrir el MSDN, buscar que podría utilizar para hacerlo, hacerlo, probarlo y ponerlo aquí... Pero vamos lo único que te puedo decir así de primeras, es que alguna forma tiene que haber de poder leer los pixels uno por uno del picture box... Y ojo, aunque no creo que pudiera resultar muy problemático, pero el tipo de dato Long es de 32bits con signo, y una imagen ARGB es de 32bits sin signo... lo cual es algo a tener en cuenta cuando se realizan las operaciones... aunque quizás haya alguna función en VB6 que te haga eso sin problemas...

Cita de: "Lex"Que buena es la ayuda del MSDN para estos casos... Yo te ayudaría, sino fuera porque me da pereza abrir el MSDN, buscar que podría utilizar para hacerlo, hacerlo, probarlo y ponerlo aquí... Pero vamos lo único que te puedo decir así de primeras, es que alguna forma tiene que haber de poder leer los pixels uno por uno del picture box... Y ojo, aunque no creo que pudiera resultar muy problemático, pero el tipo de dato Long es de 32bits con signo, y una imagen ARGB es de 32bits sin signo... lo cual es algo a tener en cuenta cuando se realizan las operaciones... aunque quizás haya alguna función en VB6 que te haga eso sin problemas...
Gracias por tu consejo, como dije llevo tiempo mirando y no encuentro nada en MSND. Gracias de todas formas.


Roberto.

[EX3]

 No se si va referido tu cuestion con dx_lib32 o no (el tema del ARGB me despista un poco con la poca informacion que das) pero si es el caso no precisas de un PictureBox para cargar una imagen en formato ARGB, dx_lib32 trabaja internamente todas las imangenes en formato ARGB (D3DFMT_A8R8G8B8 de Direct3D) y con MAP_Load()  puedes cargar una imagen en memoria, con SURF_Load() si quieres luego leer los pixeles de la imagen, te bastan para trabajar con la imagen en memoria. Si tu idea era trabajar con el formato ARGB en VB6 a "pelo" olvidate por que VB6 solo trabaja con formato RGB de toda la vida, vamos, que no trabaja con canal alfa en colores (16/24 bits solo).

Si tu intencion simplemente es leer los pixeles de la imagen (en formato ARGB no se para que por el canal alfa de un color en una imagen siempre sera valor absoluto 255 y en este caso te daria igual tratar con valores RGB a secas) puedes cargar la imagen mediante SURF_Load() y extraer la informacion de los pixeles mediante SURF_GetPixelData() y leer los valores de cada pixel de la imagen mediante SURF_GetPixel() y escribiendo valores mediante SURF_SetPixel(). Rrecuerda una vez que hayas escrito todos los pixeles que quieras que para que se graben en la imagen en memoria tienes que llamar al final a SURF_SetPixelData() para guardar los cambios.

Si solo quieres leer el color de un pixel de una imagen, formato RGB de toda la vida, mira en la seccion del foro Codigo de la Semana que subi un codigo para cargar y leer los pixeles de imagenes en memoria mediante el API de Windows sin usar DirectX.

Para cualquier otra consulta que no tenga nada que ver con dx_lib32 agradeceria que lo hicierais en el foro general de programacion que igualmente os la contestare. De momento cierro ya este hilo por que se esta derivando en varias cuestiones que se alejan sobre consultas de informacion o dudas acerca de la ultima version descrita en este hilo sobre dx_lib32. Cualquier consulta sobre dx_lib32 abrir un tema nuevo en este subforo ;)

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

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






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.