jueves, octubre 16, 2008

GORILLA.BAS

Ah, el famoso GORILLA.BAS (leído "gorila-punto-bas" o "gorila-bas"). Todavía recuerdo el maravillamiento infantil que me daba hace ya muchos años (ni tantos, hace alrededor de 15 :P).

Con ese juego yo aprendí lo que eran los ángulos (con grados sexagesimales). El juego consistía en un par de gorilas, sobre edificios, tratando de matarse el uno al otro lanzando plátanos explosivos (!!!). Recuerdo que tenías que darle un ángulo y una rapidez al plátano, y también había que tomar en cuenta el viento que había en ese momento. Ja, bien vaciado.

Ja.

Mi hermano menor, el Gabo, accidentalmente borró unas líneas del programa (tendría unos 3 o 4 años) y como éramos muy salvajes nunca pudimos componerlo, y fue así como terminó el reinado del GORILLA.BAS. Mientras tanto ya íbamos descubriendo otros juegos, como Test Drive y Wolf3D.

Pero el legado de ese jueguito vivió en forma de facilidad para comprender conceptos de vector, y que si tiras un plátano con suficiente rapidez puede atravesar un edificio :P

Con este mismo espíritu, explico una situación con la que me topé haciendo un programa de cosas de física.

Estaba escribiendo un programita que simula partículas y cómo rebotan (no entre sí, sólo con objetos) y todo, cuando me dí cuenta que había partículas que atravesaban barreras. Me dí cuenta que cuando tomaba "diferenciales" de tiempo, a veces la computadora se tardaba en ejecutar todo lo que había antes de ese paso y como resultado la velocidad y la posición de las partículas se actualizaban usando información no muy conveniente para estos propósitos. Veamos qué pasa.

La posición de una partícula está ligada con la rapidez que lleva (con otras cosas más, pero este es un modelo simple). Por lo que si pasa un tiempo t, entonces la partícula se habrá movido v*t, donde v es la rapidez de la partícula. Si t es muy grande, la partícula va a dar saltos graaaandes grandes. Y la función que hice para detectar si una partícula choca con un objeto básicamente pregunta "¿se metió una partícula en un objeto?" Si sí, hace que rebote, y si no pues que siga feliz.

Entonces es claro cuál es el problema: Una partícula puede estar justo antes de chocar con un objeto, pero si se tarda la compu en hacer lo que tenga que hacer, la próxima vez va a aparecer del otro lado del objeto (!!). Y pues esto no es bueno.

Hubo que hacer un balance entre presentación y desempeño, y lo que acabé haciendo fue que si la pobre compu no puede actualizar suficientemente rápido, entonces ni modo: va a actualizar como si en el tiempo de la simulación pasaran 50 milisegundos por paso. Si la compu es rápida pues no hay problema. O no debería haberlo.

En fin, el programa (todavía sin pulir :P) está en un archivo ZIP, y se puede descargar de aquí. Nomás extraigan todo en una misma carpeta y ejecuten particulas.exe. No trae ni instrucciones ni nada, así que las pongo aquí

El programa empieza y salen 50 bolitas, un par de rayas y un como-rectángulo en medio. Las bolitas comienzan a caer porque sienten una aceleración de 10px/s². Y cuando pegan con cosas rebotan.

Hasta aquí suena medio chafa (y no se va a componer mucho :P), pero hay controles:

- La tecla R sirve para resetear el programa. Si la apachurran vuelve a empezar como si hubieran ejecutado el programa de nuevo.

- La B sirve para borrar todo. Todo todillo. Todo todillo todirijillo :P. ¿Y para qué quieren borrar todo? Pues hay opciones que son las que siguen.

- La tecla SHIFT IZQUIERDA pausa todo y permite dos acciones: botón izquierdo del ratón para agregar segmentos de rectas (hasta 13 de un jalón), y el botón derecho para hacer polígonos convexos (polígono convexo en términos llanos es un polígono "normal". Una estrella, por ejemplo, no es un polígono convexo).

- La tecla CONTROL IZQUIERDA pausa todo y permite agregar partículas al "universo". Las partículas por default sienten la aceleración por la gravedad. Comienzo a considerar el prender/apagar la gravedad.

- Las teclas ARRIBA, ABAJO, IZQUIERDA y DERECHA sirven para moverse en el "universo". Si le dejan apachurrada una tecla se siguen moviendo hasta que la suelten.

Hay algunas limitaciones: la cantidad máxima de partículas y de polígonos y segmentos es 100. Los poĺígonos pueden tener hasta 12 (¿o eran 13? Ya no me acuerdo) lados. Humm...

