Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Menu

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.

Mostrar Mensajes Menu

Temas - Güarmigue

#1
General / Modelo X: Sistemas conversacionales
26 de Agosto de 2007, 08:37:37 PM
(Aviso: sé que puede resultar mucho texto, trato de ser ameno y sencillo. Siento que en esta entrega tampoco haya bonitas imágenes que acompañen el artículo pero es un artículo sobre diálogos al fin y al cabo ;P En el blog siempre queda algo más bonito:))

Enlazando con uno de los apartados de la anterior entrega, los diálogos, hoy voy a tratar de responder lo mejor que sepa a la primera petición que he recibido sobre la serie "Modelos de juegos". La sugerencia en cuestión la hizo [Fonet] mediante un privado en el foro de Stratos hace ya más de dos semanas. Le dije que le respondería tras publicar lo que tenía entre manos y, con las vacaciones, ese momento se ha alargado hasta hoy. No me enrollo más y paso a la petición y a la respuesta (a lo CPI :)):

Citar[Fonet] escribió:
   Estaria bien desglosar las aventuras graficas levemente (en general, nada de SCUMM) y un poco mas a fondo los sistemas de conversacion (Ya sea por frases a lo Monkey Island o por temas a lo Broken Sword), ya que veo que es el punto complejo de este genero.

Este es un tema que yo mismo me he planteado varias veces ya que las aventuras gráficas (AG) son un género que me encanta. Hace poco, cuando comencé con un amigo a desarrollar una pequeña AG que ahora mismo está parada en el cajón de "Cuando alguien se ponga conmigo", le metí mano al engine Wintermute y me pareció una solución bastante lógica la que le daba. Primero que todo, si quieres crear una AG y no necesitas crear todo el código para sentirte bien como persona, sino que de verdad te quieres dedicar al argumento, los diálogos, los personajes y demás, debes usar esta herramienta. Wintermute nos provee de un montón de comodidades para crear nuestra aventura e incluso sin saber programar podremos escribir los diálogos y las acciones con un poco de ayuda de los tutoriales que adjunta el programa. Para los que seáis más hardcore y os gustaría programar por completo una aventura o una herramienta conversacional (tal vez para un bot o para otros fines, luego volveré sobre esta parte...) sigamos.

En Wintermute la técnica utilizada es simple y a la vez efectiva: los diálogos funcionan exáctamente de la misma forma que una mákina de estados de las que expliqué la implementación hace varias entregas. Tenemos un switch, un montón de frases con sus identificadores guardadas en memoria, y dependiendo de la entrada del jugador (1, 2, 3, 4, etc al elegir la frase, el icono temático, el botón "abrir", "usar", "hablar", etc. o la imagen de un objeto del inventario...) se ejecuta un case que a su vez dentro tendrá, o bien una serie de impresiones en pantalla con la conversación, o una llamada a una función que gestionará el nuevo sub-diálogo. Además en Wintermute se añade la posibilidad de declarar una variable de estado que indica si esa rama del diálogo ha sido o no elegida con anterioridad, y en caso afirmativo podemos elegir entre permitir o no que se muestre más veces en ese diálogo o en todo el juego. Para muestra un botón:


function dialogoCaracol()
{
 var Responses;
 var selected;

 var loop = true;

 Game.StartDlgBranch(\"dialogCaracol\");

   // Preparamos las respuestas para poder referenciarlas luego fácilmente
   Responses[0] = \"Buenas, soy ornitopato y quiero ser un gran detective\";
   Responses[1] = \"Vengo a resolver EL ASESINATO MISTERIOSO\";
   Responses[2] = \"Disculpe buen tendero, ¿sabe dónde está la pollería de Alcatraz?\";
   Responses[3] = \"Mi Mamá me ha dicho que los caracoles son la representación del mal\";
Responses[4] = \"¿Qué cosas vendes en la tienda?\";
Responses[5] = \"Mmmhn... en realidad no quería hablar con usted\";

 while(loop){

   // fill the response box
   Game.AddResponseOnce(0, Responses[0]);
   Game.AddResponseOnceGame(1, Responses[1]);
   Game.AddResponseOnce(2, Responses[2]);
   Game.AddResponseOnceGame(3, Responses[3]);
   Game.AddResponse(4, Responses[4]);
   Game.AddResponse(5, Responses[5]);

   // let the player choose one
   selected = Game.GetResponse();

   // let the actor say the selected sentence
   // (that's why I use the array for storing the sentences)
   actor.Talk(Responses[selected]);

   //El caracol responde en función de lo que le hayamos dicho
switch(selected){

case 0: dialDetective();
break;

case 1: dialAsesinato();
break;

case 2: dialAlcatraz();
break;

case 3: this.Talk(\"¿Tú eres un hijo de pata verdad?\");
actor.Talk(\". . .  \");
break;

case 4: dialQueVendes();
break;

case 5: loop = false;
break;
}
 }

 Game.EndDlgBranch();
}


En ese trozo de código se implementa la primera lista de opciones del primer diálogo de nuestra aventura, como veréis hay "cases" en los que se desarrolla un pequeño diálogo y otros en los que se invoca a una función, que tendrá el mismo esqueleto que esta y que gestionará esa rama de diálogo. De esta forma vamos creando el árbol de diálogo de forma relativamente cómoda. Para saber más sobre diagrámas o máquinas de estado podéis ir al artículo que me referí arriba clickando AQUÍ.

Una cosa a tener en cuenta en esta forma de implementar los diálogos es que el texto que los conforman se encuentra dentro del mismo código. Esto es un inconveniente a la hora de localizar el juego a otros idiomas. Por tanto, si queremos hacer las cosas bien tendremos que cambiarlo. En Wintermute este problema se soluciona con una herramienta que se encarga, a posteriori, de sacar todas las líneas de diálogo del código y crear un fichero independiente. Pero claro, eso es para que el desarrollador no tenga que mancharse las manos. Si queremos hacerlo nosotros, será mucho más fácil preverlo y crear un archivo con todo el texto que queramos localizar y un identificador para cada linea independiente. Esto podemos hacerlo en un archivo texto plano, en un archivo binario o, preferiblemente, en un XML, que nos permitiría escribir las frases en distintos idiomas como atributos de un mismo identificador o tener varios archivos en los que guardar identificadores y frases con su correspondiente predicado de idioma. En cualquier caso, yo no sé mucho de XML y no me voy a meter por ahí, la idea es esa.

Podríamos tener, por ejemplo, un archivo Español.txt en el que guardemos los trozos de texto uno debajo de otro separados por ';' (para poder usar retornos de carro dentro de los textos) y otro llamado English.txt en el que los textos esté guardados en el mismo orden, solo que en este idioma. A la hora de comenzar el juego pediríamos al jugador elegir el lenguaje del juego y cargaríamos un archivo u otro en función de la elección, asignando un identificador ordinal sucesivo a cada texto.

Esto puede resultar pesado a la hora de escribir el código ya que el resultado será un montón de instrucciones con identificadores que apuntan a los distintos textos de nuestro archivo. Y tenemos otro problema. Necesitamos algún sitio donde tener escrito previamente todo el diálogo de forma comprensible, ya que esta forma de referenciarlo no nos permitirá seguirlo con facilidad. Este problema se va a presentar siempre, usemos la técnica que usemos, a no ser que creemos nosotros mismos una herramienta que nos solucione la conversión. Que yo sepa esa herramienta aún no existe, y si alguien la conoce me encantaría que comentara con un link o algo de información ;) Pero podemos hablar de como sería la ayuda ideal a la hora de escribir los diálogos.

Nosotros, como ayuda poco costosa de construir, simplemente nos inventamos un sistema de colores y punteros para poder dintinguir las distintas ramas de diálogo conforme las escribíamos en una hoja de cálculo. Pero la herramienta ideal a la que me refiero sería una aplicación que nos permitiera ir creando el árbol de diálogo fácilmente y luego lo convirtiera ella misma en el código necesario.



En el dibujo, el diálogo de arriba en un formato más fácil de seguir.

La herramienta debería permitir en cada rama de diálogo, pulsar sobre ella e ir creando nuevos cuadros de diálogo y nuevas hebras con facilidad. Así como identificar a qué personaje consiste cada línea (en el ejemplo todas las frases son del protagonista menos la subrayada que pertenece al caracol maligno), de forma que luego la aplicación tuviera toda la información necesaria para construir el código y los archivos de localización.

No es un trabajo sencillo y sobre todo necesitaríamos definir muy finamente cómo debe ser una salida estandar, es decir, cómo serían los archivos de diálogos de forma que luego pudieran utilizarse desde el juego como si de una librería o una clase se tratara.

Con todas estas fantasías y propuestas le doy fin a este artículo que ya se está alargando demasiado. Creo que he recorrido los principales baches o inconvenientes que nos podemos encontrar a la hora de implementar los diálogos en una aventura, un juego de rol o cualquier otro juego que utilice un sistema conversacional con posibilidad de elección (si el jugador no puede elegir solo tendremos que poner las frases o lanzar los archivos de audio con el tiempo suficiente para que el jugador los lea, uno tras otro y punto.) Haré un pequeño resumen para atar cabos:

* Los diálogos suelen tener que escribirse, al menos, dos veces. Una en la que los creamos sobre papel o un formato electrónico cómodo para nosotros y otra cuando los codificamos. Lo ideal sería escribirlos una vez en una herramienta cómoda que hiciera el trabajo sucio de copiar-pegar al código por nosotros.

* De cara a la localización, el texto debería guardarse en archivos independientes del código que permitan traducir el texto sin tener que tocar los fuentes.

* Tenemos que tener siempre en cuenta y apuntar a qué diálogo dentro del juego pertenece el texto que escribimos, así como a qué rama dentro de esa conversación y a qué personaje de los involucrados. Es importante que todo esté bien apuntado ya que luego a la hora de implementar serán todo identificadores y código.

Escribir los diálogos es, sin duda, la parte más divertida de desarrollar una aventura así que todas estas operaciones no son tan tediosas como puede parecer. Yo me lo pasé muy bien escribiendo los diálogos que tenemos y espero continuarlos pronto (algún día). Pasarlos al código no era tan divertido, pero con Wintermute sí que ves rápidamente el resultado, lo que es muy de agradecer. Los diálogos son una forma divertida (y poco costosa en comparación con otras como las animaciones o los distintos vestuarios) de infundir vida a un personaje de juego, así que ánimo a todos aquellos que hayan pensado meterle mano al tema. Al principio puede parecer confuso, pero ya veréis cómo gana el juego cuando vuestro PJ empiece a soltar frases divertidas, ingeniosas o estúpidas como respuesta a las acciones o a los propios PNJs. ;)

Enlaces relacionados:
Página oficial de Wintermute
#2
General / Modelos IX: Ideando un juego
21 de Agosto de 2007, 05:03:12 PM
Siento el largo retraso, las vacaciones se alargaron más de lo esperado. Acabo de llegar, estoy viendo el correo, colgando esto y  a dormir :P Como siempre también está ya en el blog...

-------------------------------------



En la entrega anterior hablé de la historia, los personajes y los ingredientes necesarios para crear un guión atractivo al jugador. Para que eso se convierta en un juego tenemos que pensar ahora en la jugabilidad. En los obstáculos y pruebas (de destreza e inteligencia básicamente) que pondremos al jugador para ir avanzando por nuestra historia.

Dentro de la jugabilidad o gameplay tendremos en cuenta el género elegido (el jugador espera algo del género del juego igual que lo espera de las historias, si vendemos el juego como un shooter no podemos hacer que medio juego se desarrolle sin dar ni un solo tiro). Así, en un juego de rol (RPG- Rol Playing Game), que es en lo que dije que me centraría en esta entrega, hay varias cosas que no debemos olvidar:

- Debe haber combates. Bien a espada, con algún tipo de magia o armas de fuego.
- EL jugador debe estar dotado de algún sistema de recompensa por experiencia de juego que le permita mejorar las habilidades de su personaje.
- Debe haber diálogos (al menos algo).

Estos son los elementos que yo considero mínimos en un RPG. Las formas de implementarlos pueden ser muy variadas y ahora veremos algunas, así como otros componentes que pueden alargar o hacer más interesante nuestro juego.

Combates: suelen ser la forma principal de entretenimiento y consumo de tiempo en un RPG. Por tanto debemos procurar que sean lo suficientemente divertidos y variados para que el jugador no se aburra de estar horas matando monstruos para limpiar una mazmorra (o para atravesar un desierto marciano lleno de espeluznantes alienígenas).

La variedad es la parte más fácil. La conseguimos añadiendo nuevas armas. Las más potentes estarán escondidas en lugares de difícil acceso o disponibles en tiendas a precios en consonancia con su poder. Las demás se las iremos suministrando al jugador conforme avance por el juego. Bien al eliminar a un nuevo enemigo que utilizaba esa arma, como recompensa ofrecida por un PNJ al jugador tras conseguir una misión que se le había encargado o simplemente distribuidas por las zonas por las que debe pasar el jugador para completar el mapa. También podemos añadir nuevos combos o técnicas que el jugador podrá aprender o conseguir gastando puntos de experiencia (luego hablo de eso).

La diversión requiere de nuevo de ese poquito de "chispa" que debemos proveer a toda obra de arte. Para que un combate sea divertido, debe de ser fluido, el jugador debe de saber lo que está haciendo y además debe poder emplear varias técnicas a su antojo y combinarlas o enlazarlas. De esta forma las distintas combinaciones harán el combate menos repetitivo. Parece una tarea fácil, pero ajustar la velocidad, las animaciones, el número de llaves, los controles necesarios, la clasificación de las armas (y por tanto su comportamiento) requiere de muchas horas de juego, testeo, ensayo error, rectificaciones y sobre todo aceptar que muchas cosas estarán mal y tendremos que escuchar opiniones negativas y repetir el ciclo a ser posible varias veces. Como ejemplo, el sistema de combate de Blade (the edge of darkness) me pareció magistral, el más fluido y preciso y controlado que he visto, sin duda una referencia aunque el juego decepcionara en ventas (lo que yo creo que se debe a la austeridad de sus mapas y a la ausencia de una historia más atractiva y más PNJs amigos...)

Como ya dije antes, el combate no tiene que limitarse a combate con armas cuerpo a cuerpo. Podemos introducir armas a distancia, armas de fuego, magia, armas futuristas, poderes psíquicos o lo que se nos ocurra...

Recompensas: Es algo también básico de los juegos de rol. El jugador espera ganar puntos, dinero o bienes por cada combate en el que resulte vencedor, misión conseguida o nivel superado. Los puntos nos servirán para luego canjearlos y mejorar las habilidades del personaje en el manejo de las armas, su agudeza visual o sus opciones de diálogo. El dinero y/o los bienes para canjearlos por otros bienes (armaduras, joyas, armas, un objeto necesario para una misión, comida, etc) Ésta es una mecánica relativamente fácil de introducir y que a algunos jugadores les resulta tan atractiva o más que el combate. En este caso también necesitaremos testeo y algunas pruebas para establecer el coste y la recompensa de cada acción, pero debería resultar más fácil que en el caso anterior a no ser que nuestro juego se base en gran medida en el trueque, el regateo, el comercio a lo largo de los pueblos y cosas así. Como ejemplo en este apartado tenemos en general los MMO y en especial Ultima Online. Este juego siempre ha sido una referencia en juegos de rol y sobre todo en compra-venta entre jugadores y transformación de materias primas en bienes. En WOW se ha alcanzado el punto de que los jugadores pagan dinero real por bienes en el juego. Otro ejemplo de comercio, esta vez en una campaña individual, puede ser Fable. Pero en este caso de un comercio no muy bien ajustado. En este juego podías comerciar entre los pueblos y sacar un dinero con la diferencia de precios, así como comprar las tiendas o el bar (después de hacer desaparecer a su dueño) Pero hacía falta emplear demasiado tiempo y esfuerzo en viajar y aprenderse las mercancías para que realmente mereciera la pena hacerlo a la vez que avanzamos en la aventura. Para sacar provecho a este aspecto del juego había que dedicarse a él casi por entero, lo que no lo hacía muy atractivo a no ser que seamos unos auténticos freaks del comercio.

Diálogos: Son los conductores de la historia. Si un juego tiene muy poco diálogo podemos sospechar que su guión no es muy profundo ni rebuscado (aunque puede que no sea así y utilice las imágenes o pequeñas animaciones para ir guiándonos, pero por este método es mucho más difícil conseguir profundidad). Los diálogos tendrán lugar con PNJs bien amigos o enemigos y deben dar varias opciones que varíen en el tono o la actitud para que el jugador pueda elegir con la que se identifique o con la que identifique a su personaje. Además es interesante ofrecer, cuanto menos, la sensación de que la elección de diálogo condiciona la respuesta y por tanto el futuro de la aventura. En la entrega anterior comentasteis que las varias alternativas en la historia o incluso varios finales son muy interesantes y estoy totalmente de acuerdo. Los diálogos son una forma de conseguirlos. Por supuesto no son la única. También podemos ofrecer varias alternativas de acabar una misión con sus respectivas repercusiones e incluso condicionar la historia por el combate (algo más peligroso y menos habitual, pero que bien hecho puede ser interesante) Por ejemplo, imaginemos una misión que pueda resultar en varias ramas de historia distinta:

En nuestra aventura en Marte, mientras viajabas hacia el oeste en busca de un recambio de batería de energía solar para tu pueblo, te desvías un poco para pasar por un poblado en el que hay un familiar que tal vez te ofrezca alimento para el viaje a buen precio. Al llegar resulta que su hija está muy enferma y necesita atención constante. Tu reconoces la enfermedad y sabes la cura y donde conseguirla, pero también sabes que es cara. Se te presentan varias alternativas que marcarán la actitud de tu personaje y la de algunos PNJs hacia él: puedes pedir a tu tío el comerciante el dinero y comprarla en la botica en la que sabes que está, seguro que tu tío te dará algo a cambio por el porte por salvarle la vida a tu prima. Pero también podrías pedirle el dinero y luego robar la medicina, ganarías doblemente. O tal vez podrías comprarla con tu dinero y luego cambiársela a tu tío por comida, tal vez le saques así más partido aunque tu tío te odie por regatear con la vida de su hija. A lo mejor planeas robarla pero los guardias te descubren y te meten una paliza de escándalo tras la que, para cuanto te has recuperado, tu prima ha muerto...

Podemos introducir tantas opciones como queramos y cada una podrá traer (o no) sus repercusiones. En general añadir opciones de juego es costoso y no reporta una vida más larga a la campaña, si no que mejora la experiencia de juego y la rejugabilidad. Pero si añadimos varias opciones debemos asegurarnos de que el jugador nota que ese no era el único camino y que la historia podría ser de otra forma y además debemos hacerlo con suficiente frecuencia y con suficientes repercusiones como para que el jugador desee realmente jugar la aventura de nuevo. Varios finales pueden ser una buena opción, pero no la única. De nuevo pondré a Fable como juego del que aprender de los errores. En este juego la única diferencia de ser bueno a ser malo es que la gente te corea o te abuchea, pero no cambia la historia ni las misiones apenas. Solo a veces es más incómodo estar en los pueblos si eres malo y en general ganas menos experiencia, lo que hace el juego más aburrido. Como contra ejemplo pondré a OutCast, un juego mucho menos conocido pero que años antes que Fable ya llevó a cabo de forma muchísimo mejor el mismo comportamiento. En Outcast si atacabas o traicinabas la confianza de los habitantes del mundo en el que te encontrabas inmerso (esclavos de un imperio) la aventura se convertía en una odisea en la cual los esclavos te delataban a los guardias, se negaban a venderte nada o a darte información y desconfiaban de ti. Por otro lado tu misión en teoría no tenía nada que ver, tu ibas a buscar un aparato de tecnología perdido y podías encontrarlo por la fuerza, buscando a tu rollo o preguntando y ayudando a los aldeanos. Pero el hecho de que recordaran tus acciones y te las tuvieran en cuenta te hacía sentirte realmente dentro de un poblado y un mundo vivo y no de un videojuego donde un montón de monigotes te corean al pasar porque tu percentil de bondad es superior a 70.

Cada apartado requiere de tiempo para ser implementado y para ser probado y ajustado, y en general es difícil que nuestro juego destaque en todos ellos. Pero siempre hay que tenerlos en cuenta para cumplir unos mínimos en cada uno de ellos y centrarnos en el que queramos que sea el punto fuerte de nuestro juego. Vosotros ¿qué aspecto preferís en un juego de rol? ¿Creéis que me dejo algún punto importante? ¿Cual es vuestro juego de rol favorito y por qué? Vuestros comentarios siempre son enriquecedores ;)
#3
General / Modelo VIII: Ideando una historia
05 de Agosto de 2007, 09:26:04 PM
Voy a salirme un poco del código para hablar durante un par de capítulos de la idea y el diseño del juego. Con los pocos algoritmos que hemos visto hasta ahora, y un poco de lógica y variables de control podemos atacar gran cantidad de modelos de juegos sin problemas en cuanto a implementación de la mecánica.  Pero escribir un juego no es solo ponerse a picar código. Para que un juego sea más que un simple clon, otro más del montón, hay que trabajar también en las demás áreas. Esto es: el guión, los gráficos, el sonido, los diálogos, la caracterización de personajes... etc. Voy a dedicar un par de articulillos a como afrontar estos problemas, y luego seguiré con los algoritmos. Ahora mismo quiero mascar este área.

