Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Menu

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menu

Mensajes - SrDurden

#1
Proyectos / Juego En Java (applet)
17 de Julio de 2005, 01:41:08 PM
 Tengo intención de programar un juegecillo en java para que puedar ser jugado a través de la web..

¿Me puede dar problemas?

Es un juego de puzles en 2d, así que tampoco necesitaré mucha potencia.. ¿Alguna recomendación?

Saludotes :)
#2
Programación gráfica / ¿como Hacer Esto?
02 de Octubre de 2004, 08:28:02 PM
 No entiendo pq se tiene que utilizar un double buffer..

y que es TablaDeAlturas[i+1][j&1]+=TablaDeAlturas[(j+1)&1]; ? y que es ese &1?

Saludotes,

SrDurden  :(  
#3
Programación gráfica / ¿como Hacer Esto?
27 de Septiembre de 2004, 10:39:41 PM
 Pochaga, gracias por el aviso del >, no me había dado cuenta, cosa de las prisas :P Lo de ix y jy fue por las prisas, en principio iba a ser i y j como toda la vida  ;)

Me ha gustado la idea de la tabla de alturas y el suavizado, con el código a saco se me sale de rango en alguna parte, pero mañana me pondré a buscar por donde me está petando :P

Con unas modificaciones del código de ayer hoy he conseguido esto:



Pero igualmente mañana probaré lo de la tabla de altura con el suavizador por promedio, me ha gustado la idea :P

Saludotes y gracias a todos,

SrDurden (mola)

PD=EDIT: Con lo que me has dicho y la imagen que he colgado, me he dado cuenta que me olvido dos pixeles a la derecha, uno encima y otro a la izquierda! Esas mates y esas prisas, jeje
#4
Programación gráfica / ¿como Hacer Esto?
26 de Septiembre de 2004, 06:36:09 PM
 He estado leyendo sobre perlin.. ¿Es un tipo de ruido, verdad?

Teniendo en cuenta que lo único que quiero es suavizar un poco los bordes.. me saldría a cuenta utilizar el perlin noise?

Aparte que únicamente utilizo dos colores.. ¿Vale la pena?

Y.. ¿alguien me podría explicar de manera sencilla en que consiste?

Saludotes! (mola)

PD=Alguien sabe pq no puedo por ejemplo editar el mensaje anterior?
#5
Programación gráfica / ¿como Hacer Esto?
26 de Septiembre de 2004, 05:52:25 PM
 ¿que es un perlin?
#6
Programación gráfica / ¿como Hacer Esto?
26 de Septiembre de 2004, 03:47:18 PM
 Perdón, soy un novato, la acabo de volver a cagar  (nooo)

el mensaje que se me ha quedado a medias me es imposible editarlo, lo dejo por perdido.

Saludotes! (mola)
#7
Programación gráfica / ¿como Hacer Esto?
26 de Septiembre de 2004, 03:46:18 PM
 Se me ha fastidiado todo y encima no me ha dejado reeditar, vuelvo a copiar todo el post:

Hola!

Al final ayer por la noche encontré un libro que tenía hace tiempo por casa, "Cómo programar videojuegos en Windows", y el segundo ejemplo era más o menos lo que buscaba, implementaban bajo directX 8.0 una función PutPixel en la que dibujabas un pixel en pantalla. He hecho otra basándome en esta llamada ColorPixel, en la que le pasas unas coordenadas de la pantalla y te dice que Color tiene ese pixel.

A partir de ahí he hecho este código:


