• Domingo 30 de Junio de 2024, 18:29

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.


Mensajes - Ruben3d

Páginas: 1 ... 25 26 [27] 28 29 30
651
Citar
El gimp lo he probado y es bastante bueno aunque aun esta lejos de llegar a la calidad de paint shop pro o photoshop (en mi opinion).

Deberías probar Gimp 2. Tiene bastantes opciones que no existen en Photoshop.

Un saludo.

Ruben3d

652
C/C++ / Re: Intervalo En Borland C++
« en: Jueves 18 de Marzo de 2004, 13:35 »
Hola.

Lo que tienes que hacer es, en primer lugar, ir leyendo los n números. Una vez los tengas todos en un array, lo vas recorriendo y si está el elemento en el intervalo lo imprimes.

No debería costarte hacer esto, prácticamente es pasar lo que he dicho a código tal cual.

653
Programación de Videojuegos / Re: El Fin De Los Videojuegos
« en: Miércoles 17 de Marzo de 2004, 16:38 »
Citar
Sigraph (¿me quedó bien escrito?)

Casi, es "Siggraph".

Un saludo.

Ruben3d

654
Programación de Videojuegos / Re: El Fin De Los Videojuegos
« en: Miércoles 17 de Marzo de 2004, 14:59 »
Hola a todos.

Estoy de acuerdo con los que han dicho que a los videojuegos aún les queda mucho por evolucionar.

Actualmente no califico ninguno de los juegos que hay en el mercado como reales. Pueden tener un mayor o menor grado de realismo, pero no les puedo llamar reales. Yo creo que la evolución de los videojuegos en el ámbito gráfico va a detenerse cuando se llegue a imágenes que no se distinga si se trata de una fotografía o un vídeo o un juego (porque no puede ser más real que lo real). De momento esto sólo lo he visto en escenas generadas por 3dsmax, maya, o sw de este tipo (a horas de render por cuadro).
Está claro que el hardware actual y el inmediatamente venidero no va a permitir esto.

Por otro lado también se ha mencionado el tiempo de desarrollo de los juegos. Efectivamente, cada vez es más largo, pero esto no puede seguir así, pues hay que tener en cuenta los costes de desarrollo y las unidades que se esperan vender, para saber si el proyecto será viable. Actualmente, los equipos de los juegos que más tiempo llevan en desarrollo (Doom 3, HalfLife 2), no esperan recibir todos los ingresos de las ventas: también esperan vender licencias del motor a terceros, que desarrollarán juegos de muy buena calidad en tiempos máximos de 2 años (en el caso de Doom 3, se va a hacer Quake 4 con su motor).

Pienso que llegará el día (no cercano) en el que apenas se desarrollen nuevos motores y se utilicen sólo los ya existentes, centrando el desarrollo en los modelos, mapas, argumento, etc., por lo que los desarrolladores serán grupos de artitas, no programadores, y ésta es la parte que fluye rápido (no hay que depurar las texturas :lol: ), por lo que el tiempo de desarrollo no se disparará.

Bueno, hay más aspectos que aún queda por mejorar de los juegos (la física, animación...) pero más o menos creo que con esto se entiende mi punto de vista.

Un saludo.

Ruben3d

655
OpenGL / Triple Buffering
« en: Miércoles 17 de Marzo de 2004, 14:21 »
Hola a todos.

He estado intentando encontrar información sobre cómo usar Triple Buffering con OpenGL bajo Windows y no he encontrado nada. En MSDN he visto la función wglSwapLayerBuffers, pero no me queda muy claro si es la adecuada para el triple buffering o es su finalidad (no lo menciona por ningún lado, además es engorrosa de utilizar).

¿Alguien sabe cómo hacer Triple Buffering con OpenGL bajo Windows?

Muchas gracias a todos.

Ruben3d

656
C/C++ / Re: Sobre El Uso De System()
« en: Martes 16 de Marzo de 2004, 14:59 »
Hola.

Sé cómo hacerlo si estás trabajando con Unix (o Linux). Así que si así es dimelo y te posteo cómo se hace.

Un saludo.

Ruben3d

657
Bueno, me gustaría añadir:

- The Gimp: Excelente programa de edición fotográfica, equivalente a Photoshop, pero gratuito (licencia GNU).