Bien, antes de nada, identifiquemos los juegos que necesitarán más parte creativa y en cuales podemos prescindir de muchos pasos:

- Si estás empezando y quieres hacer un juego sencillo, en un plazo de tiempo corto, deberías plantearte un juego de puzzles, un arcade o un clon de un juego antiguo sencillo (véase pong, arcanoid, come cocos, space invaders, etc) En estos géneros no necesitas guión ni diálogos, los personajes pueden ser muy sencillos, cuando los hay, y con unos
cuantos sonidos vas servido. Es una buena opción si quieres aprender aspectos de programación y, como ya he dicho, para tener algo en poco tiempo. Incluso así, si eres bueno y tu juego gusta, puedes salir bien parado, siempre pondré el ejemplo del Tetris o del Zuma.

- Si ya superaste esa fase, quieres afrontar un desarrollo a largo plazo e incluso puede que tengas un equipo o un par de amigos dispuestos a afrontar el largo desarrollo contigo, puedes plantearte otros géneros. Como la aventura gráfica, el rol, o la estrategia, y otros* Estos géneros, por definición, están cojos si no cuentan con un buen guión, con diálogos, misiones concretas, gran cantidad de niveles y personajes... Por lo tanto, requieren de mucho más trabajo "no código".

* (de los MMO ya se habla bastante en el foro. Yo lo considero un género para auténticos valientes o para gente con un equipo detrás, ya que hay que tener en cuenta otros muchos aspectos más allá de los que ya he mencionado, como el aspecto multijugador, el tener servidores con capacidad suficiente disponibles, un software bien optimizado al menos en cuanto a comunicaciones, mantenimiento de cuentas de usuario, generar suficiente contenido en los servidores para tener entretenidos a los pjs, controlar las trampas, etc, etc...)

Tomemos por ejemplo, los juegos de rol. En mi opinión son el género más completo, ya que cuentan con diálogos como las aventuras, con personajes que evolucionan y se equipan, historias elaboradas, e incluso, muchas veces,  sistemas de combate táctico. Veamos en qué tendríamos que pensar a la hora de desarrollar un juego de rol:

Lo primero que tenemos que pensar es en la historia. Esto incluye la ambientación, los personajes, los motivos de la campaña (objetivos globales, como salvar a la princesa o conseguir el tesoro de Smauhg  el dragón o cosas así...)  enemigos, etc. Vayamos detallando:

- La ambientación del juego es algo esencial. Tenemos que decidir qué tipo de juego será, como estamos hablando de grupos con pequeño presupuesto, innovadores y emprendedores, por favor, eludamos el universo AD&D y derivados. Para buscar inspiración nos vale todo: el cine, el teatro, la música, la literatura, la moda. Por ejemplo, mirando la cartelera, podíamos hacer un juego de rol del mundo subterráneo de las ratas, podemos tener alcantarillas, zonas mas campestres, depuradoras, sótanos... en cada zona podemos buscar enemicos (bichos mutantes bajo el polígono industrial, aves rapaces, gatos y zorros en las zonas de campo, competidores como los topos o los urones...) podemos crear sociedades, ciudades, etc. Pero no me gustan las ratas, podíamos hacerlo de ciencia ficción, en la campus alguien habló de marte y la terraformación, ¿Qué tal un juego de rol en un marte en terraformación, donde el oxígeno o las plantas son las monedas de cambio y las distintas ciudades-tribus tienen misiones que cumplir y alienígenas o rebeldes con los que luchar? Y si no nos gusta algo tan innovador y queremos apostar sobre más seguro siempre podemos elegir un estilo medieval pero reformarlo, por ejemplo un juego de rol basado en Aquelarre en lugar de en AD&D o uno basado en la España del Siglo de Oro... Lo importante es ofrecer algo diferente pero que suene familiar y atractivo, ¿y eso cómo se consigue? Vamos al siguiente paso.

- Una vez escogida la ambientación, lo cual deberemos tener en cuenta siempre para ir elaborando material gráfico y sonoro e ir haciendo los bocetos dentro de este estilo, pensemos en el guión. Hay unos mínimos que todo guión debe cumplir, a saber:

* Tiene que haber, al menos, una pareja, y deben pasarlo mal :P Parece una tontería, pero si no hay una dama que rescatar o con la que casarse, una bruja a la que derrotar de la que de repente tu personaje se enamora o cosas así, ya estamos perdiendo puntos. Es inevitable que estas historias centren la atención del jugador y lo hagan querer saber como acaba todo. Así que no lo olvides, al menos una pareja. Pueden ser inocentes a lo mario-princess, evidentes como George Stobbart y la francesita o una búsqueda eterna como la de Manny Calavera, eso ya a tu elección.  

* Debe haber un némesis. Un enemigo absoluto o varios. Puede ser también una organización, una banda o un pueblo, pero siempre habrá un jefe y debemos poder identificar a alguien como el malo al que queremos matar. Si de camino nos saca de nuestras casillas con su maldad suprema (cual caracol) mejor. Hay malos inocentes, como el Dr. Robotnic, pero si son crueles, megalómanos y egocéntricos, como LeChuck, Darth Vader, <del datetime="2007-08-05T18:31:20-02:00">George Bush</del> Kane (Command and conquer) mejor. A veces algunos juegos le han dado la vuelta a la tortilla, en Overlord o Dungeon Keeper tú eres el malo maloso y el objetivo es destruir todo lo bueno y honorable, pero al final es lo mismo, tener un némesis.

* Deberías tener, al menos, un gran amigo. Lo de los héroes solitarios está bien a veces, pero un gran amigo simpático y bonachón que te saca las castañas del fuego cuando hace falta (Glotis, Wally, Cuervo, Luigi, etc) tabién ayuda a crear un vínculo con el juego.

* Debe haber recompensas intermedias, cambios de guión, pero no deben ser demasiado inesperados. El jugador siempre se irá formando una idea de hacia donde va y porqué, si el final es demasiado distinto de lo imaginado se sentirá estafado o defraudado, hay que dar cosas inesperadas dentro de lo razonable y lo lógico. Por ejemplo, en el juego de Marte, si todo son tribus no podemos meter una fase en la que nos tengamos que enfrentar con miles de soldados imperiales de un momento para otro. Si el enemigo es un imperio esos soldados deben estar presente siempre, y si son rebeldes o ladrones, procura que sean más o menos fuertes, pero no que sean millones...