for (WORD jy=479; jy>0; jy-- ) {
    for (WORD ix=639; ix>0; ix-- ) {
if (jy<350) { if (ColorPixel(ix,jy+1)==0xFFFF) PutPixel(ix,jy,0xFFFF);
 if ((rand()%3==1)&&(ix<639)&&(ColorPixel(ix+1,jy+1)==0xFFFF)) { PutPixel(ix,jy,0xFFFF); PutPixel(ix-1,jy,0xFFFF); }
 if ((rand()%3==1)&&(ix>0)&&(ColorPixel(ix-1,jy+1)==0xFFFF)) { PutPixel(ix,jy,0xFFFF); PutPixel(ix+1,jy,0xFFFF); }

 else { if (rand()%9000==1)  PutPixel(ix,jy,0xFFFF);  } }
 
 }


La pantalla tiene una resolución de 640*450, con 16 bits de color (de ahí el WORD).

Lo que pretendo es pintar una imagen en blanco y negro que sea la máscara del terreno. Es decir, la forma del terreno. Los pixeles blancos (0xFFFF) son la parte del mapa que no formara parte del terreno, para entendernos, donde irá el cielo  :P Como la pantalla empieza siendo de color negro, lo único que se tendría que hacer es ir añadiendo pixeles blancos creando el cielo.

Para crear la forma del terreno, la función mira si el pixel inferior al actual (justo el de debajo) es de color blanco, si es de color blanco el pixel se pinta de color blanco. Esto acabará creando una tira blanca hacia arriba. Si sólo hiciera esto, quedarían un montón de rallitas blancas en la parte superior de la pantalla, en diferentes alturas, por lo que sería un terreno injugable. Así que a veces (sólo a veces, para darle más aletoriedad al terreno) mira si el pixel inferior derecho o izquierdo del actual es de color blanco, si es de color blanco pinta el pixel actual de color blanco. Esto hace que se vayan creando elevaciones de terreno rectas, para que el jugador pueda caminar. Si no tiene un pixel blanco cercano a él, hay una posibilidad sobre 9000 ((rand()%9000==1)) para que el pixel actual se pinte de blanco.

Por tanto acaba quedando el terreno con unos 7 u 9 picos, a diferentes alturas, formando una especie de triangulos. Vamos, esto:

   
 

Cada vez que se ejecuta el programa sale una forma diferente.

En principio esto ya me sirve, pero alguien se le ocurre como mejorar el algoritmo para que queden formas más redondeadas, en plan montes? Quiero decir, en vez de acabar en un pico acabar en un pico más suavizado, más redondeado.

Saludotes y gracias,

SrDurden (mola)
#8
Programación gráfica / ¿como Hacer Esto?
26 de Septiembre de 2004, 03:30:04 PM
 Hola!

Al final ayer por la noche encontré un libro que tenía hace tiempo por casa, "Cómo programar videojuegos en Windows", y el segundo ejemplo era más o menos lo que buscaba, implementaban bajo directX 8.0 una función PutPixel en la que dibujabas un pixel en pantalla. He hecho otra basándome en esta llamada ColorPixel, en la que le pasas unas coordenadas de la pantalla y te dice que Color tiene ese pixel.

A partir de ahí he hecho este código:


for (WORD jy=479; jy>0; jy-- ) {
for (WORD ix=639; ix>0; ix-- ) {
 
 //CODIGO DE LOS FOR  
 if (jy<350) { if (ColorPixel(ix,jy+1)==0xFFFF) PutPixel(ix,jy,0xFFFF);
 if ((rand()%3==1)&&(ix<639)&&(ColorPixel(ix+1,jy+1)==0xFFFF)) { PutPixel(ix,jy,0xFFFF); PutPixel(ix-1,jy,0xFFFF); }
 if ((rand()%3==1)&&(ix>0)&&(ColorPixel(ix-1,jy+1)==0xFFFF)) { PutPixel(ix,jy,0xFFFF); PutPixel(ix+1,jy,0xFFFF); }

 else { if (rand()%9000==1)  PutPixel(ix,jy,0xFFFF);  } }
 



 //SE CIERRA EL CODIGO DE LOS FOR
 }
#9
Programación gráfica / ¿como Hacer Esto?
25 de Septiembre de 2004, 08:48:55 PM
 Hola!

Warchief, podrías mandarme los dos ficheros? me interesa  :P  

srdurden@gmail.com

Pogacha, el algoritmo lo tengo pensado un poco por encima, no pretendo hacer nada demasiado complicado, simplemente una imagen en blanco y negro con un terreno muy básico. Había pensado recorrer la imagen de abajo hacia arriba, y en cada línea mirar si en el pixel que tenga justo debajo hay terreno pintado o no, si hay hacer un random para ver si añado terreno o no.  Nada demasiado complicado, tendré que mejorar alguna cosilla (por ejemplo, para que no se creen barrancos) y listos :P

Todavía no sé que API utilizaremos porqué el juego lo haré con un compañero, es una práctica de una ALE (asignatura de libre elección) de la facultad, me imagino que tiraremos por SDL o directX. Anteriormente ya había hecho mis pinitos con allegro, SDL, div games studio y algo de directX.

Ethernet, ahora me miro el código, muchas gracias.

Saludotes y gracias a todos por contestar,

SrDurden (mola)






#10
Programación gráfica / ¿como Hacer Esto?
24 de Septiembre de 2004, 09:51:35 PM
 Ok, pos voy a mirarme alguna API sencillita para ir probando cosas, ya os iré explicando  ;)

Muchas gracias por todo,

SrDurden (mola)
#11
Programación gráfica / ¿como Hacer Esto?
24 de Septiembre de 2004, 09:04:54 PM
 Todavía no lo tengo pensado.

¿Alguna recomendación fácil? Es que ahora mismo solo quiero intentar hacer esto, es decir, crear la imagen aleatoria y mostrarla por pantalla...

Igualmente lo que tenía planeado era hacer servir imagenes BMP sin comprimir, por lo que en el fondo se podría poner una tira de bits con una cabecera, guardarla en el disco duro en un archivo con extensión BMP y después abrirlo con el Paint mismo.

¿Podría hacerlo directamente sin tener que hacer servir ninguna API ni librería?

Saludotes! (mola)
#12
Programación gráfica / ¿como Hacer Esto?
24 de Septiembre de 2004, 07:44:14 PM
 Hola!

Tengo pensado hacer un juego en plan Worms y me gustaría hacer un "generador" de terrenos. Más o menos tengo pensado como hacerlo pero antes de comenzar necesito saber algo básico...

¿Como podría crear un BMP? Tengo pensado programar el juego en C o en C++, soy muy novatillo en el tema y no sé ni donde buscar..

¿Necesito alguna librería en especial? Lo único que necesitaria sería alguna función en plan ColorPixel(Color,Posicion), y otra para definir el tamaño de la imagen..

¿Alguien me podría echar un cable? ¿O decirme donde buscar información sobre el tema?

Muchas gracias,

SrDurden (mola)

(mola)  (mola)  
#13
Programación gráfica / Pregunta Tonta DirectDraw
23 de Junio de 2003, 10:29:32 AM
                                Hola!

Muchas gracias por contestar ;P

Por otra parte... ¿por que mezclas GDI con DirectX?


Ah, pero hay otra manera?  :oops:

Es que estoy en el capítulo 6 del Genesis y están mezclando DirectX con GDI.. Entonces hay alguna manera de cargar un bitmap con DirectDraw? Como?

Jejeje, lo de cargar la foto a cada vuelta del bucle es verdad, es que pensaba que al hacer el ReleaseDC y los DeleteDC ya lo eliminaba todo y solo quedaba la foto en pantalla..

Por otro lado,

memory leaks

Memory leaks es falta de memoria, no? Hay alguna manera de saber los objetos creados en memoria dinamica, los que he eliminado, los que faltan por eliminar, etc.. etc.. ?

Muchas gracias,

SrDurden 8)                                
#14
Programación gráfica / Pregunta Tonta DirectDraw
20 de Junio de 2003, 07:30:26 PM
                                Ui, simplemente era que lo tenía que poner dentro del bucle de mensajes, no?

