Allegro Una librería para programar videojuegos Lenguajes: English  Deutsch  français  한국어 (Hangul)  polski  Italiano 

 
 

Allegro
  Novedades
  Introducción
  Licencia
  Colaboradores
  Antiguas noticias
  Logos

Descargas
  Última versión
  Versiones antiguas
  CVS

Documentación 
  API
  FAQ
  Tutoriales
  El futuro

Soporte
  Ayuda
  Listas de correo
  IRC

Juegos, Utilidades, Librerías, etc
  Allegro.cc

Miscelánea
  DIGMID
  Enlaces
  Mirrors
  Webmasters
  Humor

 
 
  

FAQ de Allegro
Si la respuesta no esta aquí, pregunte y será añadida...


Contenido


Problemas triviales



Lea readme.txt.



De cualquier mirror de SimTel, en el directorio gnu/djgpp/v2tk/, o desde la página web de Allegro, http://alleg.sourceforge.net/.



Lea allegro.txt.


Problemas con DJGPP



Make es parte de la distribución estándar de djgpp, en v2gnu/mak*b.zip (el numero de la ultima versión). Puede obtenerlo de http://www.delorie.com/djgpp/.



¿Está seguro de que tiene djgpp instalado correctamente? Revise las instrucciones del fichero de djgpp readme.1st, y en particular cuide haber ajustado la variable de entorno de DJGPP y añada el directorio djgpp\bin a su path.



¿Está seguro de estar usando el programa make de GNU, en vez de algún otro como el de Borland? Si no lo sabe, ejecute "make -v" y compruebe que visualiza el mensaje de copyright de GNU.



¡No debería ejecutar make desde el explorador de Win95! Abra una sesión de DOS, vaya al directorio de Allegro, y ejecute "make" desde la línea de comandos.



¿Seguro que tiene la fecha del sistema ajustada correctamente? Alternativamente, quizás haya descargado un fichero recientemente hecho por alguien en una zona temporal al este. En este caso puede esperar unas horas, adelantar su reloj temporalmente, o usar una utilidad como "touch" para modificar la marca temporal de los ficheros.



Tal y como el mensaje de error sugiere, necesita liberar más memoria para el compilador. El programa go32-v2 le dirá cuanta tiene disponible. Si está en DOS, intente liberar espacio de disco duro para los ficheros temporales. Bajo win95, incremente el límite de memoria DPMI en las propiedades de su sesión DOS a 65535 (tendrá que escribir esto a mano, ya que la lista desplegable sólo llega hasta 16384).



Tal y como el mensaje de error sugiere, hay un conflicto entre la nueva versión del gcc y versiones antiguas de la libc. Debería leer el fichero readme.DJGPP contenido en el archivo gcc*b.zip (ya que al final del mismo se indica cómo corregir el problema).



C:\TEMP\ccdaaaaa(.text+0x9):x.c: undefined reference to `allegro_init'
C:\TEMP\ccdaaaaa(.text+0xe):x.c: undefined reference to `install_keyboard'

No ha leído los manuales, ¿lo hizo? :-) Necesita enlazar su programa con la biblioteca de funciones, liballeg.a. Primero, asegúrese de que ha instalado todo correctamente (ejecutar make debería hacer esto por usted). Segundo, si esta compilando desde la línea de comandos o desde un makefile, añada -lalleg al final de su línea de comando de gcc, o si esta usando Rhide, vaya al menú Options/Libraries, entonces teclee 'alleg' en la primera línea vacía, y asegúrese de que la caja al lado esta marcada.



No, lo siento. Para empezar, liballeg.a ocupa unos 450k, pero probablemente querrá varias utilidades como el grabber, la configuración de sonido, etc. ¿Y que hay de los programas de ejemplo? Si incluyese la versión compilada de todo, la distribución binaria sobrepasaría las 7 megas: ¡demasiado grande para ser práctico! Pero seriamente, no hay ninguna razón por la que no pueda compilar la librería usted mismo. El compilado de un programa es un proceso determinista: dado un fichero de entrada particular y una línea de comando, siempre producirá la misma salida. Si esto no funciona, o tiene ficheros de entrada incorrectos (su copia de Allegro esta estropeada en algún sentido), o la línea de comandos es incorrecta (es difícil que eso suceda, ya que solo tiene que teclear "make"...) o su compilador está estropeado, por ejemplo, si no instala djgpp correctamente. Necesita solucionar el problema en vez de ocultarlo bajo la alfombra consiguiendo que otro compile Allegro por usted...