Y creo que ya es todo.

Ah, lo del archivo es para Windows. Lo compilé en Ubuntu pero lo probé con una máquina virtual corriendo Windows XP y sí funcionó. Además en Ubuntu lo probé con WINE y sí jaló, pero si quieren el binario para linux me dicen. Aunque se necesitan otras librerías.

Si algo no funciona o da algún error porfa díganme (si es que hay siquiera quien descargue el archivo :P). Igual sugerenciasy comentarios son bienvenidos.

Ya luego cuando documente bien los archivos los subo.


EDIT: Por alguna razón el archivo ya no está, voy a intentar resubirlo en cuanto el servidor ese se deje. De todas maneras el programa ya ha cambiado bastante, jajaja.

10 comentarios:

Anónimo dijo...

ke onces, me sorprende tu programa de las particulas, aunke tiene unos detalles, como por ejemplo, una particula ke no tiene mucha distancia en altura contra alguna linea, al momento de chocar da una elevacion exageradamente alta ke la elevacion anterior ke fue minima, tambien, umm, la tecla shit izquierda, y la tecla control izquierda y el click izquierdo del mouse, no hacen nada, le doy B y se limpia todo, pero al momento de kerer dibujar algo, narinas, no pasa nada, saludos y chido el desarrollo, ya vi una parte del codigo y esta bien estructurado, gandalla xD

tambien intente hacer los mismos pasos cuando esta corriendo el programa y naranjas.

También esta como mensaje en tu messenger (Kopete, Piggy, aMSN, gaim, etc. el ke uses)

Unknown dijo...

Lo de las partículas que rebotan un chingo probablemente es por un condicional que estúpidamente puse abajo del cálculo del tiempo. Pero lo del teclado lo estoy checando, porque está raro.

Anónimo dijo...

"la tecla shit", jajajaja supongo que también ha de haber "cerveza tab"

Anónimo dijo...

Jaja me acuerdo que la primera vez que vi una computadora fué en tu casa y lo primero que aprendí fue a jugar ese juego, claro después de hacer la tarea en equipo que nos dejaban en la primaria...

Anónimo dijo...

Idea para choques:

Si la partícula "recordara" (con una variable) la posición de la última verificación de impacto. Entonces se podria verificar si entre la posición actual y la última verificada (en línea recta) hay algún objeto. En ese caso, rebotar.
De esta forma no importaría que la compu fuera lenta, y/o la velocidad fuera muy alta.

Saludos desde Uruguay. Felices fiestas.

Unknown dijo...

Hasta donde lo veo, sí importaría si la computadora es lenta (en el sentido de que la simulación no se vería fluida, sería muy precisa, pero como creo que mencioné quise también que se viera en movimiento la cosa).

Al menos como me imagino la implementación de esa idea (que no está sin sus problemas :P).

Huxley dijo...

¿En que aplicación hizo su programa,trate de descargarlo en donde dice "aquí"(pero el sitio en donde guardo su programa no aparece, supongo que sera por que ya tiene tiempo que escribió ese código-gorilla.bas 16 Oct 2008)?Que padre supongo que esas cosas se ven en alguna materia como Programación lineal ,Lenguaje ensamblador o Arq. de una Comp.

Unknown dijo...

Qué onda.

Sí, se desaparece el archivo del servidor donde lo puse; lo subiré a otro ahora que regrese al defectuoso.

Y pos... sí, la infraestructura, por decirlo así, del programa se suele ver en cursos de programación (al menos en mi escuela, que es de matemáticas). La bronca es que, por ejemplo, luego no queda tiempo para ver las librerías de gráficas y todo eso. Yo nunca ví SDL en la escuela :(

Huxley dijo...

Wow,Simple DirectMedia Layer (SDL) ,yo no sabía lo que era, un conjunto de bibliotecas desarrolladas en C, supongo que se refiere al ambiente gráfico de Turbo C++,a la librería graphics.h?

Unknown dijo...

Ah, no; graphics es aparte. Este programa lo hice usando SDL, que pone el modo gráfico para un programa de otras maneras.

No recuerdo si graphics de Borland podía pasar de SVGA, la última vez que usé graphics ya tiene buuuu. Y pos hay que irse actualizando :P

Para algunas cosas en 2D SDL es suficientemente bueno, aunque aprenderlo sólo con el manual es una lata, jajaja.

Al final, para cosas medio simples en 2D, yo recomendaría usar SDL sobre librerías ya viejitas, como graphics. Por supuesto hay muchas alternativas y supongo que hay opciones mejores, pero lo cierto es que desconozco el panorama :P