* Debemos representar distintas actitudes y formas de ser en los personajes, de forma que haya variedad como en la realidad  (no vale que todos sean unos tíos cachas super valientes aunque algo toscos con las damas) y que cada jugador pueda sentirse reflejado o identificado con alguno de los personajes de la historia,así como identificar a personas que conozca en otros. Esto es más fácil de lo que parece, simplemente asocia tú también a cada personaje con alguien que hayas conocido o conozcas, exagéralo un poco y haz que ese personaje actúe en consecuencia a la personalidad que le has asignado.

Con esos elementos podemos montar el guión, ahora solo necesitamos un poco de arte para que estos personajes cobren vida tanto en los gráficos como en los diálogos y en el sonido. Conseguir un personaje consistente y adecuado a su historia es difícil y lo suyo es que lo escribamos todo, hagamos bocetos, los enseñemos a algunos amigos y comprobemos que todo va encajando en la ambientación. Hablando del guión hemos tratado también el tema de los personajes, veamos que más nos queda. Tenemos un guión, personajes, unos objetivos generales. Nos queda la verdadera historia.

- Para conseguir sus objetivos y derrotar a los malos el personaje deberá pasar por una serie de aventuras (no vale el caso ese de "- Tienes que subir al castillo, matar al dragón y rescatar a la princesa. - Vale, lo hago, ahora ¿qué?") Puede que necesitemos viajar a un lugar lejano y para ello conseguir un barco o un avión. Tal vez íbamos a comerciar con un pueblo lejano y por el camino unos vimos que unos bandidos llevaban prisionera a una muchacha preciosa y nos sentimos forzados a seguirlos. Y si mientras los seguimos nos metemos en mitad de un campo de batalla o les perdemos la vista en un pueblo enorme y debemos buscar por él... Mil cosas. Id construyendo una historia. Su longitud dependerá de la vida que queráis que tenga el juego (no podemos tener al jugador 10 horas matando bandidos para alargar la vida del juego, si queremos un juego largo necesitamos una historia larga). Aquí es donde debéis escribir y planificar mucho.  Tenemos que especificar cuanto tiempo de juego ocupará cada zona. Debe merecer la pena hacer todos los gráficos y material necesario para cada una (somos un grupo pequeño y no podemos tener al grafista 2 meses graficando el interior de una catedral si luego nuetro personaje llega, habla con el cura y se va...) y debe ser siempre coherente (bueno, hay juegos en los que se les va el pisto como en Tomb raider con los dinosaurios, pero claro, era Tomb Raider...)

Bueno, creo que en cuanto a la historia está bien. La semana que viene hablaré de otras cosas que debemos decidir y que podemos (y debemos, sobre todo por cuestión de tiempo, pero también para no cansarnos y para hacer que enlacen bien todas las partes) hacer a la vez, como las mecánicas de juego, de combate, etc. Para tener al final el esbozo de un futuro juego de rol. Todo lo que he contado en este artículo vale para todo juego con historia elaborada, aunque lo haya hecho pensando en juegos de rol también nos serviría para una aventura, y quizá no tanto para un juego de estrategia, al no ser necesarios tantos personajes, pero sí en cuanto a creación de un ambiente, un guión, un némesis y demás.

Como siempre podéis comentar si creéis que olvido algo o si queréis contad vuestras experiencias al respecto, como creadores, jugadores, lectores, etc.
#4
General / Modelos de juegos: propuestas y quejas
28 de Julio de 2007, 10:00:44 PM
Debido a que sigo en la campus party, colaborando como dinamizador y además tratando de aprovechar el tiempo y durmiendo poco, no tengo la cabeza muy en condiciones ni el tiempo suficiente para un nuevo artículo de modelos de juegos. Pero si que traigo una entrada con varias propuestas y reivindicaciones al respecto :)

Bien, como siempre digo: vayamos por partes. Lo primero que quería hacer es ofrecerme como consultor de videojuegos amateur.

¿Cómooor?

Pues que si alguno queréis que trate un tipo de problema, hable de un modelo o desglose las dificultades de llevar a cabo un juego en concreto, me comentáis o me mandáis un correo (juanmi 'punto' malak 'arroba' gmail 'punto' com) y yo lo traigo en cuanto pueda a Modelos de Juegos.

Existen dos motivos principales por los que hago estos artículos. El primero es obligarme a leer y aprender cositas de videojuegos con regularidad, pensarlas y masticarlas un poco. El segundo es el poco apoyo y distribución de ideas, opiniones constructivas (no en plan "mira google") y tutoriales (no de engines) que veo en el foro y en el mundillo en general. Acabo de asistir a la mesa redonda de videojuegos (aunque esto no sé si lo publicaré ahora o mañana, son las 19:30 del sábado 28) y he visto lo mismo de siempre: gente que te dice que te partas los cuernos para que ellos vean que vales pero que no ofrecen formación, guías, mínimos, frameworks, ni nada parecido. EJSainz ha hecho una pregunta sobre la importancia de la jugabilidad y los expertos la han esquivado con descaro. También ha habido una pregunta sobre sueldos esquivada y bastante poco interés en las inquietudes y propuestas de los asistentes... Y la idea más o menos con la que sales es:

   "Oye macho, si eres un maquina, te curras muchísimas horas por tu cuenta, haces un juego que nos impresione, no te pones exigente con el tema de sueldos (porque al fin y al cabo trabajas en lo que te gusta, es como allí en málaga, que el hecho de tener playa cerca lo cuentan como un plus en el trabajo...) y te mueves un montón... cabe la posibilidad de que alguna empresa se fije en ti"

Señores, el que llegue a ese nivel, tal vez no necesite ninguna empresa que lo contrate...

Bueno, al meollo, que me descentro. El segundo objetivo es ayudar y ofrecer material mascado a todo el que pueda interesarle, así que por eso abro esa puerta de las preguntas. Si queréis aprovecharla me sentiré alagado y estaré encantado de ayudar. Sino, seguiré eligiendo los temas yo y explicando lo que me parezca.

La segunda propuesta que tengo es de colaboración, ya lo he comentado varias veces y me he propuesto a mi mismo no hacerlo más, pero vuelvo a decirlo porque creo que es importante: todo el que pueda y quiera aportar su granito de arena en los comentarios será gratamente recibido. Enlaces de interés, experiencias personales, comentarios de estilo o de fondo, etc. Toda colaboración es bien recibida ya que enriquece y ayuda a mejorar. Soy consciente de que hay mucha gente en el foro de que sabe mucho más que yo y que haría esto mucho mejor que yo. Pese a eso, lo sigo haciendo por los motivos que ya he comentado, pero estaría de lujo tener comentarios de aquellos que hayáis tocado los temas que toque.

No me alargo más, tenéis mi opinión y mis propuestas. Como siempre, la decisión de ser un elemento activo o pasivo recae sobre cada uno en particular.
#5
General / Modelo VII: Diagramas de estado
23 de Julio de 2007, 05:14:38 PM
Perdón por la tardanza, pero estoy de campus :) en el blog está el post puntual porque lo programé, pero a mi no me sale en el planet...

Definición: Los diagramas de estados son grafos dirigidos cuyos nodos representan posibles estados de un autómata y cuyos arcos representan la posibilidad de pasar de un estado a otro. La posibilidad de usar esa transición suele venir indicada con una condición sobre la entrada o sobre las variables del autómata. Un diagrama de estado debe tener un estado inicial y al menos un estado de salida.

Jugabilidad: En resumidas cuentas un diagrama de estados es una representación gráfica para un autómata. Un autómata es un programa que pasa a un estado u otro en función de las variables de entrada y del estado anterior. No tiene que hacer nada, solo cambiar de estado cuando debe. Pero en diseño de videojuegos, podemos aprovechar este comportamiento para que cada estado simule una determinada situación, con lo que podemos emular comportamientos o movimientos o reacciones inteligentes.

Por ejemplo, en el tema de movimiento, si tenemos un juego en el que queremos que un enemigo patrulle una determinada zona, podemos usar un diagrama de estados para hacerlo. Creamos tantos nodos como vertices tenga el polígono que define la ruta a seguir por el patrullero, luego creamos al autómata que cambia de un estado al siguiente si y solo si el patrullero llegó al punto indicado en ese nodo y sino permanece en el nodo y manda al patrullero la orden de avanzar en la dirección del punto.



Pero, además de para esto, podemos usar los diagramas de estados para simular comportamientos o reacciones de los enemigos. En el mismo patrullero anterior podríamos definir otro diagrama de estados que indicara el estado de alerta. En condiciones normales el enemigo está en modo descanso, patrulla pero lleva haciéndolo meses y está horriblemente aburrido. Si oye algo o ve algo puede pasar a modo alerta, con lo que estará mucho más pendiente y tal vez se mueva más rápido o se quede quieto oteando. Si ve al jugador pasaría a modo ataque, y emprendería fuego a la vez que alerta a la base.



Técnicamente éste diagrama de estado no es correcto al no tener estado de salida, pero en nuestro caso el enemigo patrullaría indefinidamente hasta que cambiáramos de fase o de zona o resultara muerto en combate. Podríamos añadir el nodo "Muerto" al que se podría llegar desde todos los estados al recibir un evento de colisión con una bala, pero para no emborronar más el grafo no lo he puesto, tampoco está en los algoritmos de abajo ya que simplemente tendríamos que eliminar el objeto (estructura o lo que sea) patrullero en ese caso.

Esto mismo puede aplicarse a la base. En condiciones normales hay patrullas y ambiente distendido. Si alguien da la voz de alarma se doblan las patrullas y todos pasan a estado de alerta. Si alguien dispara, los soldados más cercanos acuden al lugar del tiroteo...

No sé si os recuerda a algo, pero éstos podrían ser, muy básicamente, los diagramas que rigen el comportamiento de los alemanes en Commandos I. (En el segundo iban a recoger los paquetes de tabaco y eran más suspicaces :P) No hace falta mucho más para emular reacciones o estados de ánimo. En el Vampire Bloolines, que estoy jugando ahora, en la primera misión tienes que conseguir unos explosivos de un traficante. Si llegas a un "acuerdo" con él no tiene porqué haber derramamiento de sangre. Pero en el momento en el que tratas de entrar por la fuerza, robar algo o dices algo sospechoso, todos se ponen en modo ataque y te fríen a tiros, (por suerte eres un vampiro y las balas poco menos que te resbalan) en algunos casos sin ningún tipo de intersección como "EH! tú ¿qué haces robándonos el radiocasete?" Simplemente comienzan a disparar y el jugador comprende rápidamente que esa acción lo ha delatado...

Dificultades técnicas: Bien, los diagramas son muy útiles, pero ¿Cómo los programo? Al hablar de grafos dirigidos, puede parecer que es una tarea difícil, pero nada más lejos. Para programar un diagrama de estados solo necesitamos una sentencia de condición switch.

Veamos el ejemplo del comportamiento del patrullero:

int estadoPatrullero1(int entrada){

switch(entrada){
case 0: //0 => sin rastro de enemigo ni pista a la vista
if(estadoActual() == ALERTA){
tiempoAlerta--;
if(tiempoAlerta == 0) cambiaEstadoPatrullero(CALMA);
}
if(estadoActual() == ATAQUE){
cambiaEstadoPatrullero(BUSQUEDA);
cambiaEstadoBase(ALERTA);
}
break;

case 1: //1 => pista localizada
if(estadoActual() == CALMA)cambiaEstadoPatrullero(ALERTA);
if(estadoActual() == ALERTA)cambiaEstadoPatrullero(BUSQUEDA);
break;

case 2: //2 => enemigo a la vista
if(estadoActual() == CALMA)cambiaEstadoPatrullero(ATAQUE);
if(estadoActual() == ALERTA)cambiaEstadoPatrullero(ATAQUE);
break;

}
}

int estadoPatrullero2(int estado){

switch(estado){
case CALMA:
if(recibePista()){
cambiaEstadoPatrullero(ALERTA);
cambiaEstadoBase(ALERTA);
}
if(enemigoALaVista()){
cambiaEstadoPatrullero(ATAQUE);
cambiaEstadoBase(ALERTA);
}
break;

case ALERTA:
if(recibePista())cambiaEstadoPatrullero(BUSQUEDA);
else if(enemigoALaVista()){
cambiaEstadoPatrullero(ATAQUE);
cambiaEstadoBase(ALERTA);
}else{
tiempoAlerta--;
if(tiempoAlerta == 0)cambiaEstadoPatrullero(CALMA);
}
break;

case ATAQUE:
if(!enemigoALaVista()){
cambiaEstadoPatrullero(BUSQUEDA);
if(!recibePista())cambiaEstadoPatrullero(ALERTA);
}
break;
}
}

He puesto dos posibles algoritmos que implementarían el estado del patrullero y sus avisos a base. En el primero recibimos como entrada de la función el resultado de procesar la información que puede ver el patrullero, en la segunda recibimos el estado actual y el algoritmo llama a las funciones que chequean lo que ve el patrullero. Son ejemplos bastante simples, pero espero que ayuden a hacerse una idea de por donde van los tiros. En el estado de Calma el patrullero ejecutaría el diagrama de patrulla, en el de alerta podría otear y tener un bonus en sus sentidos (ampliar el rango de visión como ocurría en comandos) o simplemente andar más rápido. En el estado de ataque el enemigo dispararía al jugador (que se encuentra a la vista forzosamente) y lo buscaría si intenta escapar. Si el soldado lleva un tiempo X en estado de Alerta y no ha vuelto a ver ninguna pista ni enemigo, vuelve a estado de Calma...

Esta misma utilidad se puede utilizar para juegos de estrategia en la que la computadora, en función de las estadísticas o el modo de juego de sus contrincantes se ponga en estado atacante o defensivo. También son muy utilizados en aventuras gráficas, donde según el estado de la aventura o las acciones que hayamos desempeñado, un mismo personaje nos hablará de unas cosas o de otras.

