Logo

¡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.
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.