- Blender 3D: Programa para modelado 3D (no especialmente orientado a juegos). También bajo licencia GNU.

Un saludo.

Ruben3d

658
C/C++ / Re: Mover Cursores En C++
« en: Sábado 6 de Marzo de 2004, 01:10 »
Hola.

En esta dirección tienes un tutorial sobre cómo leer el teclado y el ratón desde una consola de Windows, y cómo poner el cursor en una posición específica.

http://www.gametutorials.com/download/C++/...seInput_Cpp.zip

Un saludo.

Ruben3d

659
C/C++ / Re: Mover Cursores En C++
« en: Sábado 6 de Marzo de 2004, 00:24 »
Hola.

Lo que pides se implementa de manera diferente estés en Windows o estés en Unix. ¿Qué sistema operativo estás utilizando?

Un saludo.

Ruben3d

660
Dudas informáticas / Pintar Directamente En El Canal Alfa
« en: Viernes 5 de Marzo de 2004, 16:04 »
Hola a todos.

Me he instalado la última versión de GIMP y he estado probando su funcionamiento. Ha mejorado bastante desde las versiones 1.x, pero he encontrado un problema: ¿Cómo pinto directamente en el canal alfa de una imagen? Sé que se ha de poder hacer (en Photoshop es muy sencillo, no hay más que seleccionar el canal y pintar), sin embaro soy incapaz de encontrarlo. La única manera en la que lo he conseguido hacer es creando una máscara a la capa que hace de fondo y pintando en ella, de manera que el canal alfa se actualiza sólo. ¿No hay alguna manera de evitarse esto y pintar directamente en el canal alfa?

Un saludo.

Ruben3d

661
C/C++ / Re: Como Creo Una Lista De Archivos De Una Carpeta?
« en: Viernes 5 de Marzo de 2004, 15:46 »
Citar
Cita de: "Ruben3d"
Hola.

La función que mencionas es opendir(), pero es específica de sistemas basados en unix.

Un saludo.

Ruben3d
Estemmm... No
Estemmm... Sí

Citar
Es compatible con POSIX y Win

Si mal no recuerdo, la compatibilidad con POSIX de sistemas win32 no es completa. Sólo tiene implementadas algunas funciones, principalmente de manejo de ficheros.

La función opendir() y demás declaradas en dirent.h fueron implementadas en 4.3 BSD para facilitar el acceso a la información de cada directorio. Después también la adoptaron en UNIX System V, ya que facilitaba la portabilidad del código. Así, acabó en todos los Unix. Ahora bien, si programas en Windows NO tienes esas funciones (a no ser que coja alguien y le haga un wrapper al API, pero eso lo hace cualquiera, quiero decir, no es oficial).

Se puede comprobar probando opendir en el compilador de Microsoft. No lo reconocerá. Tampoco está en MSDN (y si una función del sistema no está en MSDN es que no existe). La única referencia a opendir en MSDN está en la página de guía de migración de código de Unix a Win32, donde explica cómo sustituir la versión de UNIX por las funciones de microsoft (de esa página ha salido el código posteado más arriba).

Un saludo.

Ruben3d

662
C/C++ / Re: Como Creo Una Lista De Archivos De Una Carpeta?
« en: Viernes 5 de Marzo de 2004, 14:00 »
Hola.

Te hago una observación, ya que he visto la función termina. Si cambias el primer parámetro de FindFirstFile puedes seleccionar la extensión de los archivos que busca.

Un saludo.

Ruben3d

663
C/C++ / Re: Como Creo Una Lista De Archivos De Una Carpeta?
« en: Jueves 4 de Marzo de 2004, 17:41 »
Hola.

La función que mencionas es opendir(), pero es específica de sistemas basados en unix.

Un saludo.

Ruben3d

664
Visual C++ / Re: Librerias Libres Para Comprimir Archivos En Vc++
« en: Miércoles 3 de Marzo de 2004, 11:08 »
Hola.

Mira esta web:
http://www.gzip.org/zlib/

Un saludo.

Ruben3d

665
Sobre los Foros de SoloCodigo / Re: Código Tabulado
« en: Martes 2 de Marzo de 2004, 13:20 »
Muchas gracias.

Un saludo.

Ruben3d

