Feed Rss, Atom Categoría Programación, 19 entrada(s)

Pues sí, pasó otra semana y pico y sigo dándole que te pego.  He perdido bastante tiempo buscando gráficos adecuados en OpenGameArt, y luego editándolos para poder usarlos.  Por ejemplo, el juego de piezas para el escenario que encontré estaba preparado para mapas con casillas de 40x40 píxeles, sin embargo los personajes estaban pensados para uno de 64x64 píxeles.

En cuanto al motor del mapa, no ha sido difícil adaptar el que creé para el juego de demostración de Allegro.pas.  El generador de mazmorras ha sido harina de otro costal.  El algoritmo que coloca los muros es muy simple, pero el algoritmo para ajustar los gráficos de los bordes, esquinas y rincones no funcionó como pensé al principio y me ha dado problemas.  Aun así, estoy bastante contento con el resultado.


Esas esquinas y rincones no son tan fáciles de hacer.

También he estado trabajando algo en los personajes, aunque todavía tardaré un poco en conseguirlo.

Lo cierto es que voy con bastante retraso, pero aun así creo que conseguiré presentar una buena demostración de concepto, un prototipo.

Edito: me acabo de enterar de que han ampliado el plazo hasta el día 17.  Parece que no soy el único que se ve justo de tiempo...

Ha pasado, ya, una semana del concurso que comenté en la anterior entrada.  Todavía no he empezado a codificar nada, pero eso no quiere decir que no haya empezado.

Esta semana, aparte de pensar cómo será el juego, he estado planificando, escribiendo y haciendo esquemas y diagramas.  Mirad, mirad:


Mi mesa hace unos minutos.

Planificar es algo que debería hacerse siempre antes de empezar a programar, pero por desgracia no puedo hacerlo en el trabajo casi nunca porque dice mi jefe que tardo mucho.  Y es verdad que se tarda más, pero es que a la larga ahorra mucho trabajo.  Perder el tiempo haciendo y repitiendo esquemas permite darse cuenta de dónde van a estar los problemas antes de toparse con ellos, y casi siempre ayuda a encontrar la solución mucho antes de escribir una línea.

Por ejemplo, si os fijáis en la foto que he puesto (pulsad encima para verla más grande, incluso la tecla "Ctrl" y, sin soltar, la tecla "más (+)") veréis que en las dos hojas de arriba a la izquierda hay dibujado un monigote de palos.  Esto es porque estudiando cómo dibujar y manejar los personajes, el primer sistema que pensé no me convenció y según lo he cambiado he ido encontrando problemas o cosas que luego me darían problemas.  Si hubiera empezado a programar sin hacer esos esquemas me hubiera encontrado inconvenientes a la hora de comprobar las colisiones del jugador y los enemigos con las armas, entre ellos y con el entorno (paredes, muebles, etc.).  Hubiera encontrado una solución, sí, pero es que la mejor que he encontrado me hubiera obligado a reescribir prácticamente todo el sistema de dibujado y de colisiones, lo que hubiera sido tiempo perdido.

En definitiva:  procurad dedicar un tiempo a la planificación antes de hacer cualquier cosa, no sólo programar.  Os facilitará la vida.

Por cierto:  El juego se titulará Duke of Dragonfear: Deathland, como homenaje a un juego escrito en BASIC por Tim Hartnell, con cuyos libros aprendí mucho de programación.  A ver si en lo próximo que escriba os puedo enseñar ya algo.

Vaya, pues sí hace tiempo que no escribo.  Estos dos meses han sido un poco locura, principalmente por temas de trabajo, y no me apetecía escribir. Y ahora no me apetece hablar de ello sino de otra cosa

La web Pascal Game Development convocó el concurso 1st PGD Challenge: Simple Controller, y he pensado en participar.  Hay que hacer un juego en tres semanas y la norma es que el juego ha de usar un "mando clásico", es decir, cuatro direcciones y cuatro botones.  Así que nada de ratones, pantallas táctiles, potenciómetros, giroscopios, detectores de movimiento ni cosas raras.  Personalmente me encanta la idea porque me recuerda a los juegos de los salones recreativos de mi época de jugón.