En definitiva, los diagramas de estado son una herramienta muy potente y muy utilizada en videojuegos. Para tener claro a la hora de implementar lo más cómodo es tener el diagrama dibujado y luego solo tenemos que hacer el switch e ir implementando las funciones que rigen el comportamiento en cada estado.
#6
General / Modelo VI: Pathfinding y aplicaciones
15 de Julio de 2007, 11:14:48 PM
Hoy voy ha hablar un poco del algoritmo A*, utilizado para pathfinding y de posibles aplicaciones de éste y otros algoritmos que resuelvan el mismo problema en los videojuegos.

Definición: los algoritmos de pathfinding o búsqueda de caminos son aquellos que encuentran un camino válido desde un punto A a otro B en un terreno con obstáculos.

Estos obstáculos pueden ser bien infranqueables o simplemente aumentar el coste del camino. Los algoritmos de pathfinding son en realidad algoritmos de búsqueda de caminos en grafos, pero veamos un pequeño boceto de principio a fin:

Lo primero que haremos para poder aplicar el algoritmo es dividir el terreno o escenario en cuadrantes (nodos del grafo) y clasificar cada uno de ellos como obstáculo o terreno libre. Como comentaba antes esta división no tiene por qué ser binaria, podemos asignar a cada cuadrante un entero que indique su coste en ser atravesado (por encima de un máximo arbitrario el cuadro se considerará infranqueable). A la hora de estimar el coste del camino tendremos en cuenta estos enteros y podremos elegir el camino más ventajoso o rápido.

Una vez tenemos los nodos, el algoritmo A* es un algoritmo voraz que va creando un árbol cuyos nodos son los posibles nodos del camino y va escogiendo siempre el que estima mejor. ¿Cómo hacemos ésto? Pues para cada nivel introducimos un nodo nuevo por cada casilla o cuadro alcanzable del terreno, en el primer nivel estos nodos serán todos los adyacentes al cuadro en el que se encuentre el personaje que desea moverse.

Una vez introducidos, evaluamos, con un heurístico optimista, la distancia del camino desde cada uno de estos nodos al nodo meta, lo que nos da un valor de su bondad. Un heurístico de estimación optimista quiere decir que todos los caminos posibles desde ese nodo tendrán un costo igual o mayor al calculado en la función heurística. Además para que podamos llamar a nuestro algoritmo A* esta función debe ser monótona, lo que quiere decir que el coste desde el nodo actual no puede ser mayor que el coste en el nodo actual no puede ser mayor que el coste desde un sucesor del nodo actual más lo que nos cueste alcanzar al sucesor. En nuestro ejemplo se suele utilizar la distancia del punto al destino sin obstáculos. De este modo cumplimos ambas restricciones, somos optimistas (el camino sin obstáculos siempre será más corto que con obstáculos) y monótonos, ya que en el mejor de los casos (si no sorteamos ningún obstáculo) El coste desde un sucesor a la meta más el coste en llegar al sucesor será igual al coste estimado.

Cuando hayamos calculado la bondad de cada nodo podremos escoger el mejor y desechar todos los demás gracias a lo que nuestra heurística cumple las condiciones comentadas.

Desde el nuevo nodo realizaremos la misma operación hasta alcanzar el nodo destino.

El camino encontrado es óptimo y ya solo tendremos que mover el personaje de un nodo al siguiente de la lista hasta alcanzar el destino.

Para aquellos que no os haya quedado muy claro o queráis ampliar o conocer otros algoritmos de pathfinding al final pondré algunos enlaces.

Aplicaciones:

En el mundo de los videojuegos existen muchas aplicaciones para este tipo de algoritmos. Son necesarios siempre que tengamos un escenario o nivel con objetos sólidos o infranqueables en los que queramos que el computador mueva un objeto de un punto a otro del escenario. Esto ocurre como todos sabemos en los juegos de estrategia y de rol, donde le decimos a las tropas donde deben moverse y ellas se las apañan para alcanzar ese punto a través del terreno. Pero también cuando el ordenador necesita mover un enemigo de un punto a otro del escenario necesitará de un pathfinding.

El problema del algoritmo que he comentado es que no es dinámico, y por tanto si queremos que, por ejemplo, un enemigo persiga a un jugador tendríamos que recalcular el camino a seguir por el pnj cada poco tiempo, lo que puede resultar demasiado costoso.

Pero para estos casos podemos usar técnicas mixtas. Por ejemplo en un arcade los enemigos (verde) podrían utilizar el pathfinding para ir a la habitación en la que está el jugador (azul), o a determinados puntos de control dentro de esa habitación (amarillo) donde su posición sea ventajosa. Una vez con el jugador "a tiro" simplemente deberían orientarse en la dirección del vector que apunta desde ellos al jugador.



Para ampliar:
A* para principiantes: una explicación muy sencilla, con varios gráficos, que nos dejará el algoritmo A* bien clarito.
A* en la wikipedia - A la derecha tenéis enlaces a algoritmos relacionados así como el pseudocódigo del algoritmo y un pequeño análisis de su complejidad.
The Game AI Page: Pathfinding - enlaces a algoritmos y papers sobre búsqueda de caminos.
#7
General / Modelo V: Detección de colisiones
09 de Julio de 2007, 12:35:09 AM
Antes que nada agradecer a aquellos que votaron en la encuesta del foro y más aun a los que comentaron su opinión. Gracias por el apoyo y vuestros consejos.

Dado que la encuesta ha resultado en una aplastante victoria de los algoritmos, voy a centrarme más en ellos. Pero shephiroth me dio una idea que me gustó que es la de hablar de algoritmos pero mostrar aplicaciones prácticas y ejemplos. Procuraré traer un algoritmo o grupo de algoritmos nuevo cada semana, pero también habrá semanas que dedicaré a un modelo de juego o a ejemplos de juegos que aplican algoritmos ya vistos. Como siempre los comentarios, críticas y aportaciones son bien recibidas.

Hoy voy a hablar un poco de detección de colisiones y al final traigo una pequeña sorpresa, para los que sean capaces de leerlo completo :P

Definición: Tomaremos como Algoritmos de Detección de Colisiones (a partir de ahora ADC) aquellos que se ocupan de que, en la geometría de un juego, no haya intersecciones entre objetos. Además estos algoritmos pueden indicar cómo debe reaccionar determinado objeto en caso de intersecar a (chocar con) otro.

Dificultades técnicas:
Los AGC son, si no los acotamos, algoritmos muy costosos, ya que tenemos que calcular la intersección de cada objeto con todos los demás y para cada caso tendremos que comprobar cada pixel o cada vértice de cada objeto... Esto los hace en principio muy costosos computacionalmente, y por eso son uno de los temas más tratados en programación de juegos. Para acotar el problema e incluso reducir su orden de complejidad tenemos que saber bien qué resultados queremos obtener y qué es lo que realmente necesitamos. Por ejemplo:

   * Si los enemigos y objetos del juego siguen un camino predefinido o son estáticos no necesitarán de estos cálculos y podremos aplicar el ADC sólo al jugador principal.
   * Si la forma de los objetos de nuestro juego es cercana a un cuadrado o un círculo (un cubo y una esfera en 3D) no necesitaremos algoritmos complejos y este será un problema casi resuelto.
   * Tenemos que saber cuánta exactitud queremos conseguir y cuanto sacrificio computacional representa.

Como dijo Jack el Destripador: Vayamos por partes...

Muchas librerías y motores traen funciones más que de sobra para hacer el trabajo sucio por ti. Si estás utilizando o pretendes utilizar cualquier motor o librería, lo que debes hacer es leer qué funciones te provee y cómo puedes utilizarlas para cumplir tu objetivo. Si eres un campeón y estás escribiendo tu juego desde cero o simplemente quieres aprender cómo va esto de la detección de colisiones... Sigamos ;)

Lo primero que debemos hacer, una vez evaluado nuestro problema, y si necesitamos velocidad y tenemos muchos objetos que comprobar, es dividir el escenario en una cuadrícula. Si tenemos un escenario 2D esto será fácil, si tenemos 3D, pero básicamente los movimientos son a lo largo y ancho de un escenario, podremos dividir igual que antes, el plano XY. Si no, tendremos que dividir en cubos. ¿Para qué hacemos esto? Para acotar el número de objetos con los que haremos cálculos. De todos los objetos que necesiten ser revisados por el ADC, eliminaremos aquellos que se encuentren en cuadros separados de la cuadrícula, con lo que ahorraremos mucho cálculo inútil. En el dibujo de ejemplo, solo calcularemos la intersección del jugador (azul) con los objetos rojo oscuro, que son los que se encuentran dentro de sus cuadrículas (verde).


Dibujo1: División del escenario.

Una vez reducido el número de objetos que necesitan comprobación pasaremos al test de intersección propiamente dicho. Aquí también hay muchas técnicas, voy ha hacer un pequeño repaso de peor a mejor:

   * Si estamos en 2D podemos comprobar pixel a pixel si dos sprites se superponen, esta es la técnica que afina al máximo, pero muy costosa.
   * Tanto en 2 como en 3 dimensiones podemos aplicar la técnica de cajas o esferas envolventes o bounding boxes/spheres. Esta técnica consiste en definir un cuadrado o círculo que acota completamente cada objeto. Hacer cálculos con éstas cajas es muy sencillo ya que son formas sencillas:

     
     Dibujo 2: Bounding boxes/spheres
         o - Para comprobar colisiones con el rectángulo del jugador, para cada vértice de un rectángulo objeto comprobamos:
           SI (xPunto > xJugador) Y (xPunto < xjugador + anchoJugador) Y (yPunto > yJugador) Y (yPunto < YJugador+largoJugador) ENTONCES El punto se encuentra dentro del rectángulo -> COLISIÓN DETECTADA.
         o - Para comprobar colisiones con círculos:
           SI (suma de los radios) > (distancia centroJugador, centroObjeto) ENTONCES COLISIÓN DETECTADA.
   * Si los objetos del juego están constituidos por vértices y aristas podemos aplicar funciones de intersección entre aristas, puntos y planos. Esta es una solución más costosa pero más certera que la anterior. Podríamos obstar por soluciones intermedias, como tener un modelo en muy baja poligonización para la detección de colisiones y otro para la representación gráfica. O tener al jugador dividido en partes y aplicar bounding boxes a cada parte para luego comprobar a nivel de superficie sólo las partes que dieron positivo en el primer test.
   * Podemos usar árboles BSP (partición binaria del espacio) para dividir recursivamente las BB y obtener más precisión

.
.
.

Hay decenas de técnicas, por ahora creo que está bien como introducción, más abajo dejo unos cuantos links para los que quieran profundizar. ¡¡Y ahora viene la sorpresa!!

Esta semana me puse un ratillo y completé el menú y el sistema de fases de un juego inspirado en el Asteroids que comencé hace tiempo. La verdad es que quería añadir algunos detalles más, sobre todo gráficamente para explotar un poco el pequeño sistema de partículas que implementé, pero hacía tiempo que no lo cogía y le había perdido ganas, así que por ahora estoy contento con poder mostrar un juego cerrado. Es totalmente procedural, como todos mis jueguecillos hasta ahora (nada de imágenes, solo código).

La detección de colisiones es a nivel de aristas, Java provee de funciones para el cálculo de intersecciones entre aristas y rectángulos y decidí utilizar las aristas ya que los polígonos de los meteoros y la nave están almacenados como listas de vértices. No divido la pantalla ni en cuadros ni nada de eso ya que el juego no requiere demasiado y yo no quería meterme en más fregados (a mi no me consume ni un 10% de CPU, comentadme que tal os va).

Espero que os divertáis un poco, si os picáis dejadme comentada vuestra puntuación máxima. ;) Yo no he podido jugar mucho, ni siquiera he llegado a los octaedros, me quedé en los 32000 puntos. :P

El juego: Podéis jugar desde el Blog o pinchando AQUÍ

(Para jugar es necesario tener instalado el JRE 1.6 - Java Runtime Enviroment -)

Enlaces para ampliar: (en inglés, encontré poco que rascar en español...)

GamesPP - Varios tutoriales, desde lo más básico a técnicas avanzadas.
N toturials - Explicaciones básicas con código y un bonito Applet de ejemplo.
Team gamma - Más técnicas, papers, videos...
Esto mismo en BLOG - algo mejor formateado y más accesible :)
#8
General / Modelos de juegos V retrasado
04 de Julio de 2007, 08:48:25 PM
Hola, no sé si alguien lo notó, pero esta semana faltó mi comentario de modelo de juego, estuve de viaje y no tenía nada preparado con antelación, mea culpa. Pero para resarcirme, y en vista del nulo éxito de la última entrega voy a hacer una pequeña encuesta hasta el siguiente:

¿Preferís que hable de algoritmos útiles en modelos de juegos o del gameplay de juegos en general, mas o menos punteros?

Es decir, a partir de ahora me centraré en una de las secciones para poder escribir más de ella, ¿cuál preferís?
#9
Campus Party / Al final voy a la campus!!
28 de Junio de 2007, 09:04:37 PM
Buenas, pos eso, ¡¡que quería difundir mi alegría!! Este año no iba a ir por el tema de la liquidez económica,  pero al final se me ofreció una gran oportunidad: voy como colaborador y no solo no me cuesta sino que cobro! :D

Así que allí estaré, las mañanas currando y el resto del día campeando por ahí. Estoy pensando hacer un video-log o algo de mi estancia...

Nada, ahora me toca informarme de las actividades y demás a última hora... ¡¡pero ya estoy impaciente!!