666
C/C++ / Re: Como Creo Una Lista De Archivos De Una Carpeta?
« en: Lunes 1 de Marzo de 2004, 18:39 »
Hola.

Te pego un pograma sacado de MSDN, cuya misión es listar todo el contenido de un directorio, entrando recursivamente en los subdirectorios. No creo que tengas que modificarlo mucho para adaptarlo a tus necesidades.

Código: Text
  1.  
  2. #include <windows.h>
  3. #include <stdio.h>
  4.  
  5. void ScanDir(char *dirname, int indent)
  6. {
  7.     BOOL            fFinished;
  8.     HANDLE          hList;
  9.     TCHAR           szDir[MAX_PATH+1];
  10.     TCHAR           szSubDir[MAX_PATH+1];
  11.     WIN32_FIND_DATA FileData;
  12.  
  13.     // Get the proper directory path
  14.     sprintf(szDir, "%s\\*", dirname);
  15.  
  16.     // Get the first file
  17.     hList = FindFirstFile(szDir, &FileData);
  18.     if (hList == INVALID_HANDLE_VALUE)
  19.     {
  20.         printf("No files found\n\n");
  21.     }
  22.     else
  23.     {
  24.         // Traverse through the directory structure
  25.         fFinished = FALSE;
  26.         while (!fFinished)
  27.         {
  28.             // Check the object is a directory or not
  29.             if (FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
  30.             {
  31.                 if ((strcmp(FileData.cFileName, ".") != 0) &&
  32. (strcmp(FileData.cFileName, "..") != 0))
  33.                 {
  34.                     printf("%*s%s\\\n", indent, "",
  35.                       FileData.cFileName);
  36.  
  37.                     // Get the full path for sub directory
  38.                     sprintf(szSubDir, "%s\\%s", dirname,
  39.                       FileData.cFileName);
  40.  
  41.                     ScanDir(szSubDir, indent + 4);
  42.                 }
  43.             }
  44.             else
  45.                 printf("%*s%s\n", indent, "", FileData.cFileName);
  46.  
  47.  
  48.             if (!FindNextFile(hList, &FileData))
  49.             {
  50.                 if (GetLastError() == ERROR_NO_MORE_FILES)
  51.                 {
  52.                     fFinished = TRUE;
  53.                 }
  54.             }
  55.         }
  56.     }
  57.  
  58.     FindClose(hList);
  59. }
  60.  
  61. void main(int argc, char *argv[])
  62. {
  63.     char *pszInputPath;
  64.     char pwd[2] = ".";
  65.  
  66.     if (argc < 2)
  67.     {
  68.         printf("Argument not supplied - using current directory.\n");
  69.         pszInputPath = pwd;
  70.     }
  71.     else
  72.     {
  73.         pszInputPath = argv[1];
  74.         printf("Input Path: %s\n\n", pszInputPath);
  75.     }
  76.  
  77.     ScanDir(pszInputPath, 0);
  78.  
  79.     printf("\ndone.\n");
  80. }
  81.  
  82.  
  83.  
  84.  


Un saludo.

Ruben3d

667
Sobre los Foros de SoloCodigo / Código Tabulado
« en: Lunes 1 de Marzo de 2004, 18:32 »
Hola.

Me he fijado en que cuando uso la tag CODE para insertar código el único beneficio que obtengo es tener fuente de paso fijo y se me come todas las tabulaciones, dejando el código sin tabular y de más difícil comprensión. ¿No se podría arreglar esto? Además, si no es pedir mucho, también podría colorear sintaxis, al estilo de los foros de GameDev.net  :P .

Un saludo.

Ruben3d

668
Pascal / Cómo Configurar El Directorio De Trabajo
« en: Lunes 1 de Marzo de 2004, 18:23 »
Hola a todos.

Me he instalado el Dev-pas (la versión 1.9.2 con FreePascal) y no consigo establecer el directorio de trabajo de los proyectos. Siempre es el directorio de instalación del entorno y no consigo cambiarlo, aunque cree el proyecto en otro directorio. ¿Alguien podría indicarme cómo cambiarlo? También me vale poder averiguar en qué directorio está el ejecutable desde el código.

Un saludo.

Ruben3d

669
ASM (Ensamblador) / Operaciones En Coma Flotante
« en: Domingo 29 de Febrero de 2004, 21:26 »
Hola.

He hecho dos pequeñas funciones en C++ con ensamblador. Se comportan igual, dividiendo f1 entre f2 y retornando el resultado. El código es éste:


Código: Text
  1.  
  2.     inline float ASM_Test(const float f1, const float f2)
  3.     {
  4.   float f3;
  5.   __asm {
  6.     fld f1
  7.     fld f2
  8.     fdivp st(1),st
  9.     fstp f3
  10.   }
  11.   return f3;
  12.     }
  13.  
  14.     inline float ASM_Test2(const float f1, const float f2)
  15.     {
  16.   float f3;
  17.   __asm {
  18.     fld f1
  19.     fdiv f2
  20.     fst f3
  21.   }
  22.   return f3;
  23.     }
  24.  
  25.  

La única diferencia es que la primera deja la pila como estaba y la segunda no lo hace, aunque son menos instrucciones. ¿Es necesario dejar la pila como estaba?

Un saludo.

Ruben3d

670
Programación de Videojuegos / Re: Niebla En Doom 3
« en: Domingo 29 de Febrero de 2004, 20:48 »
Hola.

En el stencil buffer no se guarda qué parte está a la sombra de la manera normal, con una imagen en escala de grises. Mientras se está ejecutando el algoritmo se usa como si fuera un acumulador, sumando 1 si se da cierta condición y restando 1 si de da cierta otra en cada píxel concreto. De esta manera, cuando el algoritmo ha terminado, si el valor de la celda de cada píxel es diferente de cero quiere decir que está a la sombra y si es igual a cero quiere decir que está iluminado. Así, es como si la máscara fuera de un bit de profundidad de color, por lo que sólo hay dos estados: iluminado y a la sombra. Por ello no se puede hacer lo que me dices.

Se me olvidó decir que en Doom 3 se hace una pasada por cada luz, para que los lugares en donde se proyecten dos o más sombras estén más oscuros. ¿Esto generaría aún más sobrecarga al generar la niebla?

También se me olvidó decir que Doom 3 usa OpenGL, aunque mencioné un ejemplo de DirectX para que se viera el efecto.

En esta dirección está bastante bien explicado cómo funciona el algoritmo:
The Theory of Stencil Shadow Volumes

Un saludo.

Ruben3d

671
Programación de Videojuegos / Niebla En Doom 3
« en: Sábado 28 de Febrero de 2004, 17:18 »
Hola a todos.

Estaba navegando por internet, viendo información sobre Doom 3, cuando vi un screenshot del juego que me llamó increiblemente la atención.

Sorprendentemente no fue uno lleno de efectos y explosiones, ni geometría increiblemente detallada, ni cosas de este estilo. Fue uno relativamente simple, con unos monstruillos que parecen cabezas con patas, y niebla.

Hasta aqui todo normal, pero lo sorprendente es que combinaba stencil shadow volumes con niebla! :blink:

El algoritmo que genera las sombras obtiene como salida, por decirlo de manera simple, una máscara que indica qué partes de la imagen en pantalla están a la sombra de una luz (el lugar donde esto se guarda es el stencil buffer). Teniendo esto, lo que se hace es oscurecer en la imagen final las partes que el stencil buffer indica que están a la sombra. De esta manera no se sabe a qué distancia están las sombras en el espacio, pero sí se sabe qué parte de la imagen final está a la sombra. Por ello, en todas las demos que combinan este tipo de sombras con niebla se puede ver cómo cuando la sombra se aleja dentro de la niebla no se ve afectada por ésta y permanece completamente negra (se puede ver esto en el ejemplo ShadowVolume para Direct3D, en el SDK de DirectX).

Sin embargo, en el screenshot que vi esto no sucede. Hay niebla y las sombras que hay lejos se ven afectadas por ésta. Así, llega mi pregunta:

¿Cómo hace Doom 3 para combinar stencil shadow volumes y niebla?

Lo único que se me ocurre es hacer una última pasada, después de pintar las sombras, generando a mano la niebla a partir de los valores que haya en el z-buffer, pero me da la sensación de que esto será muy ineficiente. ¿Hay algún método que no conozca? ¿Se trata de alguna extensión de las nuevas tarjetas? ¿Se optimizaría con un FragmentProgram?

Uff, sobredosis de preguntas ;) . Espero que alguien me pueda responder a esto. :lol:

Un saludo.

Ruben3d

PD: Adjunto la imagen, claro.
No me deja usar el tag IMG  :angry:
http://common.ziffdavisinternet.com/util_g...&i=50697,00.jpg
y el link a la web donde está:
http://www.computergaming.com/slideshow_vi...00&po=36,00.asp

672
C/C++ / Re: Compiladores
« en: Sábado 28 de Febrero de 2004, 16:23 »
Citar
con el c++ de Builder

Prueba a postear esta pregunta en el foro de C++ Builder.

Un saludo.

Ruben3d

673
C/C++ / Re: Constructor Privado
« en: Sábado 28 de Febrero de 2004, 13:33 »
Citar
Sorry  , ya dije q no se si estaría libre de errores y q me basaba en una "idea" que tuve en Java...

 :o  Siento haber parecido un poco brusco. No lo pretendía.

Un saludo.

Ruben3d

674
C/C++ / Re: Constructor Privado
« en: Sábado 28 de Febrero de 2004, 13:12 »
Citar
Código: Text
  1.  
  2. class A {
  3.  private:
  4.    A instancia=null;
  5.    A();
  6.  public:
  7.    static A getInstancia();
  8. };
  9.  
  10. A A::getInstancia() {
  11.    if(instancia == null) return new A();
  12.    else return instancia;
  13. }
  14.  
  15.  

