top of page
ghilnopfolingka

Colision sobre Plataformas 2D – XNA: Aprende a Detectar y Resolver Colisiones en tus Juegos



Hoy a mostrar una forma de cómo hacer un juego donde el héroe pueda saltar sobre varias plataformas, además de incluir gravedad para que cuando no se encuentre sobre una plataforma se caiga hasta que encuentre una plataforma.


Para manejar el flujo de cómo se comportan los Sprites, voy a crear una clase llamada Mundo, que será la encargada de tener una lista de todos los sprites y de actualizarlos adecuadamente, manejando las colisiones.




Colision sobre Plataformas 2D – XNA



En el método Update, recorremos cada Sprite de la lista, y le aplicamos la gravedad con el peso de cada Sprite, luego movemos el Sprite y verificamos que no hayan colisiones con otros Sprites, si hay colisión (si el método de CalcularDistanciaMinimaDeTraslacion retornó un valor diferente a Cero) se llama la función Colision del Sprite.


Ahora podemos volver a ver la clase Jugador y ver el método sobrecargado Colision, en este método cuando hay colisión, se verifica que la colisión sea con un muro (aunque es el único sprite diferente al Jugador, pero para futuros proyectos) y el Sprite del jugador se mueve al valor que retornó el método CalcularDistanciaMinimaDeTraslacion, pero cuando el valor de Y es negativo no vamos a mover el jugador, sino que dejamos que el movimiento hacia abajo lo haga es la gravedad, si comentamos esa parte del código, cuando el jugador este casi cayendo de una plataforma se caerá rápidamente.


Declaramos una variable para el Mundo y otra para el Jugador, en el constructor inicializamos la clase mundo y adicionamos a la lista de Sprites varios muros, los primeros muros son los límites de la pantalla, para evitar que el jugador se salga de la pantalla, los otros son algunas plataformas que dibujo en la pantalla, los muros los inicializo con el tamaño y la posición, la textura que tienen es un png de 512 x 512 de color blanco, cuando se hace el Draw del Sprite, con el tamaño recorto la textura origina y con el Color asignado en el constructor lo pinto.


Lo que sigue es que modifiquen el código, adicionando más sprites como bonus o enemigos, y jugando con las colisiones, además de adicionar estados y condiciones para que el jugador solo pueda saltar una vez, o continuar con el jetpack y hacer juegos de Jetpacks.


Saludos martin, podrias realizar un simple ejemplo con una plataforma. me explico mejor supongamos que el personaje esta debajo de la plataforma y desea saltar hasta ella pero no colisiona con ella si no cuando esta por encima o que venga cayendo. gracias


Podrías haber visto el tutorial de Stephane Beniak sobre el Juego de la Vida clásico aquí en Gamedevtuts+. Este tutorial, por Mikola Lysenko, discute una nueva variante interesante: una generalización del Juego de la Vida para espacios suaves, aplicada a superficies curvas arbitrarias.


Éste es un tutorial corto y simple, intencionado para mostrar el poder de las librerías de Flash de Estornino y Nuca, pero realmente me gusta el resultado! La real lógica tras la creación del terreno es lo suficientemente fácil para entender que podrías importarla a muchas otras plataformas de gamedev.


Este tutorial, por Rahul Srivastava de los juegos de Rotating Canvas, podría quizás ir muy bien con el tutorial de Michael Hoffman sobre los Efectos Dinámicos 2D de Agua el cual publicamos anteriormente este año. Rahul explica cómo usar los sombreadores OpenGL, una función senoidal, y un ruido aleatorio para crear un efecto impecable de la superficie del agua.


Está bien, este realmente es más un tutorial CS que un tutorial específico sobre el código en gamedev, pero no pude resistir incluirlo aquí porque amo la presentación. Las animaciones aleatorias ayudan a ilustrar lo que claramente ya es un tutorial claro.


En esta pieza de dos partes (la parte dos está aquí), los desarrolladores de N explicaron lo básico de sus sistemas de detección de colisión. Si quieres llevar esto más lejos, Shiu escribió un tutorial para nosotros sobre los mismos conceptos.


Este efecto de lámpara de lava es muchas veces usado para hacer líquidos, y funciona bastante bien y de manera directa con el código - no se requieren sombreados personalizados! Este tutorial está en XNA, pero es suficientemente fácil para importarlo a otras plataformas.


Rodrigo Monteiro rompe las plataformas 2D en cuatro tipos -baldosa- basada (pura), basada en baldosa (suave), máscara bit y vectorial - y sucintamente explica cuánta movilidad puede ser implementada en cada caso. Esto parece ser tanto una excelente introducción a los conceptos como una gran guía de referencia.


Esto no es tanto un proyecto de fuente abierta como es una pila inusualmente expansiva de código conectado de demostración/ejemplo, aunque se intenciona que encapsule tanto o mucho más sobre el diseño del juego (la experiencia del usuario, entonamiento, relaciones del sistema) y producción del juego (intercambios del desarrollo, autoría eficiente, tubería de contenido) como se trata de la programación por debajo.