Perdonad mi ignoracia pero: apuntarse en el Clan sirve para algo más que para reservar una parcela del aparcamiento para las tiendas del clan ¿?
#10
General / Modelo IV: Juegos de Carreras
25 de Junio de 2007, 10:14:44 AM
Siguiendo con el estilo de hasta ahora voy a hablar de juegos de carreras 2D, por ahora estoy presentando modelos de juego que no requieran de un gran equipo o una gran inversión, para todos aquellos que estamos empezando.

Definición: Juegos de carreras son aquellos en los que varios jugadores compiten con un vehículo por llegar antes a la meta o dar antes un número de vueltas a un circuito. Sobre todo me centraré en el aspecto bidimensional, ya que el objetivo de estos articulillos es repasar mecánicas y no gráficos o programación de forma intensiva.

Jugabilidad: En este tipo de juego el gran aliciente es la competición, sobre todo con otros jugadores humanos. En los casos en los que el juego cuente con un gran nivel de simulación (marchas, física realista, daños en el vehículo, importancia de la meteorologías, elección de neumáticos, tipo de tracción, etc...) El reto de conducir al máximo y no morir en el intento puede resultar muy interesante, así como en los juegos más arcade pueden incluir elementos de ataque-defensa como armas, aceite o clavos (o plátanos ;)) para la carretera, o simplemente una física y mecánicas de juego que nos permitan darle un empellón al coche de al lado sin morir nosotros también. Dependiendo del tipo de juego que queramos construir potenciaremos una cosa u otra (no podemos poner metralletas en el moto GP porque el jugador ya está bastante entretenido con aprenderse el circuito, seguir la trazada y demás como para andar dando tiros, además de que no es lo que busca...) De la misma forma no podríamos complicar el Mario Kart con boxes, elección de neumáticos, daños realistas o cosas así, porque perdería toda la diversión.

Dificultades técnicas: Como se ha podido ver el apartado anterior, este tipo de juegos varía mucho dependiendo de si preferimos un arcade o un simulador. El primer caso se parece mucho a implementar un asteroids con una nave para cada jugador y poco más. Es el caso más simple, Para este caso solo tendremos que implementar una física mínima en cuanto a fuerza de empuje y velocidad resultante:

Dibujo1 Dibujo2
Dibujo1 muestra un ejemplo de juego de carreras cenita, Dibujo2 de uno con vista trasera 2D

Cada coche (o lo que sea) tendrá una velocidad y una fuerza de empuje actual (la flecha negra) así como una fuerza de empuje de dirección para el siguiente paso (la flecha azul, que en este caso indica que el jugador ha pulsado "girar a la izquierda") La fuerza resultante para el siguiente paso será la suma de ambas, con lo que conseguimos que haya "inercia" y el coche no responda únicamente a las teclas de dirección. Además tendremos una tecla "acelerar" y otra "frenar" la tecla acelerar aumenta el tamaño de la flecha resultante, mientras que la de frenar la disminuye. Por tanto, en cada frame tendríamos:

1. Comprobar si está pulsada alguna tecla, en cuyo caso creamos el vector dirección asociado. En caso de estar acelerando o frenando, aumentamos o disminuimos la variable "velocidad" del coche.
2. Sumar el vector dirección*velocidad más el vector inercia*peso_del_coche, el resultado es el nuevo vector inercia, sumado a la posición del coche será su nueva posición.

La forma de calcular los vectores dirección será distinta dependiendo del tipo de vista que escojamos para nuestro juego. Tanto si la vista es cenital, como si el juego es 3D estos vectores tendrán la forma del dibujo 1, y por tanto dependerán del vector director del coche. Es decir, al vector que indique hacia donde mira el coche, le sumaremos 90 grados para el vector izquierda y restaremos 90 para el vector derecha. En el caso de un juego en plan Road Runner es más sencillo, ya que el vector izquierda y derecha siempre serán los mismos, solo variará la velocidad del vehículo, su peso y la resultante en cada caso, pero todo esto nos da igual a la hora de implementar la función.

Con esto y ajustando un poco los parámetros podemos conseguir una conducción arcade entretenida. Para añadir elementos de simulación habría que tener en cuenta otros muchos detalles. Como ejemplo se me ocurre implementar estos cálculos de vectores la parte trasera y delantera del vehículo, así podríamos aplicar el vector dirección*velocidad solo a las ruedas con tracción mientras que el vector inercia afectaría a ambas partes. También podríamos implementar el desgaste de las ruedas de forma que si el desgaste en las rueda izquierda aumenta el coche tenderá a ese lado... Al final todo se reduce en una serie de vectores en el plano XY que modifican la posición del coche.

Por tanto, y a modo de resumen podríamos decir que el modelo más sencillo es el Dibujo2. Luego vendría el Dibujo1 (en plan micromachines) y la dificultad aumentaría al meter más física, más simulación o física 3D o de colisiones, por ejemplo.

En este caso la IA la voy a dejar como pregunta ¿Como implementaríais un coche controlado por computador? ¿lineas de trazada, puntos de control?

En cuanto a la parte gráfica necesitaremos un poco más de trabajo que en en el último modelo de juego. Deberemos dibujar o renderizar un sprite para cada una de las posiciones posibles del coche (en el dibujo1 serían mínimo 8, una cada 45 grados, en el Dibujo2 podría bastarnos con 3 o 5...) Además de distintos coches, o al menos distintos colores (debemos poder diferenciar los distintos vehículos) Y un escenario. Además, los efectos de sonido son una gran ayuda en este tipo de juegos, motores, frenazos, golpes y demás ayudan a dar vidilla y verosimilitud al juego, así que aquel programador que tenga previsto seguir mi orden e implementar primero el ajedrez, luego el tetris y luego un juego de carreras, que para este último comience a trabajar en equipo y se busque a alguien que le haga unos gráficos graciosos y le busque efectos de sonido, además así aprenderá a llevar un proyecto con otra persona, algo que puede ser tan enriquecedor como frustrante...

Como siempre en el blog está más bonito, y tiene los dos dibujos, que ahora mismo no tengo tiempo de enlazarlos y como siempre pido la colaboración de cuantos más mejor: ¿Qué os parecen por ahora estos resúmenes? ¿Os resultan útiles a los novatos? ¿Por qué los que no lo sois no contáis vuestras experiencias? ¡Se supone que esto es un foro de desarrolladores de videojuegos! ¡¡Alguien tiene que haberlo intentado!!
#11
General / Modelo IV: Juegos de Carreras
24 de Junio de 2007, 10:13:30 PM
Siguiendo con el estilo de hasta ahora voy a hablar de juegos de carreras 2D, por ahora estoy presentando modelos de juego que no requieran de un gran equipo o una gran inversión, para todos aquellos que estamos empezando.

Definición: Juegos de carreras son aquellos en los que varios jugadores compiten con un vehículo por llegar antes a la meta o dar antes un número de vueltas a un circuito. Sobre todo me centraré en el aspecto bidimensional, ya que el objetivo de estos articulillos es repasar mecánicas.

Jugabilidad: En este tipo de juego el gran aliciente es la competición, sobre todo con otros jugadores humanos. En los casos en los que el juego cuente con un gran nivel de simulación (marchas, física realista, daños en el vehículo, importancia de la meteorologías, elección de neumáticos, tipo de tracción, etc...) El reto de conducir al máximo y no morir en el intento puede resultar muy interesante, así como en los juegos más arcade pueden incluir elementos de ataque-defensa como armas, aceite o clavos (o plátanos ;)) para la carretera, o simplemente una física y mecánicas de juego que nos permitan darle un empellón al coche de al lado sin morir nosotros también. Dependiendo del tipo de juego que queramos construir potenciaremos una cosa u otra (no podemos poner metralletas en el moto GP porque el jugador ya está bastante entretenido con aprenderse el circuito, seguir la trazada y demás como para andar dando tiros, además de que no es lo que busca...) De la misma forma no podríamos complicar el Mario Kart con boxes, elección de neumáticos, daños realistas o cosas así, porque perdería toda la diversión.

Dificultades técnicas: Como se ha podido ver el apartado anterior, este tipo de juegos varía mucho dependiendo de si preferimos un arcade o un simulador. El primer caso se parece mucho a implementar un asteroids con una nave para cada jugador y poco más. Es el caso más simple, Para este caso solo tendremos que implementar una física mínima en cuanto a fuerza de empuje y velocidad resultante:

Dibujo1 Dibujo2
Dibujo1 muestra un ejemplo de juego de carreras cenita, Dibujo2 de uno con vista trasera 2D

Cada coche (o lo que sea) tendrá una velocidad y una fuerza de empuje actual (la flecha negra) así como una fuerza de empuje de dirección para el siguiente paso (la flecha azul, que en este caso indica que el jugador ha pulsado "girar a la izquierda") La fuerza resultante para el siguiente paso será la suma de ambas, con lo que conseguimos que haya "inercia" y el coche no responda únicamente a las teclas de dirección. Además tendremos una tecla "acelerar" y otra "frenar" la tecla acelerar aumenta el tamaño de la flecha resultante, mientras que la de frenar la disminuye. Por tanto, en cada frame tendríamos:

1. Comprobar si está pulsada alguna tecla, en cuyo caso creamos el vector dirección asociado. En caso de estar acelerando o frenando, aumentamos o disminuimos la variable "velocidad" del coche.
2. Sumar el vector dirección*velocidad más el vector inercia*peso_del_coche, el resultado es el nuevo vector inercia, sumado a la posición del coche será su nueva posición.

La forma de calcular los vectores dirección será distinta dependiendo del tipo de vista que escojamos para nuestro juego. Tanto si la vista es cenital, como si el juego es 3D estos vectores tendrán la forma del dibujo 1, y por tanto dependerán del vector director del coche. Es decir, al vector que indique hacia donde mira el coche, le sumaremos 90 grados para el vector izquierda y restaremos 90 para el vector derecha. En el caso de un juego en plan Road Runner es más sencillo, ya que el vector izquierda y derecha siempre serán los mismos, solo variará la velocidad del vehículo, su peso y la resultante en cada caso, pero todo esto nos da igual a la hora de implementar la función.

Con esto y ajustando un poco los parámetros podemos conseguir una conducción arcade entretenida. Para añadir elementos de simulación habría que tener en cuenta otros muchos detalles. Como ejemplo se me ocurre implementar estos cálculos de vectores la parte trasera y delantera del vehículo, así podríamos aplicar el vector dirección*velocidad solo a las ruedas con tracción mientras que el vector inercia afectaría a ambas partes. También podríamos implementar el desgaste de las ruedas de forma que si el desgaste en las rueda izquierda aumenta el coche tenderá a ese lado... Al final todo se reduce en una serie de vectores en el plano XY que modifican la posición del coche.

Por tanto, y a modo de resumen podríamos decir que el modelo más sencillo es el Dibujo2. Luego vendría el Dibujo1 (en plan micromachines) y la dificultad aumentaría al meter más física, más simulación o física 3D o de colisiones, por ejemplo.

En este caso la IA la voy a dejar como pregunta ¿Como implementaríais un coche controlado por computador? ¿lineas de trazada, puntos de control?

En cuanto a la parte gráfica necesitaremos un poco más de trabajo que en en el último modelo de juego. Deberemos dibujar o renderizar un sprite para cada una de las posiciones posibles del coche (en el dibujo1 serían mínimo 8, una cada 45 grados, en el Dibujo2 podría bastarnos con 3 o 5...) Además de distintos coches, o al menos distintos colores (debemos poder diferenciar los distintos vehículos) Y un escenario. Además, los efectos de sonido son una gran ayuda en este tipo de juegos, motores, frenazos, golpes y demás ayudan a dar vidilla y verosimilitud al juego, así que aquel programador que tenga previsto seguir mi orden e implementar primero el ajedrez, luego el tetris y luego un juego de carreras, que para este último comience a trabajar en equipo y se busque a alguien que le haga unos gráficos graciosos y le busque efectillos de sonido, además así aprenderá a llevar un proyecto con otra persona, algo que puede ser tan enriquecedor como frustrante...

Como siempre me gustaría obtener opiniones y experiencias personales, ¿os gustaría que me explayara más que hablara mas de programación, del gameplay? ¿Porque casi nadie cuenta nada de sus juegos o intentos de juegos? Sería muy enriquecedor para los demás y se supone que esto es un foro de desarrolladores ¡Alguien tiene que haberlo intentado al menos!

PD: El el blog tenéis las imágenes y demás, mañana las enlazo y formateo un poco... ;)
#12
General / Modelo IV: Juegos de Carreras
24 de Junio de 2007, 10:12:50 PM
Siguiendo con el estilo de hasta ahora voy a hablar de juegos de carreras 2D, por ahora estoy presentando modelos de juego que no requieran de un gran equipo o una gran inversión, para todos aquellos que estamos empezando.

Definición: Juegos de carreras son aquellos en los que varios jugadores compiten con un vehículo por llegar antes a la meta o dar antes un número de vueltas a un circuito. Sobre todo me centraré en el aspecto bidimensional, ya que el objetivo de estos articulillos es repasar mecánicas.

Jugabilidad:
En este tipo de juego el gran aliciente es la competición, sobre todo con otros jugadores humanos. En los casos en los que el juego cuente con un gran nivel de simulación (marchas, física realista, daños en el vehículo, importancia de la meteorologías, elección de neumáticos, tipo de tracción, etc...) El reto de conducir al máximo y no morir en el intento puede resultar muy interesante, así como en los juegos más arcade pueden incluir elementos de ataque-defensa como armas, aceite o clavos (o plátanos ;)) para la carretera, o simplemente una física y mecánicas de juego que nos permitan darle un empellón al coche de al lado sin morir nosotros también. Dependiendo del tipo de juego que queramos construir potenciaremos una cosa u otra (no podemos poner metralletas en el moto GP porque el jugador ya está bastante entretenido con aprenderse el circuito, seguir la trazada y demás como para andar dando tiros, además de que no es lo que busca...) De la misma forma no podríamos complicar el Mario Kart con boxes, elección de neumáticos, daños realistas o cosas así, porque perdería toda la diversión.