Es que acabo de añadir unas cositas para que se mueva la foto por pantalla, y al moverla quedaba el "rastro" de la imagen.

Pero ahora tengo otra pregunta: Porqué al cabo de un rato de haber estado moviendo la imagen ya no me ha dejado moverla más?

No elimino memoría por alguna parte?
Y que pasa si no la elimino? Que pasa tb si al salir del programa no hago los releases?

En teoría se quedaría la zona de memoria reservada, pero al cerrar el ordenador esta zona se liberaría, no?
Supongo que lo único que puede pasar es que el ordenador al salir vaya más lento pq disponga de menos memoría  :ojo:

El código que he añadido es este:



while(1)

{

 

 if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))

 {

  if (msg.message == WM_QUIT) break;

  TranslateMessage(&msg);

  DispatchMessage(&msg);

 }



 if (KEYSTATE(VK_ESCAPE)) PostMessage(hwnd, WM_CLOSE, 0, 0);

 if (KEYSTATE(VK_UP)) fotoy=fotoy-2;

 if (KEYSTATE(VK_DOWN)) fotoy=fotoy+2;

 if (KEYSTATE(VK_RIGHT)) fotox=fotox+2;

 if (KEYSTATE(VK_LEFT)) fotox=fotox-2;



 LoadBitmapResource(lpddsPrimary,fotox,fotoy,0);

}



Y otra pregunta.. ¿Por qué al salir del programa me aparece la ventana del Visual C++ 6.0 sin maximizar, cuando está maximizada? Tengo que apretar a minimizar y luego otra vez a maximizar para que se quede normal..
Es por algo que hago o es por culpa de razones ocultas típicas de windows?  8O

Muchas gracias,

SrDurden 8)                                
#15
Programación gráfica / Pregunta Tonta DirectDraw
20 de Junio de 2003, 07:16:07 PM
                                Hola!

Estoy empezando a programar en DirectDraw con el Tutorial Game Programming Genesis, y tengo una duda:

Cuando cargas un bitmap en pantalla, o pones un pixel por pantalla, es normal que desaparezca de immediato?

Es que si no lo pongo en el bucle principal (con lo que me realiza la operación de carga de un bitmap todo el rato) no me da tiempo ni a verlo..

En teoría no tendrían que quedar escritos en pantalla?

