10 abr 2007

Estúpida muchedumbre de alienígenas...

Hoy me propuse montar un motor de física (Farseer 2D Physics engine) en el Eternal Showdown. El principal motivo era que aunque el juego funcionaba (la parte que está hecha), el comportamiento de los monstruos les hacía tender a pegarse unos con otros y ocupar el mismo espacio, aparentando menos cantidad de la que realmente había.

Mi forma de resolverlo sería utilizar algún tipo de comprobación para evitar que entrase en el espacio ya ocupado por otro alienígena si no fuese estrictamente necesario, pero eso equivaldría a hacer una operación costosa (para cada monstruo hay que comprobar todos los demás, y eso tras que se hayan movido, etc.).

En fin, que preferí probar primero un motor físico. Vi las demos que traía y me gustó: Incluye movimiento, fuerzas, rotaciones 2D, etc. Más que suficiente para mis intenciones.

Encajarlo fue tan sencillo que me asustó: Con cambiar el vector de posición por el del objeto correspondiente, y asignarle unas pocas propiedades físicas, el sistema estuvo funcionando (bueno, al principio se aplicaban momentos también y eso provocaba que los monstruos se diesen empujones que les hacían girar y todo :) ).

La verdad es que ya a la primera quedó muy resultón: En vez de apilarse todos sobre el mismo pixel, los monstruos tendían a formar una especie de panal de abeja (estaba usando hexágonos para su objeto de colisión).

El problema fue el rendimiento, que no diré que cayó en picado, pero se redujo de forma excesiva. Con 200 monstruos en pantalla, ya iba mal la cosa, y eso que no se estaban teniendo en cuenta los disparos en las colisiones aún.

Echándole un ojo al código vi que, básicamente, se estaban efectuando 40.000 comprobaciones por frame para 200 monstruos, y claro, eso es mucho.

De todas formas, el motor es bastante flexible y creo que podré arreglar ese problema haciendo que las colisiones entre monstruos se hagan en pequeños grupos (por ejemplo, dividiendo en 4 partes el mapa, se pasarían de hacer 40.000 (200x200) comprobaciones a 1.000 (50x50x4)).

Espero que al final funcione bien, porque lo poco que he visto me ha gustado.

Por cierto, también se me ha ocurrido una forma de compensar mi inutilidad de dibujo para hacer los iconos de las armas... esta noche si me acuerdo pondré una imagen en el Wiki del proyecto

No hay comentarios: