Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Calculo coordenadas en 800x600 16bit bajo directx

Iniciado por notoi, 13 de Marzo de 2009, 06:42:26 PM

« anterior - próximo »

notoi

Pues eso, justo hara poco he comenzado a programar un juego bajo directx7. Ya hize las rutinas basicas d inicializacion en 800x600 16bits, tb hize prueba de sacar un grafico en la pantalla tras cargar el bitmap. Y bueno empeze a codificar una rutina de putpixel(x,y,color) mas o menos, y no me imprime en el lugar donde deberia ser.

Yo pensaba que el calculo de la posicion seria algo asi:    offset=(coordenadaY*800)+CoordenadaX
Y entonces                                                                                     screenpointer[offset]=(WORD)color16;   siendo screenpointer un puntero al principio de la pantalla.

Tambien lo he probado directamente asi:

   screenpointer[0]=(WORD)color16;                    0,0
   screenpointer[800]=(WORD)color16;               0,1
   screenpointer[1600]=(WORD)color16;             0,2
   screenpointer[2400]=(WORD)color16;             0,3


Y no salen alineados, salen los pixels dispersados. Alguien me puede decir como es el formato de pantalla de 800x600 16 bit?????

Calantra

#1
Cita de: notoi en 13 de Marzo de 2009, 06:42:26 PM
Pues eso, justo hara poco he comenzado a programar un juego bajo directx7. Ya hize las rutinas basicas d inicializacion en 800x600 16bits, tb hize prueba de sacar un grafico en la pantalla tras cargar el bitmap. Y bueno empeze a codificar una rutina de putpixel(x,y,color) mas o menos, y no me imprime en el lugar donde deberia ser.

Yo pensaba que el calculo de la posicion seria algo asi:    offset=(coordenadaY*800)+CoordenadaX
Y entonces                                                                                     screenpointer[offset]=(WORD)color16;   siendo screenpointer un puntero al principio de la pantalla.

Tambien lo he probado directamente asi:

   screenpointer[0]=(WORD)color16;                    0,0
   screenpointer[800]=(WORD)color16;               0,1
   screenpointer[1600]=(WORD)color16;             0,2
   screenpointer[2400]=(WORD)color16;             0,3


Y no salen alineados, salen los pixels dispersados. Alguien me puede decir como es el formato de pantalla de 800x600 16 bit?????


Hola buenas, creo que deberias probar a multiplicar la formula del offset x2:
offset=(coordenadaY*800)+CoordenadaX *2


Si trabajas con graficos de 16 bits se supone que usaras 2 bytes por cada punto en pantalla para la paleta.

También puedes definir una variable para los bpp , y usar esta formula :
int bpp = 16;
offset=(coordenadaY*800)+CoordenadaX *( bpp / 8 ) ;



Esto debería funcionar, ya nos contarás.

Salu2.


0 for i=0 to 1000<br>20 print "Ya soy programador"<br>30 next i<br>

notoi

Gracias por tu respuesta pero no se si funcionara. Porque como he puesto anteriormente:

------------------------------------------------                 X,Y

screenpointer[0]=(WORD)color16;                    0,0
screenpointer[800]=(WORD)color16;               0,1   1*800+0= 800
screenpointer[1600]=(WORD)color16;             0,2   2*800+0=1600
screenpointer[2400]=(WORD)color16;             0,3   3*800+0=2400


El offset siempre esta a 0(coordenada X) entonces segun lo anterior deberian salir alineados, pero a mi me aparece los pocos puntos separados bastante en horizontal. Igual me hace pensar q a lo mejor hay algo que he definido mal, el puntero o yo q  se. Lo mirare con calma. Porque no me cuadra.Gracias de todas maneras.

Pogacha

#3
No se supone que en una surface de dx tienes que usar el pitch?

O sea, tienes que llamar a get surface description (no se como se llama la funcion) y te devuelve una estructura con informacion de la surface.
Luego, uno de los datos se llama pitch

void* dir =  (byte*)pointer + pitch * y + x * bytes_per_pixel;

Fijate en la documentacion.

notoi

Ahora si lo veo mas claro. Acabo de ver el esquema de una surface en la documentacion y lo que es el Pitch. Gracias amigo ;)






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.