Pongo el código por si puede ayudar en algo, a lo mejor es que me he equivocado en alguna cosa  :oops:

Si véis alguna cosa mal o que no esté demasiado bien, por favor, no dudéis en decirmelo!  :ojo:



.

.

.

DDSURFACEDESC2 ddsd;

LPDIRECTDRAWSURFACE7 lpddsPrimary=NULL;



INIT_DXSTRUCT(ddsd);



ddsd.dwFlags=DDSD_CAPS | DDSD_BACKBUFFERCOUNT;

ddsd.dwBackBufferCount=1;

ddsd.ddsCaps.dwCaps=DDSCAPS_PRIMARYSURFACE |

     DDSCAPS_COMPLEX |

     DDSCAPS_FLIP |

     DDSCAPS_VIDEOMEMORY;

   



if (FAILED(lpdd->CreateSurface(&ddsd,&lpddsPrimary,NULL)))

{

  MessageBox(hwnd, "ERROR CODE CSURFACE 1",

  "Creando Surface.", MB_YESNO | MB_ICONQUESTION |

  MB_DEFBUTTON2);

  ReleaseLpdd(lpdd);

  return(0);

}





  LPDIRECTDRAWSURFACE7 lpddsBack = NULL;



  ddsd.ddsCaps.dwCaps= DDSCAPS_BACKBUFFER;



if (FAILED(lpddsPrimary->GetAttachedSurface(&ddsd.ddsCaps,&lpddsBack)))

   {

  MessageBox(hwnd, "ERROR CODE GASURFACE PRIMARY 1",

  "Get Attached Error.", MB_YESNO | MB_ICONQUESTION |

  MB_DEFBUTTON2);

  ReleaseLpdd(lpdd);

  return(0);

}



   

// En casa utilizo el modo 555!!!







while(1)

{

 

 if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))

 {

  if (msg.message == WM_QUIT) break;

  TranslateMessage(&msg);

  DispatchMessage(&msg);

 }



 if (KEYSTATE(VK_ESCAPE)) PostMessage(hwnd, WM_CLOSE, 0, 0);



 LoadBitmapResource(lpddsPrimary,15,15,0);

}



   ReleaseLpdd(lpdd);



   



return(msg.wParam);

}



void ReleaseLpdd(LPDIRECTDRAW7 &lpdd)

{

lpdd->Release();

lpdd=NULL;

}



inline void PlotPixel16(int x, int y, USHORT color, USHORT* buffer, int nPitch)

{

buffer[y*nPitch + x] = color;

}



int LoadBitmapResource(LPDIRECTDRAWSURFACE7 lpdds, int xDest, int yDest, int nResID)

{

 HDC hSrcDC;           // source DC - memory device context

 HDC hDestDC;          // destination DC - surface device context

 HBITMAP hbitmap;      // handle to the bitmap resource

 BITMAP bmp;           // structure for bitmap info

 int nHeight, nWidth;  // bitmap dimensions



 // first load the bitmap resource

 if ((hbitmap = (HBITMAP)LoadImage(hInstance, "damaris.bmp",

                                   IMAGE_BITMAP, 0, 0,

                                   LR_CREATEDIBSECTION | LR_LOADFROMFILE)) == NULL)

   return(FALSE);



 // create a DC for the bitmap to use

 if ((hSrcDC = CreateCompatibleDC(NULL)) == NULL)

   return(FALSE);



 // select the bitmap into the DC

 if (SelectObject(hSrcDC, hbitmap) == NULL)

 {

   DeleteDC(hSrcDC);

   return(FALSE);

 }



 // get image dimensions

 if (GetObject(hbitmap, sizeof(BITMAP), &bmp) == 0)

 {

   DeleteDC(hSrcDC);

   return(FALSE);

 }



 nWidth = bmp.bmWidth;

 nHeight = bmp.bmHeight;



 // retrieve surface DC

 if (FAILED(lpdds->GetDC(&hDestDC)))

 {

   DeleteDC(hSrcDC);

   return(FALSE);

 }



 // copy image from one DC to the other

 if (BitBlt(hDestDC, xDest, yDest, nWidth, nHeight, hSrcDC, 0, 0,

            SRCCOPY) == NULL)

 {

   lpdds->ReleaseDC(hDestDC);

   DeleteDC(hSrcDC);

   return(FALSE);

 }



 // kill the device contexts

 lpdds->ReleaseDC(hDestDC);

 DeleteDC(hSrcDC);



 // return success

 return(TRUE);

}



La función LoadBitmapResource la he modificado un pelín (simplemente he cambiado la funcion LoadImage) para que me cargue una imagen del disco duro y no una imagen del resource.

Saludotes y muchas gracias,

SrDurden 8)                                





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.