Dificultades técnicas: Como se ha podido ver el apartado anterior, este tipo de juegos varía mucho dependiendo de si preferimos un arcade o un simulador. El primer caso se parece mucho a implementar un asteroids con una nave para cada jugador y poco más. Es el caso más simple, Para este caso solo tendremos que implementar una física mínima en cuanto a fuerza de empuje y velocidad resultante:

 

Dibujo1 muestra un ejemplo de juego de carreras cenita, Dibujo2 de uno con vista trasera 2D

Cada coche (o lo que sea) tendrá una velocidad y una fuerza de empuje actual (la flecha negra) así como una fuerza de empuje de dirección para el siguiente paso (la flecha azul, que en este caso indica que el jugador ha pulsado "girar a la izquierda") La fuerza resultante para el siguiente paso será la suma de ambas, con lo que conseguimos que haya "inercia" y el coche no responda únicamente a las teclas de dirección. Además tendremos una tecla "acelerar" y otra "frenar" la tecla acelerar aumenta el tamaño de la flecha resultante, mientras que la de frenar la disminuye. Por tanto, en cada frame tendríamos:

1. Comprobar si está pulsada alguna tecla, en cuyo caso creamos el vector dirección asociado. En caso de estar acelerando o frenando, aumentamos o disminuimos la variable "velocidad" del coche.
2. Sumar el vector dirección*velocidad más el vector inercia*peso_del_coche, el resultado es el nuevo vector inercia, sumado a la posición del coche será su nueva posición.

La forma de calcular los vectores dirección será distinta dependiendo del tipo de vista que escojamos para nuestro juego. Tanto si la vista es cenital, como si el juego es 3D estos vectores tendrán la forma del dibujo 1, y por tanto dependerán del vector director del coche. Es decir, al vector que indique hacia donde mira el coche, le sumaremos 90 grados para el vector izquierda y restaremos 90 para el vector derecha. En el caso de un juego en plan Road Runner es más sencillo, ya que el vector izquierda y derecha siempre serán los mismos, solo variará la velocidad del vehículo, su peso y la resultante en cada caso, pero todo esto nos da igual a la hora de implementar la función.

Con esto y ajustando un poco los parámetros podemos conseguir una conducción arcade entretenida. Para añadir elementos de simulación habría que tener en cuenta otros muchos detalles. Como ejemplo se me ocurre implementar estos cálculos de vectores la parte trasera y delantera del vehículo, así podríamos aplicar el vector dirección*velocidad solo a las ruedas con tracción mientras que el vector inercia afectaría a ambas partes. También podríamos implementar el desgaste de las ruedas de forma que si el desgaste en las rueda izquierda aumenta el coche tenderá a ese lado... Al final todo se reduce en una serie de vectores en el plano XY que modifican la posición del coche.

Por tanto, y a modo de resumen podríamos decir que el modelo más sencillo es el Dibujo2. Luego vendría el Dibujo1 (en plan micromachines) y la dificultad aumentaría al meter más física, más simulación o física 3D o de colisiones, por ejemplo.

En este caso la IA la voy a dejar como pregunta ¿Como implementaríais un coche controlado por computador? ¿lineas de trazada, puntos de control?

En cuanto a la parte gráfica necesitaremos un poco más de trabajo que en en el último modelo de juego. Deberemos dibujar o renderizar un sprite para cada una de las posiciones posibles del coche (en el dibujo1 serían mínimo 8, una cada 45 grados, en el Dibujo2 podría bastarnos con 3 o 5...) Además de distintos coches, o al menos distintos colores (debemos poder diferenciar los distintos vehículos) Y un escenario. Además, los efectos de sonido son una gran ayuda en este tipo de juegos, motores, frenazos, golpes y demás ayudan a dar vidilla y verosimilitud al juego, así que aquel programador que tenga previsto seguir mi orden e implementar primero el ajedrez, luego el tetris y luego un juego de carreras, que para este último comience a trabajar en equipo y se busque a alguien que le haga unos gráficos graciosos y le busque efectillos de sonido, además así aprenderá a llevar un proyecto con otra persona, algo que puede ser tan enriquecedor como frustrante...

Como siempre me gustaría obtener opiniones y experiencias personales, ¿os gustaría que me explayara más que hablara mas de programación, del gameplay? ¿Porque casi nadie cuenta nada de sus juegos o intentos de juegos? Sería muy enriquecedor para los demás y se supone que esto es un foro de desarrolladores ¡Alguien tiene que haberlo intentado al menos!

(Editado: ya están las imágenes y las negritas, esta vez no me gusta mucho como ha quedado, me rezarciré en el siguiente si puedo, los dichosos algoritmos genéticos me traían de cabeza...)
#13
General / Modelo IV: Juegos de Carreras
24 de Junio de 2007, 10:10:18 PM
Siguiendo con el estilo de hasta ahora voy a hablar de juegos de carreras 2D, por ahora estoy presentando modelos de juego que no requieran de un gran equipo o una gran inversión, para todos aquellos que estamos empezando.

Definición: Juegos de carreras son aquellos en los que varios jugadores compiten con un vehículo por llegar antes a la meta o dar antes un número de vueltas a un circuito. Sobre todo me centraré en el aspecto bidimensional, ya que el objetivo de estos articulillos es repasar mecánicas.

Jugabilidad: En este tipo de juego el gran aliciente es la competición, sobre todo con otros jugadores humanos. En los casos en los que el juego cuente con un gran nivel de simulación (marchas, física realista, daños en el vehículo, importancia de la meteorologías, elección de neumáticos, tipo de tracción, etc...) El reto de conducir al máximo y no morir en el intento puede resultar muy interesante, así como en los juegos más arcade pueden incluir elementos de ataque-defensa como armas, aceite o clavos (o plátanos ;)) para la carretera, o simplemente una física y mecánicas de juego que nos permitan darle un empellón al coche de al lado sin morir nosotros también. Dependiendo del tipo de juego que queramos construir potenciaremos una cosa u otra (no podemos poner metralletas en el moto GP porque el jugador ya está bastante entretenido con aprenderse el circuito, seguir la trazada y demás como para andar dando tiros, además de que no es lo que busca...) De la misma forma no podríamos complicar el Mario Kart con boxes, elección de neumáticos, daños realistas o cosas así, porque perdería toda la diversión.

Dificultades técnicas: Como se ha podido ver el apartado anterior, este tipo de juegos varía mucho dependiendo de si preferimos un arcade o un simulador. El primer caso se parece mucho a implementar un asteroids con una nave para cada jugador y poco más. Es el caso más simple, Para este caso solo tendremos que implementar una física mínima en cuanto a fuerza de empuje y velocidad resultante:

Dibujo1 Dibujo2
Dibujo1 muestra un ejemplo de juego de carreras cenita, Dibujo2 de uno con vista trasera 2D

Cada coche (o lo que sea) tendrá una velocidad y una fuerza de empuje actual (la flecha negra) así como una fuerza de empuje de dirección para el siguiente paso (la flecha azul, que en este caso indica que el jugador ha pulsado "girar a la izquierda") La fuerza resultante para el siguiente paso será la suma de ambas, con lo que conseguimos que haya "inercia" y el coche no responda únicamente a las teclas de dirección. Además tendremos una tecla "acelerar" y otra "frenar" la tecla acelerar aumenta el tamaño de la flecha resultante, mientras que la de frenar la disminuye. Por tanto, en cada frame tendríamos:

1. Comprobar si está pulsada alguna tecla, en cuyo caso creamos el vector dirección asociado. En caso de estar acelerando o frenando, aumentamos o disminuimos la variable "velocidad" del coche.
2. Sumar el vector dirección*velocidad más el vector inercia*peso_del_coche, el resultado es el nuevo vector inercia, sumado a la posición del coche será su nueva posición.

La forma de calcular los vectores dirección será distinta dependiendo del tipo de vista que escojamos para nuestro juego. Tanto si la vista es cenital, como si el juego es 3D estos vectores tendrán la forma del dibujo 1, y por tanto dependerán del vector director del coche. Es decir, al vector que indique hacia donde mira el coche, le sumaremos 90 grados para el vector izquierda y restaremos 90 para el vector derecha. En el caso de un juego en plan Road Runner es más sencillo, ya que el vector izquierda y derecha siempre serán los mismos, solo variará la velocidad del vehículo, su peso y la resultante en cada caso, pero todo esto nos da igual a la hora de implementar la función.

Con esto y ajustando un poco los parámetros podemos conseguir una conducción arcade entretenida. Para añadir elementos de simulación habría que tener en cuenta otros muchos detalles. Como ejemplo se me ocurre implementar estos cálculos de vectores la parte trasera y delantera del vehículo, así podríamos aplicar el vector dirección*velocidad solo a las ruedas con tracción mientras que el vector inercia afectaría a ambas partes. También podríamos implementar el desgaste de las ruedas de forma que si el desgaste en las rueda izquierda aumenta el coche tenderá a ese lado... Al final todo se reduce en una serie de vectores en el plano XY que modifican la posición del coche.

Por tanto, y a modo de resumen podríamos decir que el modelo más sencillo es el Dibujo2. Luego vendría el Dibujo1 (en plan micromachines) y la dificultad aumentaría al meter más física, más simulación o física 3D o de colisiones, por ejemplo.

En este caso la IA la voy a dejar como pregunta ¿Como implementaríais un coche controlado por computador? ¿lineas de trazada, puntos de control?

En cuanto a la parte gráfica necesitaremos un poco más de trabajo que en en el último modelo de juego. Deberemos dibujar o renderizar un sprite para cada una de las posiciones posibles del coche (en el dibujo1 serían mínimo 8, una cada 45 grados, en el Dibujo2 podría bastarnos con 3 o 5...) Además de distintos coches, o al menos distintos colores (debemos poder diferenciar los distintos vehículos) Y un escenario. Además, los efectos de sonido son una gran ayuda en este tipo de juegos, motores, frenazos, golpes y demás ayudan a dar vidilla y verosimilitud al juego, así que aquel programador que tenga previsto seguir mi orden e implementar primero el ajedrez, luego el tetris y luego un juego de carreras, que para este último comience a trabajar en equipo y se busque a alguien que le haga unos gráficos graciosos y le busque efectillos de sonido, además así aprenderá a llevar un proyecto con otra persona, algo que puede ser tan enriquecedor como frustrante...

Como siempre me gustaría obtener opiniones y experiencias personales, ¿os gustaría que me explayara más que hablara mas de programación, del gameplay? ¿Porque casi nadie cuenta nada de sus juegos o intentos de juegos? Sería muy enriquecedor para los demás y se supone que esto es un foro de desarrolladores ¡Alguien tiene que haberlo intentado al menos!

PD: El el blog tenéis las imágenes y demás, mañana las enlazo y formateo un poco... ;)
#14
General / Modelo IV: Juegos de Carreras
24 de Junio de 2007, 10:08:54 PM
Siguiendo con el estilo de hasta ahora voy a hablar de juegos de carreras 2D, por ahora estoy presentando modelos de juego que no requieran de un gran equipo o una gran inversión, para todos aquellos que estamos empezando.

Definición: Juegos de carreras son aquellos en los que varios jugadores compiten con un vehículo por llegar antes a la meta o dar antes un número de vueltas a un circuito. Sobre todo me centraré en el aspecto bidimensional, ya que el objetivo de estos articulillos es repasar mecánicas.

Jugabilidad: En este tipo de juego el gran aliciente es la competición, sobre todo con otros jugadores humanos. En los casos en los que el juego cuente con un gran nivel de simulación (marchas, física realista, daños en el vehículo, importancia de la meteorologías, elección de neumáticos, tipo de tracción, etc...) El reto de conducir al máximo y no morir en el intento puede resultar muy interesante, así como en los juegos más arcade pueden incluir elementos de ataque-defensa como armas, aceite o clavos (o plátanos ;)) para la carretera, o simplemente una física y mecánicas de juego que nos permitan darle un empellón al coche de al lado sin morir nosotros también. Dependiendo del tipo de juego que queramos construir potenciaremos una cosa u otra (no podemos poner metralletas en el moto GP porque el jugador ya está bastante entretenido con aprenderse el circuito, seguir la trazada y demás como para andar dando tiros, además de que no es lo que busca...) De la misma forma no podríamos complicar el Mario Kart con boxes, elección de neumáticos, daños realistas o cosas así, porque perdería toda la diversión.

Dificultades técnicas: Como se ha podido ver el apartado anterior, este tipo de juegos varía mucho dependiendo de si preferimos un arcade o un simulador. El primer caso se parece mucho a implementar un asteroids con una nave para cada jugador y poco más. Es el caso más simple, Para este caso solo tendremos que implementar una física mínima en cuanto a fuerza de empuje y velocidad resultante:

Dibujo1 Dibujo2
Dibujo1 muestra un ejemplo de juego de carreras cenita, Dibujo2 de uno con vista trasera 2D

Cada coche (o lo que sea) tendrá una velocidad y una fuerza de empuje actual (la flecha negra) así como una fuerza de empuje de dirección para el siguiente paso (la flecha azul, que en este caso indica que el jugador ha pulsado "girar a la izquierda") La fuerza resultante para el siguiente paso será la suma de ambas, con lo que conseguimos que haya "inercia" y el coche no responda únicamente a las teclas de dirección. Además tendremos una tecla "acelerar" y otra "frenar" la tecla acelerar aumenta el tamaño de la flecha resultante, mientras que la de frenar la disminuye. Por tanto, en cada frame tendríamos:

1. Comprobar si está pulsada alguna tecla, en cuyo caso creamos el vector dirección asociado. En caso de estar acelerando o frenando, aumentamos o disminuimos la variable "velocidad" del coche.
2. Sumar el vector dirección*velocidad más el vector inercia*peso_del_coche, el resultado es el nuevo vector inercia, sumado a la posición del coche será su nueva posición.

