Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Consulta carga gráfica

Iniciado por Sadiko, 13 de Junio de 2008, 09:40:31 PM

« anterior - próximo »

Sadiko

Vi los ejemplos y unos juegos que estan para descargar y no logro encontrar la manera de cargar en memoria de un gráfico, particionado, Lo que tengo es un grafico con movimientos y lo que quiero es cargar de ese gráfico, varios gráficos, Asi tengo el movimiento de dicho gráfico...la pregunta es:
¿Se puede?
o los tengo que separar?


Ya que estoy aprovecho otra pregunta, Puedo hacer que la superficie de video tenga dimensiones? Tengo un formulario y quiero que éste este Pantalla completa, pero la carga de video sea 800x600 en el medio, (No necesariamente centrado) La idea es que en el juego hay cosas que son aparte, entonces necesito que la superficie de video este en un cuadrado de 400x300.



gracias.

[EX3]

Wenas. Si se pueden dibujar secciones de un mismo grafico utilizando la funcion MAP_SetRegion() en la que defines el grafico y la region a dibujar.

Un ejemplo:
Dim m_Gfx As New dx_GFX_Class
Dim tileSet As Long ' Grafico que contiene varios tiles (un grafico de 128x64 con tiles de 32x32 por ejemplo)
Dim region As GFX_Rect ' Variable donde indicas la region a dibujar.

...

' Dibujamos la region (0, 32, 32, 64) del grafico:
With region
   .X = 0
   .Y = 32
   .Width = 32
   .Height = 32
End With
Call m_GFX.MAP_SetRegion(tileSet, region) ' Aplicamo la seleccion al grafico.
Call m_GFX.DRAW_Map(tileSet, 0, 0, 0, 0, 0) ' Dibujamos la seleccion en las coordenadas 0,0 con el tamaño definido de la seleccion.

' Dibujamos la region (64, 32, 96, 64) del grafico:
With region
   .X = 64
   .Y = 32
   .Width = 32
   .Height = 32
End With
Call m_GFX.MAP_SetRegion(tileSet, region) ' Aplicamos la seleccion al grafico (siempre despues de llamar a MAP_Draw, MAP_DrawEx y MAP_AdvMap se reinicia la seleccion de MAP_SetRegion).
Call m_GFX.DRAW_Map(tileSet, 100, 100, 0, 64, 64) ' Dibujamos la seleccion en las coordenadas 100, 100 con tamaño 64x64.

Un detalle a tener en cuenta. Como dx_lib32 opera internamente los graficos como texturas en memoria los graficos que uses con MAP_SetRegion deberan ser de tamaño potencia 2 ya que de lo contrario las selecciones no seran correctas al autoreescalarse el grafico no potencia 2 en memoria. Las selecciones pueden ser del tamaño que quieras.

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

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

[EX3]

Cita de: "Sadiko"Ya que estoy aprovecho otra pregunta, Puedo hacer que la superficie de video tenga dimensiones? Tengo un formulario y quiero que éste este Pantalla completa, pero la carga de video sea 800x600 en el medio, (No necesariamente centrado) La idea es que en el juego hay cosas que son aparte, entonces necesito que la superficie de video este en un cuadrado de 400x300.
Esto tendrias que definirlo a mano me temo. Yo lo que hecho alguna vez es definir 2 variables para indicar el offset de origen del area a dibujar y en los objetos o clases que defini para dibujar (una clase sprite por ejemplo) le sumo dichos valores a las coordenadas de dibujo. El area no habil de la pantalla la recubro con un marco a partir de 4 cajas en negro pintadas en ultimo lugar o con profundidad z -8 para quedar siempre por encima de la escena.

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

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

Sadiko

Genial, Gracias por la atención.

Sadiko

Pareciera ser que esto solo funciona en tiempo de ejecución, yo lo que quiero es hacer una carga gráfica y luego volcar los diferentes gráficos

'Movimiento del body
Dim BodyMovement(1 To 6, 1 To 3) As Long


Body = Video.MAP_Load(App.Path & "\body.png", 0, False)

   For I = 1 To 6
       For I2 = 1 To 3
           With region
               .X = 0 '(I - 1) * OffSetBodyH
               .Y = 32 '(I2 - 1) * OffSetBodyV
               .Width = 32 'OffSetBodyH
               .Height = 32 'OffSetBodyV
           End With
           Call Video.MAP_SetRegion(Body, region)
           BodyMovement(I, I2) = Body
       Next
   Next