Las herramientas GNU escriben los mensajes de error a stderr. Desafortunadamente, command.com es demasiado estúpido para redirijir el flujo, pero afortunadamente DJ fue suficientemente listo para evitar esto, por lo que puede usar su programa redir para capturar los mensajes de salida, por ejemplo "redir -eo make > logfile.txt".


Problemas en DOS



Las respuestas pueden variar. Algunas personas dicen que hay problemas, mientras que otras dicen que todo funciona bien. Personalmente no tengo acceso a NT, por lo que no hay nada que pueda hacer por esto, y para ser sincero, no me importa mucho :-) Si quiere ejecutar programas DOS, ¡use el DOS!



Si, pero con problemas. Si está usando la versión OpenDOS de EMM386, debe desactivar su implementación DPMI (especifica DPMI=OFF en la línea del driver EMM386.EXE de tu config.sys). También debería acordarse de activar la bandera PIC=OFF, pero ese es el estado por defecto, por lo que no habría problemas con ello a no ser que lo haya cambiado antes.



No puede. El límite está impuesto por el hardware de la VGA, no por Allegro. Para acceder a más de 256k de memoria de vídeo necesita usar un modo SVGA, lo cual significa cambiar a una resolución mayor o conseguir una copia del programa SciTech Display Doctor, el cual provee algunos modos SVGA de baja resolución.



Para algunas personas si, pero no para otras. El problema es que Creative Labs se niega a revelar información interna sobre la tarjeta, por lo que no podemos escribir un driver para ella. Quéjese a ellos, o compre una tarjeta de un fabricante diferente más razonable.



Esto puede ser porque tiene el volúmen muy bajo: pruebe modificarlo desde el programa setup. Además, Allegro mezcla varios sonidos en un solo buffer de salida, a diferencia del reproductor de sonidos de Windows que sólo reproduce un sonido a la vez, por lo que cada sonido individual sólo puede obtener un porcentaje del volumen total de salida. Este es el precio que hay que pagar por el mezclado múltiple de canales. Si no le gusta, use el programa setup para alterar el número de canales: el número puede ser una potencia de dos menor o igual a 64, y cuanto menor sea, mayor será el volúmen del sonido. Alternativamente, use set_volume_per_voice(), tal y como se describe en la documentación. Esto le permite ajustar el volumen general de la salida de sonido digital de Allegro.



Pruebe usar un driver FreeBE/AF (http://www.talula.demon.co.uk/freebe/), o el programa comercial SciTech Display Doctor (http://www.scitechsoft.com). Si sigue sin funcionar, publique una descripción de su problema a la lista de correo de Allegro, junto con una copia de la salida que producen los programas afinfo y vesainfo.



La interfaz VBE/AF ya proporciona eso para los drivers de vídeo: compruebe el proyecto FreeBE/AF en http://www.talula.demon.co.uk/freebe/. Para cosas más generales como las rutinas de sonido, VESA, y las rutinas del modo-X, esto sería terriblemente difícil de conseguir debido a que los drivers dependen mucho de las rutinas de ayuda del núcleo de la biblioteca. El formato DXE no es lo suficientemente flexible como para soportar esto, y no quiero que Allegro dependa de otros paquetes de enlazado dinámico.



Asegúrese de que está creando una aplicación GUI para Windows, y no una aplicación de consola para Windows. Esto es un parámetro cuando crea el projecto con MSVC. Esto se especifica con el parámetro '-tW' para el compilador de línea de comando de Borland C++. O eso, o #defina USE_CONSOLE al comienzo si necesita crear un programa de consola.



Bueno pues, entonces necesita incrementar el tamaño de su entorno :-) Puede hacer esto alterando la configuración de su sesión DOS (haga click en el menú de sistema y seleccione "propiedades"), o en el arranque de su config.sys (ej: añada "shell=c:\command.com /e:8192").



Asegúrese de que no tiene un punto y coma al final de la variable MSVCDIR si está usando MSVC, al final de la variable MINGDIR si está usando Mingw32 o al final de la variable BCC32DIR si está usando BCC.


Problemas en Windows



Necesita indicarle a su compilador dónde encontrar los ficheros de cabecera y librerías de DirectX: ponga las rutas de los directorios /include y /lib del kit de desarrollo DirectX en la ruta de su compilador/enlazador. Alternativamente, si no quiere modificar nada de su configuración, puede copiar directamente esos ficheros del kit de desarrollo de DirectX a los directorios correspondientes de su compilador.



Necesita actualizarse a una versión más reciente del SDK de DirectX, como mínimo versión 5, que puede obtener de la web del desarrollador de Microsoft.