Sin embargo, en los tres días que llevamos de concurso (empezó el viernes) no se me ha ocurrido nada lo suficientemente simple como para hacerlo en tres semanas.  Así que he echado mano del Spin-o-matic que usan en el concurso SpeedHack, un programa que da ideas para videojuegos, y me ha salido lo siguiente:

  • Fear:  Inspirar temor ha de ser clave en tu juego.  Bien puede ser temor al jugador, a los enemigos, a ambos...
  • Second Person Sh... What?  El juego ha de estar en segunda persona -- esto es, ves la acción a través de los ojos de un personaje que no controlas del todo, o controlas a un personaje que indirectamente controla al personaje principal.
  • Boom, Boom, BOOM!  Debe haber muchas explosiones, con o sin una buena razón.

Las dos primeras ideas me gustan bastante, y además creo que están relacionadas entre sí.  Y la tercera siempre está bien, porque cualquier videojuego mejora con unas cuantas explosiones, y si no lo creéis es que no habéis jugado a Tetris Queen.  Todavía no estoy seguro de qué voy a hacer, pero creo que todo apunta a un horror survival de esos con zombis, oscuro y tal.

Bueno, os dejo, que me voy a pasar por OpenGameArt a ver si encuentro algo que me inspire. Hasta otro día.

Estaba repasando el foro de Club Delphi cuando llegué, de nuevo, a un artículo de Jon L. Aasenden, un programador con ideas bastante afines a las mías.

El artículo en cuestión habla sobre las posibilidades que tendría poder traducir programas de Pascal a JavaScript.  Alguna vez había pensado yo en ello, y de hecho ya existen cosas similares como Morfik y ExtPascal.

Una de las cosas que menos me gustan de JavaScript (y de PHP) es su poco control sobre los datos.  No me refiero a que no pueda obtenerse información acerca de su tipo y naturaleza, que se puede, sino a que las variables no tienen por qué ser declaradas antes de usarlas y que estas no tengan un tipo concreto, lo cual me ha generado no pocos dolores de cabeza.  Esta característica me hace perder un tiempo precioso intentando descubrir por qué el cálculo no se realiza correctamente o por qué cierto campo se obceca en permanecer vacío; y todo porque obvié incorrectamente el tipo de dato o porque escribí mal el nombre de una variable.  Con Pascal esto no pasa, ya que al tener que declarar las variables y disponer estas de un tipo determinado, si comentes un error al escribir el nombre o asignas un dato de tipo no compatible el sistema te avisa rápidamente y rápidamente corriges el error.  Combinar, por tanto, ambos mundos es una idea que me atrae mucho:  por un lado tienes la universalidad de JavaScript, y por otro la estabilidad y potencia de un lenguaje estructurado como Pascal.

Además de esto, otra cosa que me ha llamado la atención son los varios enlaces que el señor Aasenden coloca al final de su artículo, entre los que hay varios ejemplos de gráficos 3D, con modelos complejos, texturas y materiales, completamente escritos para HTML5; es decir, que se ejecutan en el navegador web sin necesidad de instalar ninguna extensión como Flash o similares. Y me ha llamado la atención porque el pasado noviembre escribí un diminuto programa para HTML5 en 3D, y tenía la intención de publicarlo, pero entre pitos, flautas y que no me centro, lo olvidé. Seguro que si lo hubiera hecho en noviembre, nada más terminarlo, hubiera ganado muchos puntos, pero ese tren ya partió.

En fin: aquí tenéis el nada espectacular ejemplo de gráficos 3D en HTML5 que escribí entonces.  Que conste que no funciona con Internet Explorer, al menos hasta la versión 8 (gracias a Theck, de GAS, por comprobarlo).  El código fuente tiene asociada la licencia zlib/libpng, utiliza conceptos básicos y está profusamente comentado, así que podéis echarle un vistazo sin problemas.

Hoy voy a contar un nuevo episodio en mi vida como desarrollador contra-corriente.  Como ya conté en mi artículo sobre los colectores de basuras, llevo tiempo trabajando en un megaprograma de gestión de clientes, pedidos, facturas, análisis, seguimiento y más cosas. También dije que hay varias cosas de este proyecto con las que no estoy de acuerdo y de las que me he quejado en repetidas ocasiones, empezando por que la planificación no fue suficiente en su momento.  Precisamente esta falta de planificación ha sido la causante de un problema que reventó hace pocos días.