Los cuaterniones son una manera conveniente de representar rotaciones en espacios de 3 dimensiones. (...) La principal ventaja que tienen por sobre los ángulos Euler es que pueden ser interpolados sin verse mal. Puedes componer rotaciones al multiplicar los cuaterniones, muy parecido a las rotaciones de matrices, pero un cuaternión de unidad siempre es una rotación, mientras que una matrix de 3x3 podría ser un número de otros tipos de transformaciones (posiblemente no queridas).


Este tutorial de tres partes de Twisted Oak Studios explica las matemáticas de los cuaterniones. Esto no es una publicación de publicación por números; asume que tienes un interés en aprender sobre éste tipo de conceptos, en vez de ponerlos simplemente en uso.


Existe un contenido enriquecedor sobre el sitio de Paul Firth, pero ésta es una publicación a la que sigo volviendo: un par de métodos útiles para trabajar con polígonos convexos (eso es, formas de lados rectos que no se devuelven en sí mismas).


En éste artículo, Charmie de FunstormGames habla sobre la metodología simple de diseño de juegos de Wil Mozell: el "Diagrama Núcleo" mostrado a continuación. Como lo muestra la publicación, esto se aplica sorprendentemente bien muchos diferentes juegos, así que ofrece una manera interesante de pensar sobre el diseño.


Es difícil categorizar esta publicación: contiene consejos sobre codificación, escritura de la historia, interfaz del usuario, y trabajo en equipo, todo centrado alrededor del tema de hacer juegos de plataforma. Si estás planeando en hacer una plataforma, lee esto, cuál sea tu rol!


Hemos hablado sobre las paletas antes en Gamedevtuts+: tanto cómo escogerlas manualmente y cómo dejar que los jugadores las personalicen. Éste artículo explica cómo dejar que una computadora escoja una paleta perfecta para tu juego - increíble para cualquier nivel generado procedentemente!


Me senté con devs. Hablamos. Jugué sus juegos. Me contaron sobre sus relaciones, sus ensayos y sus esperanzas iluminadas. Honestamente, fue conmovedor. Muchos increíbles juegos. Y sin embargo tantos modelos de negocios rotos, técnicas de producción rotas y filosofías rotas de lo que importa. El ochenta por ciento de los juegos siendo mostrados no obtendrán de vuelta sus presupuestos de desarrollo.


En lo que concierne a los videojuegos, hubo varias cuestiones que me produjeron un orgasmo neuronal al descubrirlas y al explorar todas sus posibilidades casi al cien por cien, entre las que puedo destacar dos: la detección de colisiones (algo que me trajo de cabeza durante semanas y de lo que algún día hablaremos) y el bucle de juego o game loop. Todos los videojuegos del mundo mundial (mejor diré casi todos, por no pillarme los dedos) tienen una sección dentro de su código que es un bucle condicional y que se corresponde con la acción principal del programa, es decir, con el momento exacto en el que estamos jugando, sea machacando marcianos a hostias o intentado encajar piezas en su justo lugar para destuir líneas de ladrillos de colores.


El tercero de los puntos (detectar colisiones) actúa sobre las distintas colisiones que se puedan producir en el juego y las controla. Al fin y al cabo, un videojuego no es más que un montón de imágenes generadas por ordenador y moviéndose por la pantalla, y la física del movimiento de estas imágenes debe ser lo más realista posible. Así pues, por ejemplo, un personaje manipulado por el jugador no debe poder atravesar una pared que está a su derecha, por lo que el detector de colisiones ha de localizar si se ha producido un toque entre ambos para anular los movimientos a la derecha, dando la sensación de que se ha chocado con dicha pared. Asimismo, el impacto de un proyectil sobre un enemigo es una colisión que debe ser detectada, como el apoyo de sus pies sobre el suelo o un golpe contra el techo al saltar.


El mundo de la detección de colisiones es una disciplina aparte que bien podría requerir de un libro completo para su explicación, con miles de fórmulas matemáticas y mucha teoría física. Evidentemente, no es lo mismo la colisión de dos sprites en un mundo 2D, que no son más que cuadraditos chocando por alguno de sus cuatro lados, que una colisión en un espacio 3D entre figuras poligonales con formas complicadísimas. El programador deberá decidir cuánto tiempo de proceso dedica a que los microchips detecten este tipo de colisiones, desde un burdo envoltorio tridimensional que casi no permita acercarse al personaje a ningún sitio, hasta una programación exhaustiva (a nivel de píxel) que detecte un disparo dirigido a la rodilla del enemigo y le provoque una simple herida en ella, sin llegar a matarlo.


Por poner un ejemplo claro: si ajustamos un tiempo de bucle a 25 FPS, ello significa que debemos llamar al método de renderizado cada 40 milisegundos (1000 / 25 = 40 ms). Como antes de hacer render se llama a los métodos de actualización de variables, posiciones, detector de colisiones y demás, tenemos que asegurarnos que todas estas actualizaciones se pueden realizar en 40 ms o menos, de lo contrario, tendremos un juego más lento. 2ff7e9595c


0 views0 comments

Recent Posts

See All

Hozzászólások


bottom of page