Lo que quiero, es de la imagen, SACAR una imagen y volcarla en memoria
¿Se puede? La verdad que el trabajo es con muchas imagenes, y no puedo estar trabajando con la imagen que en tiempo de ejecución le da la región para mostrar.

(cambie la variable de referencia a VIDEO)

Espero una respuesta, gracias.

[EX3]

MAP_SetRegion() lo que hace es seleccionar en memoria, de forma temporal, la region que le indiques de la textura para ser dibujada por MAP_Draw, MAP_DrawEX y MAP_AdvMap, pero no genera duplicados o texturas con la seleccion. Tu codigo lo que hace es asignar a cada elemento del array el id de la textura entera, no la region seleccionada.

Lo que deberias hacer es tal y como tienes es almacenar en una lista de tipo GFX_RECT con los valores de las regiones que quieres definir (los tiles, vamos) y llamar a MAP_SetRegion con dichos valores a la hora de dibujar.

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

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

Sadiko

¿No es gastar memoria al divino botón?

Digo, por que con DirectX podes

[EX3]

Cita de: "Sadiko"¿No es gastar memoria al divino botón?

Digo, por que con DirectX podes
Gastas mas memoria de la tarjeta grafica duplicando texturas, aunque sean secciones, que usando una para una misma animacion, sin contar que es mas rapido leer de una textura que de varias distintas en cortos periodos de tiempo (cada vez que actualices el fotograma de la animacion, en cuestion de milisegundos) ya que evitas trafico innecesario a la grafica y ganas en rendimiento.

El metodo que te comento, que es el que se utiliza de siempre, un array con la informacion de posiciones de los frames de la animacion utilizando una estructura con valores {x, y, ancho, alto}, la estructura GFX_Rect por ejemplo (16 bytes), para una animacion de 20 frames dificilmente te llegara a pasar de 320 bytes (16 * 20) mientras que generar una lista de 20 texturas pueden llegar a ocupar en memoria varios megabytes, dependiendo de los tamaños, ya que estas se descomprimen en la memoria de la tarjeta cuando las cargas aun siendo el original un JPG o un PNG y esto lo hace la propia tarjeta grafica, no dx_lib32 ni DirectX. Esto quizas para una sola animacion pienses que da igual una cosa que otra, que no vas a notar diferencia en consumo y rendimiento, pero cuando el juego avance y tengas que meter mas graficos y mas animaciones lo vas a notar.

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

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

Sadiko

Genial por la aclaraciòn, Estoy probando, la cosa que es mi juego se puede llegar a visualizar mas de 100 gráficos en pantalla , tirando al MAXIMO, pero es posible...

Ahora me metí con la iluminación y me agarro la duda, Solo por los vértices se maneja la iluminación?

estube probando y hice un algoritmo, xq manejo gráficos de 32x32 o 64x64
para que la iluminación aparesca alrededor de mi personaje y mientras me muevo, desaparesca de una y aparesca en la otra, pero la verdad q solo con los vértices se me complica ... ¿Alguna forma de controlar la iluminación de el centro o los costados?

[EX3]

La iluminacion por vertices es algo tediosa de manejar asi a pelo. Yo aun estoy experimentando con un motor que tengo entre manos donde defino objetos emisores de luz (una coordenada de referencia como foco de luz, un radio de alcance y un valor de color) y la clase de sprites calcula valores segun distancia de sus vertices al foco de luz mezclando color base de vertice con el del foco de luz.

Aun asi, muchos efectos de iluminacion los podrias simular con primitivas como la de esta antigua captura:



Puedes iluminar zonas con DRAW_Trapezoid() o utilizar imagenes con degradados semitransparentes y generar haces de luz sobre la escena de forma rapida y facil. Lo de la iluminacion por vertice esta mas bien pensado para utilizar con tiles:



Aunque el uso real que pensaba aplicarle es para objetos concretos o personajes, para intentar simular "volumen" segun la posicion de la luz y que no quede iluminado de forma plana.

En resumen, que es una funcion experimental que ofrece la libreria, al igual que la futura funcion de dibujo libre de vertices en texturas que permitira hacer cosas como este efecto de ondas sobre texturas de la libreria para C++ de Loover IndieLib:



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

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

Sadiko

Claro...

yo lo que no queria era crear la funcion de Particulas con Dx8 y facilitarmela .... Por que si tu tienes un personaje y camina por tiles, esta jodido que quede bien la iluminacion a su alrededor. pero bueno, veremos


Ahora voy a probar lo de DRAW_Trapezoid()
èxitos!






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.