Hace tiempo, al principio, sugerí que íbamos a tener problemas con el redondeo. Este no es un problema trivial, porque si no se hace bien aparecerán discrepancias y luego no hay forma de cuadrar las cuentas.  Ya entonces propuse una forma de evitarlo que usé con éxito hace años en un Terminal Punto de Venta que desarrollé cuando trabajaba en la empresa Asintec Gestión.  En aquel programa, en lugar de almacenar el valor real de los productos guardábamos un valor ficticio y lo guardábamos como un número entero.  Para obtener el valor real se dividía este número ficticio por un factor que dependía de la divisa;  así para los euros dividíamos por 100.000, mientras que para obtenerlo en pesetas dividíamos por 601.  Con este método nos quitamos dos problemas:  la conversión entre divisas (importante, porque se hizo para un hotel, y además coincidió con el paso de la peseta al euro) y teníamos una precisión de hasta la milésima de céntimo de euro, más de lo necesario.  Además, los ordenadores son pésimos con el cálculo fraccionario, siendo mucho más precisos si calcula con números enteros.

Con la aplicación que estoy desarrollando ahora, sin embargo, tampoco en esto se me hizo caso y se me obligó a almacenar y realizar todos los cálculos con euros “reales”.  Y no sólo eso, sino que la precisión se limitó a dos decimales, esto es, a un céntimo:  ni siquiera una fracción de céntimos, sino a céntimos enteros.  Esto ya es un problema con el cálculo de impuestos.  La cosa empeoró cuando en Julio entró en vigor el nuevo IVA1.  El cliente quiso que los precios finales se mantuvieran invariables aun con el cambio de IVA, sin embargo al hacer el cálculo siempre faltaban o sobraban uno o dos céntimos en cada producto.  Canté aquello de “os lo dije” con toda la sutileza de la que fui capaz y volví a sugerir la solución que he explicado antes, pero de nuevo no me hicieron caso y la solución impuesta fue aumentar en un decimal la precisión (es decir, hasta la décima de céntimo) porque así ya no faltaban ni sobraban céntimos al sumar el nuevo impuesto y se solucionaba el problema.

Hasta que se demostró que no era así.  Hace unos días, un cliente se quejó porque hizo un pedido por un importe aproximado de 1.500€, pero la factura que le enviaron había una diferencia de 21 céntimos a favor de la empresa.  Por más que revisé los cálculos, todos eran correctos, tanto en el albarán de pedido como en la factura, sin embargo la discrepancia permanecía.  Yo sabía que era un problema de redondeo, pero no lograba descubrir dónde se producía la diferencia.  Al final lo descubrí por casualidad.

Resulta que del cambio en la base de datos se encargó mi jefe, y lo realizó sólo en la tabla que almacena la información de los productos en venta.  Sin embargo, en nuestro programa el precio de los productos se almacena también en cada factura, de forma que aunque cambie el precio de los productos este no varía también en las facturas, y en la tabla donde se almacena el precio en factura no se hizo el cambio.  Es decir, que el precio del producto se guarda con tres decimales, mientras que el precio en factura se guarda con dos.  ¿Y dónde está el problema?  Pues sencillo:  en unos productos el precio es de tantos euros, tantos céntimos y menos de medio céntimo, lo que al redondear a dos decimales no afecta al precio salvo si son muchas unidades (por ejemplo, si el precio es de 10'652 al redondear queda 10'65), pero en otros es de tantos euros, tantos céntimos y más de medio céntimo, por lo que al redondear a dos decimales ese “más de medio céntimo” hace que el precio suba al céntimo siguiente (por ejemplo, de 10'656 queda 10'66).  Es decir, el mismo problema que existía al calcular el nuevo valor neto para ajustarlo a los nuevos IVA y Recargo de Equivalencia; era una bomba de relojería.

Todavía no sé si está arreglado, ya que conseguí cargarle el mochuelo a quien realmente tuvo la culpa.  Me gustaría pensar que en el próximo proyecto me harán más caso pero, visto lo visto, me temo que voy a tener que sufrir estas cosas durante mucho tiempo, todavía.


1 Lo del IVA fue otra buena, porque se puso "en duro", es decir, que para añadir los nuevos IVAs tuve que cambiar varias fórmulas matemáticas y comprobaciones en un buen número de archivos.  Evidentemente también rechazaron mi propuesta de guardar los impuestos en la base de datos para poder añadirlos y eliminarlos a gusto sin tener que cambiar ninguna fórmula;  recuerdo perfectamente que me dijo que no porque, total, era muy poco probable que cambiaran los impuestos.