Francamente, me gustaría saber si alguno de vosotros ha compilado ese fragmento de código, porque según veo ha de dar errores de todo tipo por todas partes. Además, si consiguieras hacer eso funcionar generarías una nueva instancia en cada llamada a getInstancia().

Una forma correcta de hacer eso (que se llama singleton) y bastante probada es hacer esto:

Código: Text
  1.  
  2. // En el fichero .h
  3. class A
  4. {
  5. public:
  6.     // Métodos que hagan falta
  7.     // ...
  8.  
  9.     ~A() { /* código destructor */}
  10.  
  11.     // Retorna la única instancia de la clase
  12.     static A *Instancia() {return &m_A;};
  13.  
  14. private:
  15.     static A m_A;
  16.  
  17.     A() { /* código constructor */ };
  18.  
  19.     // El constructor de copias tambien debe
  20.     // ser privado
  21.     A(const A &);
  22.  
  23.     // Otros miembros privados
  24.     // ...
  25. };
  26.  
  27. // En el fichero .cpp
  28.  
  29. // Para dar presencia física a la variable
  30. // estática
  31. A A::m_a;
  32.  
  33. // Implementar aqui el resto de métodos de la clase
  34.  
  35.  
  36.  

De esta forma, para acceder a la instancia se podría hacer esto en el código:

Código: Text
  1.  
  2. A::Instancia()->método1();
  3.  
  4. o también
  5.  
  6. A *pA = A::Instancia();
  7. pA->método1();
  8. pA->método2();
  9.  
  10.  

Hay que tener en cuenta que no hay que liberar los punteros, ya que apuntan a m_A, que será automáticamente liberado cuando sea llamado el destructor de la clase.

Esto tiene el problema del orden de inicialización si se llaman entre sí varias clases de este tipo en los constructores, pero se puede arreglar moviendo m_A al interior de Instancia() en forma de variable estática, por lo que será inicializado en la primera llamada a Instancia().

Creo que no he cometido ningún error en el código. Si no es así que alguien me lo diga.

Espero que esto te haya servido de ayuda.

Un saludo.

Ruben3D

675
C/C++ / Re: Complejidad
« en: Miércoles 25 de Febrero de 2004, 20:20 »
Hola.

Parece que el cálculo del coste en el caso medio de la ordenación por Shell no es tarea sencilla. Aqui te dejo un estracto de un libro:

Citar
Se cree que el tiempo de ejecución del caso promedio de la ordenación de Shell, usando incrementos de Hibbard, es O(n^(5/2)), con base en simulaciones, pero nadie ha podido demostrarlo. Pratt demostró que la cota O(n^(3/2)) se aplica a un amplio conjunto de secuencias de incrementos.

Del caso promedio no tengo más, sólo del caso peor. Prueba a buscar por Pratt y Shell Sort en google.

Un saludo.

Ruben3d

Páginas: 1 ... 25 26 [27] 28 29 30