La forma de calcular los vectores dirección será distinta dependiendo del tipo de vista que escojamos para nuestro juego. Tanto si la vista es cenital, como si el juego es 3D estos vectores tendrán la forma del dibujo 1, y por tanto dependerán del vector director del coche. Es decir, al vector que indique hacia donde mira el coche, le sumaremos 90 grados para el vector izquierda y restaremos 90 para el vector derecha. En el caso de un juego en plan Road Runner es más sencillo, ya que el vector izquierda y derecha siempre serán los mismos, solo variará la velocidad del vehículo, su peso y la resultante en cada caso, pero todo esto nos da igual a la hora de implementar la función.

Con esto y ajustando un poco los parámetros podemos conseguir una conducción arcade entretenida. Para añadir elementos de simulación habría que tener en cuenta otros muchos detalles. Como ejemplo se me ocurre implementar estos cálculos de vectores la parte trasera y delantera del vehículo, así podríamos aplicar el vector dirección*velocidad solo a las ruedas con tracción mientras que el vector inercia afectaría a ambas partes. También podríamos implementar el desgaste de las ruedas de forma que si el desgaste en las rueda izquierda aumenta el coche tenderá a ese lado... Al final todo se reduce en una serie de vectores en el plano XY que modifican la posición del coche.

Por tanto, y a modo de resumen podríamos decir que el modelo más sencillo es el Dibujo2. Luego vendría el Dibujo1 (en plan micromachines) y la dificultad aumentaría al meter más física, más simulación o física 3D o de colisiones, por ejemplo.

En este caso la IA la voy a dejar como pregunta ¿Como implementaríais un coche controlado por computador? ¿lineas de trazada, puntos de control?

En cuanto a la parte gráfica necesitaremos un poco más de trabajo que en en el último modelo de juego. Deberemos dibujar o renderizar un sprite para cada una de las posiciones posibles del coche (en el dibujo1 serían mínimo 8, una cada 45 grados, en el Dibujo2 podría bastarnos con 3 o 5...) Además de distintos coches, o al menos distintos colores (debemos poder diferenciar los distintos vehículos) Y un escenario. Además, los efectos de sonido son una gran ayuda en este tipo de juegos, motores, frenazos, golpes y demás ayudan a dar vidilla y verosimilitud al juego, así que aquel programador que tenga previsto seguir mi orden e implementar primero el ajedrez, luego el tetris y luego un juego de carreras, que para este último comience a trabajar en equipo y se busque a alguien que le haga unos gráficos graciosos y le busque efectillos de sonido, además así aprenderá a llevar un proyecto con otra persona, algo que puede ser tan enriquecedor como frustrante...

Como siempre me gustaría obtener opiniones y experiencias personales, ¿os gustaría que me explayara más que hablara mas de programación, del gameplay? ¿Porque casi nadie cuenta nada de sus juegos o intentos de juegos? Sería muy enriquecedor para los demás y se supone que esto es un foro de desarrolladores ¡Alguien tiene que haberlo intentado al menos!

PD: El el blog tenéis las imágenes y demás, mañana las enlazo y formateo un poco... ;)
#15
General / Modelo III: Puzzles de bloques
17 de Junio de 2007, 11:44:47 PM
Hoy traigo otro modelo de juego adecuado para programadores ya que sus exigencias artísticas son menores. Además, para ir variando y por probar algo diferente a ver si así atraigo un poco más de colaboración, al final vendrán algunas preguntillas en plan deberes ;) (Si no sabes de que va esto ve AQUÍ)

(Como siempre y porqué así se decidió por votación ;) también lo tenéis en el blog, siempre me parece más bonito allí :P)

Definición: Para centrarme en un tipo de juego, dentro de la enorme variedad de juegos de puzzle existente, hablaré de aquellos en plan bloques, como el tetris, el columns y demás variantes.

Jugabilidad: Nos encontramos ante otro modelo de juego de vida prácticamente infinita. Creo que si contáramos el número de horas jugadas en total y la variedad de público a la que ha llegado, dividido por los recursos y el tiempo de desarrollo, sin duda el tetris se llevaría la palma.

Estos juegos tienen dos trucos:
* Nunca paran, con lo que si no quieres perder tu puntuación tienes que continuar la partida hasta el final.
* Cada vez son más difíciles/rápidos, lo que hace que el reto siga en pie y cada vez tengas menos tiempo para pensar en que deberías estar haciendo otra cosa más provechosa :P

La dificultad en el tetris constaba simplemente en la velocidad del juego. Si el juego tiene una mecánica de colores o formas, como el columns, podemos aumentar la dificultad aumentando el número de colores o figuras disponibles, con lo que será más difícil ir juntando muchas del mismo tipo.



Dificultades técnicas: Como dije al principio este es un tipo de juego que no requerirá de un gran talento artístico. Una imagen para cada tipo de pieza o incluso simplemente cuadrados de colores y un panel informativo con los datos que todos esperamos de un tetris (puntuación, nivel, pieza siguiente) Son toda la labor gráfica.

En cuanto a programación se me ocurre que este tipo de juegos se pueden controlar con una matriz que represente el estado de cada casilla y operaciones sobre ella. Por ejemplo, para el tetris podríamos tener una matriz de 1s y 0s (1 - casilla ocupada, 0 - desocupada) y que la pieza que entra se escriba por ejemplo con 2s, cada X ms comprobamos (dependiendo del nivel) si debajo de todos los dos hay un cero u otro dos, en cuyo caso bajamos la pieza una fila, en caso contrario no bajamos la fila y cambiamos los 2s por 1s y intentamos poner la siguiente pieza. Antes de sacar la pieza siguiente, comprobamos la matriz de estado por filas, si alguna fila está completa la ponemos a 0 y copiamos la fila superior, operación que repetiremos hasta que la fila superior no tenga ningún 1 o sea la última. Mientras, el movimiento de la pieza se haría de forma asíncrona mediante listeners o señales de teclado. Para comprobar si el jugador ha perdido comprobamos si alguna de las piezas de 2 quedó en la última fila.

Este es un ejemplo, debe haber otros muchos, muchos mejores y alguno peor. Aquí viene la primera pregunta de la entrega: ¿Se os ocurre otra implementación? ¿Habéis hecho un tetris por vosotros mismos y lo hicisteis de otra forma? Contadlo en los comentarios, tanto yo como los que lean este artículo lo agradecerán ;)

En cuanto a los juegos tipo columns, podríamos utilizar el mismo sistema con un número para cada tipo o color de pieza. A la hora de comprobar tendríamos que comprobar más combinaciones, ya que habría que comprobar por cada una de las tres piezas, si enlazan en horizontal, vertical o diagonal con suficientes piezas de su mismo tipo y así recursivamente para eliminar todo el posible encadenamiento...

Extras y conclusión: Hay un juego de este tipo que no puedo dejar de mencionar. Siempre he pensado que el tetris era toda una proeza ya que con la mecánica más simple consigue llegar a todo el mundo y enganchar muchísimo, y que no había juego en su campo que le hiciera sombra. Hasta que llegó el Zuma. A los que no lo conozcáis: ¡Cuidado! ¡Puede ser terriblemente adictivo! El Zuma me parece uno de los pocos juegos de esta categoría que ha sido capaz de innovar y de hacerle sombra al todopoderoso Tetris. Y ahora vienen otras preguntillas. Para los jugones, para tratar de hacerlos pensar un poco y para los developers que nos cuenten posibles implementaciones y nos instruyan con su saber ;)

¿Qué otros juegos de este estilo has jugado que te parezcan innovadores, originales o terriblemente adictivos? Yo he puesto de ejemplo el Zuma, pero puede que haya muchos más por ahí escondidos... ¿Sois capaces de pensar en otra mecánica de eliminar cuadritos-bolitas e ir sumando? ¿Hasta donde está el tetris enraizado en nuestro subsconciente? (;P) Y por último y en relación a la implementación: yo he puesto un ejemplo para los juegos de tipo matriz de bloques, pero ¿Cómo implementaríais un Zuma? ¿Cómo hacer que las bolas sigan la linea y se separen o se junten a distintas velocidades? Es como un poquito de física... ¿Se os ocurre una solución limpia y fácil? No me parece un problema trivial.

Como siempre os dejo un par de links:

Tetris en la wiki, historia y detalles de diseño y modo de juego.
Zuma - Si te gustan este tipo de juegos tienes que jugarlo.
#16
General Programadores / duda ambitos java
14 de Junio de 2007, 01:05:19 PM
Hola, echándole una mano a un amigo para las oposiciones hemos encontrado un código que no nos cuadra nada:

tenemos la clase A:

public class A {

char c = 'A';

static void f(){
System.out.println("A");
}

void g(){
this.f();
}

}


La clase B:


public class B extends A{

char c = 'B';

static void f(){
System.out.println("B");
}

void h(){
System.out.println("PEPE");
}
}


Y la clase C con el main:

public class C {

public static void main(String[] args){
A a = new A();
B b = new B();
A c = b;

System.out.println(a.c);
System.out.println(b.c);
System.out.println(c.c);
}

}


Y resulta que la salida es:

A
B
A

Yo esperaba que la última A fuera una B ya que a c le estamos asignando un objeto ya creado de tipo B y b.c devuelve efectivamente una B. ¿Aluién sabe porqué, cuando se supone que b y c son el mismo objeto nos devuelven resultados distintos? ¿Porqué o cómo toma el char de la clase A y no se sobre-escribe con el char de la clase B si tienen el mismo nombre?

He estado probando y pese a que inicialice los dos char en el constructor me sigue dando el mismo resultado:
   char c = 'B';

public B() {
//super();
this.c = 'B';
}


solo obtengo el resultado que yo esperaba (A,B,B) cuando elimino el 'char c' de la clase B y hago el this.c en el constructor de B.

¿Alguien sabe explicarme esto? Gracias por adelantado :)
#17
Proyectos / Avatares con información: Avatar Encoder
11 de Junio de 2007, 11:38:44 PM
Hola, este finde comencé y terminé mi última creación Java y me gustaría que me dijerais que os parece.

Es un programa para crear gifs de 80x80 (pensado mayormente para avatares, pero claro, podéis crear las imágenes para lo que queráis) el cual nos permite introducir información textual dentro de la imagen. Más tarde, con el mismo programa, cualquiera podrá leer esa información al cargar vuestra imagen. Esto permite tener avatares con información personal además del dibujo de turno.

También puede usarse para intercambiar información de forma semi-codificada en forma de una pequeña imagen, hacer un juego de juntar la información repartida en varias imágenes... Yo lo he hecho por ocio y porque últimamente me llama la atención el tema de la codificación, y jugar con crear contenido.

Podéis descargarlo aquí: Descargar Avatar Encoder

Aquí tenéis algunos ejemplos:

   

Para más información también podéis visitar mi blog donde he puesto un post al respecto (en inglés porque lo he linkado también en el foro de Java...)

¿Qué opináis, os gusta, creéis que puede ser útil, se os ocurren otros usos? ;)
#18
General / Modelo de juego II: Juegos de tablero
10 de Junio de 2007, 05:05:13 PM
(En el blog tenéis la versión algo más formateada, que dar formato dos veces es un royo :P)

Definición: Entenderemos como juegos de tablero todos lo juegos que normalmente podemos encontrar en una juguetería bajo el cartel de "juegos de mesa" o "juegos en familia". Son juegos de varios jugadores, por turnos, basados en mayor o menor medida en la inteligencia o habilidad de los jugadores y en el azar. Dado que la mecánica es prácticamente la misma, podemos incluir aquí los juegos de estrategia por turnos, como Worms, Incubation o Panzer General.

Jugabilidad:


Los juegos de tablero basan su éxito en la competición y en la interacción humana. Por tanto el jugador siempre disfrutará mucho más si puede estar en contacto directo o en comunicación con los demás jugadores. En algunos casos podemos disfrutar del reto intelectual jugando contra el ordenador, esto ocurre mucho más con algunos juegos de estrategia por turnos (ajedrez, Civilization, go, risk).

A la hora de implementarlos, los objetivos y la forma de conseguirlos suelen ser muy claros (conseguir todos los trozos del pastel de colores, matar al rey, comerse todas las damas del contrario...) Los gráficos no tienen que ser nada del otro mundo, el sonido no es más que un extra en muchos casos, así que si no eres un artista pero si un programador con ganas de currar, elige uno y manos a la obra.

Lo bueno de este tipo de juegos es que su tiempo de vida es potencialmente infinito, ya que, con muy pocos recursos, cada partida será distinta (sobre todo en multijugador) y el jugador/es puede estar toda la vida jugándolo sin aburrirse.

Dificultades técnicas:

A la hora de implementar un juego de estrategia por turnos nos enfrentaremos a dos problemas principales:
- Implementar el modo multijugador.
- Para el modo de un jugador necesitamos programar una IA, dependiendo del juego esta puede ser un duro trabajo.

Veamos estos dos puntos algo más en profundidad:

- Modo multijugador: Al ser un modo de juego por turnos podemos jugar o bien todos en el mismo ordenador (nos ahorramos el cliente servidor, pero limitamos el juego) o bien en distintos ordenadores. Para este último caso no necesitamos tiempo real, sincronía, ni nada de eso. El juego funcionará con intercambio de mensajes de forma asíncrona y un pequeño control por si se pierde o se retrasan mensajes. Para esto lo más cómodo es implementar una interface cliente-servidor con sockets:

- El servidor crea la partida y espera los clientes.
- Cada cliente se conecta al servidor mediante su IP y el socket elegido.
- En cada turno el servidor cede el control a un cliente y manda la orden de bloquear la interface a todos los demás. El jugador que tiene el turno hará el(/los) movimientos que crea necesario y cuando su turno termine se enviará un paquete al servidor con los cambios producidos.
- El servidor enviará los cambios a los demás jugadores y cederá el turno al siguiente.

Este sería el esquema básico, por supuesto los paquetes deben tener una estructura interna, se pueden implementar funciones para controlar la correctitud de los movimientos en el servidor además de en los clientes, así como que todos los jugadores tienen el mismo estado de juego en pantalla...

Si pensamos en el ajedrez todo se verá muy sencillo: Juegan blancas, mueve una ficha, mandamos la información al server que a su vez la manda al otro jugador y cambia el turno. Con más jugadores y sistemas más complicados tendremos que manejar más información, pero el esquema básico no varía.

- Implementación de una IA:

Este es un tema bastante más extenso y complejo, así que lo acotaré un poco para hoy, voy a repasar un poco los elementos a tener en cuenta y las herramientas de IA que podrían servirnos y luego voy a hablar un poco de como programar la IA en un grupo concreto de estos juegos.

Dependiendo del tipo de juego la IA y las posibles técnicas a aplica varían en gran medida, podemos tener que controlar muchos aspectos o mecánicas del juego: planificación a largo plazo, tácticas de juego, jugadas comunes, reconocimiento de patrones, gestión de recursos, diplomacia, etc. Las técnicas para atacar estos problemas también pueden ser variadas:

   * Estrategia o conjunto de movimientos preestablecidos a corto plazo (como salidas importantes en ajedrez, o como organizar los 3 primeros minutos de Starcraft, que todos sabemos que siempre es igual :P)
   * Diagrama de estados para definir la actitud de la IA (agresiva, defensiva, diplomática, dependiendo de la situación en la que se encuentre con respecto a los demás, en Civilization eran tan nobles....)
   * Sistema de conocimiento o sistema experto: este diseño se basa en crear una gran base de datos de acción-respuesta, es decir, conocimientos sobre el juego en concreto y cómo responder a cada situación. Básicamente tratamos de meter toda la información y las reglas que un jugador experto consideraría en cada momento. No sé de ningún ejemplo de esto, pero seguro que esto se ha aplicado en mayor o menor medida en más de un juego.
   * Árbol de decisiones y funciones heurísticas de valoración de las ramas. De este es del que hablaré ahora después.
   * Utilización de Redes Neuronales o Algoritmia evolutiva. Este es el campo más experimental de la IA, debemos tener claro que de verdad puede ser útil y que el entrenamiento debe realizarse a priori, para añadir a la IA del juego una red o un individuo ya evolucionado. Estas técnicas se utilizan sobre todo en optimización y clustering.

Normalmente no utilizaremos una sola de éstas técnicas, sino varias, para cada una en distintos aspectos o distintas fases de juego, o incluso técnicas mixtas (un arbol de decisión que utiliza una base de conocimiento para ajustar la heurística es lo que usan programas como DeepBlue).

Vamos a centrarnos en el caso de los juegos más sencillos, y además la técnica más útil, o que más aplicaciones tiene: Los árboles de decisión son árboles N-arios en los que cada rama será un posible movimiento (movimientos posibles son aquellos que cumplen todas las reglas, esto debe ser controlado mediante código, claro está) en la siguiente jugada. Se utilizan sobre todo en los juegos bipersonales de suma cero (lo que yo pierdo lo gana el otro). Y en cada nivel del árbol mueve un jugador. Por ejemplo: el juego de las tres en raya.

- De la raíz del árbol partirán 3 ramas: mover a la esquina, mover al centro, mover a un lateral.
- Ahora cada nodo de los obtenidos será la raíz para los posibles movimientos del otro jugador. Así hasta completar todas las posibilidades o alcanzar un nivel máximo o límite de exploración, escogido de forma arbitraria.
- Si hemos alcanzado el final del juego en las hojas del árbol tendremos el resultado y por tanto podremos valorar con 1 las ramas en las que ganamos, con 0 en las que empatamos y con -1 en las que perdemos y elegir en consecuencia. Pero normalmente esto no es posible por limitaciones de espacio y tiempo, con lo que tendremos que inventarnos una función heurística (heurística quiere decir arbitraria y basada en conocimientos humanos) que nos diga cómo de buena es cada hoja. Cada nodo raíz será tan bueno como el peor de sus hojas si es un nodo en el que movemos nosotros (porque suponemos que el contrario moverá bien) y la mejor si mueve el contrario (el también tratará de conseguir lo mejor) Y así ya tenemos una valoración de todo el árbol, con lo que podremos escoger la rama más favorable.

((!) Si en cada movimiento puede intervenir el azar, deberemos ponderar cada rama con la probabilidad de que sea escogida)

Esto, que así explicado no sé si habrá quedado muy claro, es el algoritmo MiniMax. (Luego vendrán los links ;)) Este árbol puede generarse en amplitud, como yo lo he explicado, o en profundidad, en cuyo caso expandimos las ramas de una en una hasta el final, para luego seguir con la siguiente. Esta forma de expandir el árbol consigue que cuando vamos a por la segunda rama ya tenemos los valores de la primera calculados, si los valores de la segunda parece que serán peores (necesitamos otra heurística: la función de estimación, que nos estima el máximo y el mínimo que podremos conseguir con ese movimiento, sin saber los siguientes) podemos no expandir esa rama y pasar a la siguiente. Este procedimiento se conoce como ramificación y poda, o poda alfa-beta. Con unas adecuadas funciones heurísticas, y unos cuantos niveles de anticipación (niveles hasta llegar al limite de exploración) este algoritmo puede obtener muy buenos resultados para la mayoría de juegos de dos jugadores, sin azar y suma cero (excluyendo el go), lo que es más de lo que parece ;P

La técnica de ramificación y poda también puede utilizarse en otros muchos casos, sobre todo de optimización y exploración de soluciones, y es una técnica ampliamente extendida en diseño de algoritmos.

No me extiendo más, para ruegos y preguntas podéis comentar, tanto en el foro de Stratos como en el blog. Espero vuestros comentarios y opinión, así como matizaciones, correcciones o ampliaciones. Y ahora algunos enlaces con más información para el que quiera ampliar:

En la wikipedia: (enlazo los artículos ingleses porque son más completos y traen los algoritmos, quien quiera puede cambiar a español sin esfuerzo)
Algoritmo Minimax.
Ramificación y poda (Branch and bound)
Implementación de juegos de ajedrez.

Comunidad de IA en videojuegos, en classic games tenéis una gran cantidad de juegos de tablero.
IAchess4k, un ejemplo de juego de ajedrez en 4k, con tres niveles de IA, se puede ver como el programador ha usado un algoritmo minimax con mayor nivel límite para cada nivel de de dificultad (en el nivel 3 os esperan tiempos de decisión bastante largos).
#19
General / Modelos de juegos I: Plataformas 2D
03 de Junio de 2007, 11:33:36 PM
(En Destripando juegos tenéis la explicación sobre de qué va esto y la declaración de intenciones.)

En este primer artículo de "Modelos de juegos" voy a traer un tipo de juego que nunca me ha terminado de gustar pero que siempre he querido hacer, por paradójico que parezca. Estoy hablando de los juegos de plataformas en 2D con Scroll horizontal, ahí es nada. Acoto tanto porque hay que concretar un poco para analizar, otro día trataremos los plataformas 3D, los de pantalla fija, los 2D y media, etc. Empiezo con este porque es uno de los géneros más ampliamente conocido y más extendido en los tiempos en los que aun costaba menos producir un videojuego que una película Vamos al lio:

Definición: Un plataformas 2D de scroll horizontal es un videojuego en el que el objetivo es llegar al final del nivel superando determinados obstáculos, que incluyen en gran medida saltos ajustados, en un entorno bidimensional.

Esta definición puede parecer pobre, pero es básicamente en lo que se basaba Prince of persia. Ahora veremos qué extras puede tener un plataformas 2D.

Jugabilidad:

Según la definición, nos puede parecer que un plataformas es un juego aburrido, pero el simple hecho de ajustar los saltos ya representa un reto para muchos. Además, este tipo de juegos suele incluir enemigos (normalmente poco inteligentes) y algún sistema de puntuación mediante la recolección de monedas, estrellas, y demás. No contentos con esto, los plataformas tienen una gran tradición en cuanto a pantallas y objetos secretos se refiere.
Personalmente este tipo de juegos no me motivan demasiado, en cuanto me caigo tres veces en el mismo sitio me desespero. Pero si este género cuajó tanto en su época es porque empica. Esto es debido a la gran cantidad de objetivos-recompensa a corto-medio plazo de estos juegos, a saber:

Objetivos a corto plazo: conseguir pasar un determinado salto o conjunto de ellos, matar a los enemigos, conseguir todas las monedas.
Objetivos a medio plazo: pasarse el nivel o llegar al check-point, conseguir todos los secretos del nivel, terminar el nivel en un tiempo record...

Todo esto debe verse recompensado de alguna forma, y normalmente es con unos gráficos y sonidos agradables y coloristas que nos ofrecen graciosas animaciones al matar a un enemigo o nos dan la enhorabuena por haber logrado todas las monedas. Por otra parte, los juegos de plataforma normalmente no se han caracterizado por tener grandes historias detrás, el argumento y la coherencia suelen brillar por su ausencia, en parte porque son juegos muy arcade, dedicados a entretener, y en parte también por pura tradición, aunque siempre hay excepciones...

Dificultades técnicas:

Programación: en cuanto a la lógica del juego así de primeras parece una tarea fácil. Tenemos un nivel bidimensional que podemos construir a base de tiles o de forma manual y que deberá ir acompañado con un mapa de durezas que nos diga que partes del escenario son aquellas sobre las que el personaje se apoya o no puede traspasar y cuales son sólo parte del decorado. La lógica de los enemigos suele ser una lista de movimientos y en caso de que el enemigo dispare un control para apuntar al PJ.
Por ejemplo si cogemos el cangrejo de Sonic, simplemente se mueve X pixeles a la izquierda, luego X pixeles a la derecha y cuando sonic se acerca dispara dos bolitas no dirigidas por las pinzas. Solo con eso este PNJ ya era un coñazo :P


En la figura podemos ver un ejemplo de mapa de durezas para el Sonic, solo tendríamos que comprobar que el punto donde se apoya Sonic ( x = ancho/2; y = 0; ) es negro, si es blanco Sonic cae ( y–; ) Los puntos 1 y dos no aparecen representados en la pantalla visible, pero al estar en el mapa de durezas podemos interactuar con ellos, el punto 1 podría darnos 1 vida al saltar sobre él y el punto dos podría ser una plataforma invisible que permitiera alcanzar más anillos.


En esta otra imagen vemos un enemigo, la lógica del enemigo consistiría en cargar su imagen y hacerla moverse del punto 1 al 2 y vuelta indefinidamente, si el jugador choca con él (siiii, un poquito de detección de colisiones :))pierde los anillos o muere...

La programación es fácil, pero...

Diseño gráfico: El principal reto de un plataformas es hacerlo atractivo de jugar, esto se consigue con dos puntos fundamentales:
- Un movimiento suave de los personajes, que permita calcular los saltos y movimientos.
- Unos niveles atractivos, con enemigos a los que deseemos matar (como los Goombas :)) y constantes retos.
Es decir, un plataformas requiere, para obtener un buen resultado, de una gran labor artística. Tenemos que diseñar niveles y enemigos con variedad y abundancia suficiente para hacer el juego una sorpresa constante, o al menos, suficiente reto constante.

Conclusión y extras:

Para resumir, como inconvenientes principales: un platamorfas requiere bastante tiempo de diseño de niveles, enemigos, gráficos... Cada fase se recorre con rapidez y debe haber variedad para no aburrir al jugador (cada poco un enemigo nuevo, un arma, un boss...) no necesitamos ser grandes escritores ni requerirá una gran IA ni una gran física, aunque esta última podría ser muy útil para algunos puzzles. Os dejo con algunos links, más info en la wiki y un par de ejemplos de los que tomar nota, aunque seguro que todos conocéis muchos más ;)

Definición e historia de los plataformas en la wikipedia
Super Mario - Clásico entre los clásicos
Sonic the Hedgehog - la velocidad y los gráficos de Sonic marcaron un hito.
Kirby!Kirby!Kirby! - El mejor ejemplo de un juego de aspecto simple pero colorido y encantador

(Editado: Ya tenéis los links. Por favor comentad, añadid experiencias, decidme si os gustó, si era muy largo, muy corto, si os pareció útil, qué cambiaríais...)
#20
General / Propuesta: La mecánica de la semana (debate)
01 de Junio de 2007, 12:38:51 PM
Hola, tras ver el blog three hundred mechanics, una idea y una necesidad que llevaban tiempo dando vueltas en mi cabeza han cuajado. Me gustaría arrancar una iniciativa sobre mecánicas aquí o en el Planet. Explico como iría:

La cosa sería, si os parece interesante, yo me comprometo a poner todas las semanas una mecánica de juego, y comentar mi opinión, pros y contras, formas en las que el jugador se engancha, ejemplos en clasicos o en juegos conocidos y demás (por ejemplo podríamos decir "shooter cenital" y hablar de todo eso). Luego vendría vuestra parte, todo el que quiera pondría correcciones, opiniones, matices, etc.

Creo que podría ser interesante a la hora de ver qué mecánicas preferimos, que ventajas tienen, cómo desarrollarlas, que dificultades... A mi me resultaría muy enriquecedor tener opiniones y saber dónde se genera más o menos debate, qué  juegos tienen más adeptos, etc. ¿Qué opinais? ¿os sumaríais al debate? ¿Estoy diciendo tonterías porque todos teneis muy claro de que va cada cosa? ¿Existe una pagina maravillosa que dezconozco y que ya tiene las respuestas a todas mis preguntas?

¡Saludos y gracias de antemano por vuestras respuestas!

PD: La idea inicial ha sido ponerla en el blog en la sección que tengo que aparece en el planet, pero en el blog no suele participar mucha gente, así que he pensado que alomejor aquí si tenía más participación, pero respondedme vosotros donde la preferiríais.  :wink:





Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.