Necesita escribir END_OF_MAIN() justo tras su función main(). Allegro usa esto, junto con algo de magia del preprocesador, para convertir su función main() normal en un punto de entrada WinMain() al estilo Windows.



Oh bueno, entonces necesita incrementar el tamaño de su entorno :-) Puede hacer esto modificando los parámetros de su ventana DOS (pinche en menú de sistema y seleccione "propiedades"), o al arrancar en su fichero config.sys (ej: "shell=c:\command.com /e:8192").


Probelmas Unix



Necesita escribir END_OF_MAIN() justo tras su función main(). Allegro usa esto, junto con algo de magia del preprocesador, para obtener una copia de sus parámetros argv[] (los necesita para varias cosas internas).



Necesita redirigir stderr a un fichero, para poder verlo luego. El métido para hacer esto depende del intérprete de comandos: si está usando un intérprete al estilo Bourne, como bash, pruebe "make 2> logfile.txt".



Hay dos posibles razones: 1) DGA2 puede soportar diferentes resoluciones/profundidades de color que X, ejecute el programa gfxinfo para saber qué combinaciones puede usar, 2) Puede tener una instalación DGA2 con fallos, lea la siguiente pregunta.



Probablemente esté usando un servidor XFree86 con una implementación DGA2 errónea, como la 4.0.3 (empaquetada con Red Hat 7.1 por ejemplo). Actualizarse a la 4.1.0 probablemente solucionará su problema. Puede obtenerla de ftp://ftp.xfree86.org/pub/XFree86/4.1.0/binaries/ tras seleccionar el directorio apropiado para su plataforma según indican las instrucciones del fichero Install.


Problemas generales



El grabber debe ser enlazado con el código en datedit.c. Pero no se debería preocupar por hacer esto a mano: simplemente ejecute "make" y eso recompilará todo para usted.


Cuando compilo Allegro, el make falla con algo como `Error: operands given don't match any known 386 instruction' o `Error: no such instruction `maskmovq %mm3, %mm1''.

Necesita actualizar su versión de GNU binutils. Lea readme.txt para descubrir la versión mínima requerida que necesita.



No a no ser que <foobar> esté mencionado en readme.txt como una de las plataformas soportadas. Usted podría adaptar Allegro a ese compilador, pero eso suele significar mucho trabajo. Si <foobar> es un compilador de 16 bits para DOS como Borland C, puede olvidar inmediatamente la idea :-)



WIP significa "work in progress" (versión en desarrollo), y se refiere a los cambios más recientes en Allegro desde la última versión oficial. Las versiones WIP de Allegro pueden obtenerse como parches de la página web de Allegro (http://alleg.sourceforge.net/), y normalmente son bastante estables, aunque no tan bien comprobadas como una versión final.



¿Tiene una copia de patch.exe? Si no, vaya a conseguirla del mismo lugar que consiguió el resto de djgpp: es una herramienta estándar de la distribución del compilador. Si tiene el programa patch pero no funciona correctamente, asegurese de que está instalando el parche encima de la versión no modificada de Allegro que esté intentando actualizar. (esta normalmente es la versión oficial más reciente antes de la WIP, pero compruebe el fichero de texto que viene con la WIP para estar seguro).



Este fichero se distribuye por separado en las versiones WIP. Está en: http://alleg.sourceforge.net/wip.es.html. (alldata.zip)


¿Cómo puedo dibujar diferentes imágenes el mismo tiempo? Cuando dibujo la siguiente, ésta estropea la paleta de colores de la primera.

Por supuesto: ¡así es como funciona el hardware de video! Sólo puede haber una paleta de colores usada en un mismo momento. O convierte sus imágenes para que usen la misma paleta o cambia a un modo gráfico truecolor.



Busque en la página web de Allegro.cc (http://www.allegro.cc/) algunas utilidades, como por ejemplo FixPal y Smacker.



El hardware de la VGA solo usa 6 bits para cada componente del color, lo que significa que los valores de los colores rojo, verde y azul van desde 0 a 63 en la paleta de colores, sin llegar a 255. Esto le da un potencial de 2^18 = 262144 colores diferentes o 64 tonos de gris. Si necesitas más, puede usar la función de la VESA 0x4F08 para seleccionar un ancho de DAC de 8 bits, pero Allegro no soporta esto directamente, y no se si esto se podría hacer en diferentes ordenadores con hardware diferente.



Cuando está en un modo de 256 colores, la tarjeta VGA muestra el color #0 alrededor del área de visualización (en modos truecolor usa el color negro). El color desaparecerá en cuanto cambie la entrada #0 de su paleta de colores para que sea negra.



Con gran difficultad :-) No existe un truco tan sencillo como alterar la paleta de colores, por lo que tendrá que redibujar la pantalla más clara u oscura. Podría dibujar rectángulos negros translúcidos sobre la pantalla para oscurecerla, o usar draw_lit_sprite() para colorear el bitmap mientras lo copia a la pantalla, pero tenga la certeza que estas operaciones son costosas y requieren un PC rápido.



fade_in() y fade_out() sólo funcionan en modos de 8-bits con paleta. Uno de los modos para hacer un fundido de bitmap es recorrer todos los pixels y cambiarlos individualmente. Una alternativa es dibujar muchos recuadros negros translúcidos sobre la pantalla. No obstante, estos métodos pueden ser lentos. El ejemplo exxfade.c demuestra cómo hacer fundidos entre dos bitmaps. Puede modificarlo para que haga fundidos de/hacia una pantalla negra. Lea también la pregunta anterior.



Mire en la página web de Allegro (http://alleg.sourceforge.net/) y busque algunas utilidades, como por ejemplo DTA y Smacker.


¿Cómo puedo hacer partes de mis sprites transparentes en modos truecolor? No entiendo la documentación cuando dice "rosa fucsia"...

En su programa de dibujo favorito, busque las barras de desplazamiento RGB y arrastre las barras roja y azul tan alto como pueda (normalmente hasta 255, pero depende de las unidades que use el software), y la barra verde a cero. Esto creará una sombra de rosa fucsia, o como otras personas prefieren llamarlo, magenta.



Recuerde que las posiciones de los vértices son almacenadas en formato de punto fijo, debe usar la macro itofix() para desplazar sus coordenadas 16 bits a la izquierda.



Recuerde que el ángulo de rotación es almacenado en formato de punto fijo, por lo que debe usar la macro itofix() o desplazar sus coordenadas 16 bits a la izquierda. Por ejemplo, rotate_sprite(bmp, spr, x, y, itofix(32)) rotará el gráfico 45 grados.



Probablemente está intentando inicializar la estructura de diálogo con un puntero a su bitmap, ¿verdad? Eso no funcionará porque el diálogo es creado en tiempo de compilación, pero el bitmap es cargado en tiempo de ejecución, por lo que el compilador todavía no sabe dónde estará localizado. Necesita rellenar la estructura de diálogo con un puntero nulo, y entonces copiar el puntero del bitmap real en el campo dp como parte de su código de inicialización, tras haber cargado el bitmap en la memoria.



Depende de lo que esté haciendo. Si sus imágenes son totalmente opacas, no habrá ventaja al usar un sprite RLE, y probablemente será más rápido si usa la función blit(). Si su gráfico tiene áreas transparentes, un sprite RLE será casi siempre más rápido y pequeño que la función draw_sprite(). Los sprites compilados son por regla general un poco más rápidos que las otras funciones para imágenes transparentes y bastante más rápidas para gráficos opacos, pero esto puede variar. Se usan mejor con sprites pequeños en máquinas antiguas en modo-x, y podrían ser más lentos que blit() si los usas en modos de vídeo SVGA en un pentium (el gran tamaño de los sprites compilados afecta severamente la efectividad del cache).



Debe asegurarse que la lógica de su juego se actualiza a una velocidad constante, pero se salta el refresco de la pantalla de vez en cuando si el ordenador es muy lento. Esto puede hacerse instalando un temporizador que incrementará una variable global a la velocidad de la lógica de su juego, eg:

      volatile int speed_counter = 0;

      void increment_speed_counter()
      {
         speed_counter++;
      }

      END_OF_FUNCTION(increment_speed_counter);

      void play_the_game()
      {
         LOCK_VARIABLE(speed_counter);
         LOCK_FUNCTION(increment_speed_counter);

         install_int_ex(increment_speed_counter, BPS_TO_TIMER(60));

         while (!game_over) {
            while (speed_counter > 0) {
               update_game_logic();
               speed_counter--;
            }

            update_display();
         }
      }

Añada una llamada a save_bitmap() en alguna parte del código. Lea en la documentación de save_bitmap() una explicación de uno de los fallos más comunes al usar la función, y un poco de código fuente.



Llame srandom(time(NULL)) al principio de su programa, y entonces use random()%límite para obtener un número pseudo-aleatorio entre 0 y límite-1.



No hay necesidad de hacerlo. El enlazador sólo incluye partes de la biblioteca que realmente usa, por lo que si no llama ninguna de las rutinas de mapeado de texturas o reproducción de FLICs, éstas no se añadirán a su ejecutable. Esto no funciona perfectamente porque hay mucho código de Allegro que usa tabla de punteros a funciones que hacen que rutinas innecesarias se enlacen con tu código, por lo que la mayoría de las funciones de gráficos serán incluidas en cada ejecutable, pero he intentado reducir esto al mínimo. Mire allegro.txt para más información sobre métodos precisos para quitar algunos controladores de gráficos y sonido.



No. Creo que este tipo de soporte hardware sería mucho más util como parte de un API 3D, cosa que Allegro no es (y nunca será). Si quiere trabajar en esto, la biblioteca MESA (una implementación libre de OpenGL) es en mi opinión el lugar a mirar.



Ya existen varias muy buenas actualmente, por ejemplo el paquete JGMOD. Siga los enlaces de la página web de Allegro.cc (http://www.allegro.cc/). No se le permite que sugiera que alguna de las bibliotecas existentes sea incluída en Allegro, porque este tópico ha sido discutido hasta la muerte en la lista de correo y estoy cansado de él.



Eso sería un montón de trabajo, y no tengo tiempo para hacerlo. Hay varios paquetes de soporte de red actualmente en desarrollo o flotando por la red, y en mi opinión este tipo de código es más útil como biblioteca externa que como parte de Allegro.



Unisys tiene la patente en el algoritmo de compresión LZW que es usado en el formato GIF. Quiero que Allegro sea totalmente libre y sin restricciones, lo que significa que no puedo incluir ningún código que haya que licenciar o pagar por derechos de autor.



Quizás. Intente aislar el fragmento de código mas pequeño que es capaz de reproducir el problema, y lo mirare. Si puede mandarme un programa de 10 líneas, lo solucionaré. Probablemente podría solucionar uno de 100 líneas. 1000, y no tengo ninguna oportunidad :-)



Claro. Lea las condiciones giftware en readme.txt. No me importa lo que haga con él, yno hay problemas con el uso comercial.



¡Cuando este acabado! Los ánimos son bienvenidos, pero no tengo fechas fijas de lanzamiento y no voy a hacer una para usted. Tan pronto como este hecho, será puesto al público.



Grabber puede importarlas directamente de ficheros .fnt con formato GRX o BIOS, o puede dibujarlas usted en una imagen .pcx con cualquier programa. Busque en la página de Allegro una utilidad (ttf2pcx) que convierte fuentes Windows TrueType a formato .pcx.



En la página web de Allegro (http://alleg.sourceforge.net/) hay algunos enlaces. Puede usar los patches de la Gravis (formato .pat), o ficheros SoundFont 2.0 (.sf2), pero éstos últimos deberán ser convertidos a un fichero patches.dat con la utilidad pat2dat.



Necesita la utilidad de conversión makertf (ftp://ftp.coast.net/Coast/win3/winhelp/mkrtf104.zip), y el compilador de Ayuda Windows (ftp://ftp.microsoft.com/Softlib/MSLFILES/HC505.EXE). Cree un directorio temporal, copie ahí el fichero allegro.txi del directorio allegro/docs, y ejecute los comandos "makertf --no-warn allegro.txi -o allegro.rtf -J allegro.hpj" seguido de "hcp allegro.hpj". El segundo comando dará muchos errores, pero pueden ser ignorados con tranquilidad.



El fichero allegro.rtf puede ser leído directamente por Microsoft Word e impreso desde ahí, pero debería pinchar con el botón derecho y actualizar los cambos de la tabla de contenido e índice para que primero sean rellenados con datos correctos. Alternativamente puede instalar el pack TeX y usar los programas tex y dvips para contertir allegro.txi en formato Postscript.



Mire la página web de Allegro, http://alleg.sourceforge.net/. Si tiene algo que añadir a esto, ¡por favor, mándeme la URL!


¿Por qué se considera buena práctica en programación el definir PI como una constante en vez de usar el valor 3.141592 en mi código?

Es la forma mas simple de actualizar su programa, en caso de que haya que cambiar el valor de PI. Esto también hará su programa más portable a otros compiladores que usen otros valores de PI.



Un número de tarjetas gráficas tienen versiones erróneas o incompletas de la implementación VESA, y a menudo la función vsync() no está implementada. Para ver ejemplos de dibujado sin parpadeos, mire el código del juego demo, el cual usa varios métodos para dibujarse.



Si el código funciona sin optimizaciones, podría ser un fallo de su compilador. Puede intentar forzar al compilador a hacer lo que desea mediante el siguiente ejemplo:

      while (!key[KEY_ENTER])
         yield_timeslice();
En este caso, no obstante, sería mejor usar readkey() en su lugar. O considerar actualizar o desactualizar su compilador.



Mire http://alleg.sourceforge.net/maillist.es.html.