Cpu 2 ai l  toGI UA                 J td .                    e ui l                     s o c        Po rmai d v e je o  ...
Capitulo         Colisiones, Dinamismo y animaciones..En la entrega anterior, aprendimos el esquema básico de un juego sim...
a2 + b2 = c2Donde a y b son los catetos, y c es la hipotenusa.Imaginemos que tenemos 2 puntos en un plano, uno con coorden...
Por ejemplo, supongamos que tenemos 2 objetos circulares, uno de radio 5, y elotro de radio 3. Habrá colisión si la distan...
Si (Usuario_aprieta_derecha())      {               Jugador1.x = Jugador1.x + 1      }      Si (Usuario_aprieta_arriba()) ...
Dibujar_en_pantalla(IMAGEN_DEL_JUGAGOR_2, Jugador2.x, Jugador2.y)       Si (Colisión == True)       {               Mostra...
coordenada del cuadrado es relativa a ese punto). ¿Qué condición se debecumplir, para que ambos cuadrados colisionen?Simpl...
jugador2.y = 20      // Las del jugador 2, serán (100, 20)      jugador1.Alto = 20      jugador2.Alto = 30      jugador1.A...
{      Entero Dist1_x, Dist1_y // Almacenaran las distancias del centro delprimer cuadrado hasta ambos lados      Entero D...
MostrarTexto(“Los objetos están colisionando (Utilizando colisiónrectangular)”)      }}Función Principal (argumentos) // E...
Próxima SlideShare
Cargando en…5
×

Guía de programacion de videojuegos II

1.795 visualizaciones

Publicado el

Segunda parte de la guia sobre como programar videojuegos.

Publicado en: Educación, Viajes, Empresariales
1 comentario
1 recomendación
Estadísticas
Notas
  • Muchas gracias, me interesa mucho este tema
       Responder 
    ¿Estás seguro?    No
    Tu mensaje aparecerá aquí
Sin descargas
Visualizaciones
Visualizaciones totales
1.795
En SlideShare
0
De insertados
0
Número de insertados
78
Acciones
Compartido
0
Descargas
92
Comentarios
1
Recomendaciones
1
Insertados 0
No insertados

No hay notas en la diapositiva.

Guía de programacion de videojuegos II

  1. 1. Cpu 2 ai l toGI UA J td . e ui l s o c Po rmai d v e je o rga c n e i o u g s ó dJ s In c Aa s oe g ai l o mo J v r eee R i a i L tlr u e i z
  2. 2. Capitulo Colisiones, Dinamismo y animaciones..En la entrega anterior, aprendimos el esquema básico de un juego simple(bastante, diría yo). En ésta tocaremos el tema de las colisiones, el dinamismode los juegos, y la animación. Por otro lado, analizaremos sistemas más óptimosde programación.Ya sabemos la teoría del movimiento, de las entradas, y todas esasparafernalias. Sin embargo, necesitamos una serie de conceptos que haránposible el desempeño de un juego. El primer concepto es la colisión.¿Qué demonios es una colisión?Nos referimos a una colisión a la intersección o unión de 2 o más objetos en unjuego.Supongamos que estamos programando un juego estilo Pong Arcade. La boladebe saber si ha “chocado” con el bate, con las paredes, o con las fichas. Este“choque” es analizado y comprobado por un sistema de colisiones.Analizaré 2 sistemas de colisión: El primero basado en colisión circular, y elsegundo en colisión rectangular. En futuras entregas, analizaremos un sistemade colisión perfecta basado en la detección de imágenes sobrepuestas.Colisión circular:Más de alguno ha escuchado hablar sobre el teorema de Pitágoras, fórmula útilpara obtener el lado restante en un triángulo rectángulo.
  3. 3. a2 + b2 = c2Donde a y b son los catetos, y c es la hipotenusa.Imaginemos que tenemos 2 puntos en un plano, uno con coordenadas ( x1 , y1 ) ,el segundo con coordenadas ( x 2 , y 2 ) . Podemos obtener la distancia entre estospuntos utilizando un plano cartesiano y éste conocido teorema: Si en uno de lospuntos trazamos una recta paralela al eje X, y en el otro trazamos otra paralelaal eje Y, veremos que hay un punto de intersección, y que el ángulo de estaintersección es 90º (definición del plano cartesiano). Si creamos un segmentodesde el primer punto hasta la intersección, y otro segmento desde laintersección hasta el segundo punto, notaremos que estos segmentos, cumplenlos requisitos para ser catetos de un triángulo rectángulo. Por lo tanto, ladistancia entre estos puntos, es la hipotenusa de éste triángulo.Podemos obtener las medidas de los catetos (pues el primero es x 2 − x1 , y elsegundo es y 2 − y1 ). Conociendo esto, podemos reemplazar la información en lafórmula original:( x 2 − x1 ) 2 + ( y 2 − y1 ) 2 = dist 2Donde dist es la distancia entre los 2 puntos.Aplicando raiz cuadrada en ambos lados, podemos despejar la variable dist,pero en términos computacionales, no es necesario: Si el lado izquierdo de laecuación es menor o igual al lado derecho de la ecuación, entonces haycolisión. No es necesario calcular con raiz cuadrada la distancia en todos losciclos, pues, quitaría recursos.En resumen, hay colisión, si el cuadrado de la suma de ambas diferencias delos componentes X e Y son menores o iguales al cuadrado de la suma de losradios de ambos objetos
  4. 4. Por ejemplo, supongamos que tenemos 2 objetos circulares, uno de radio 5, y elotro de radio 3. Habrá colisión si la distancia de los centros de ambos objetos esmenor o igual a 8.Implementación:Booleano ColisiónObjeto PLAYER{ Entero X, Y Entero Radio // Podría no ser entera esta variable, depende del caso}PLAYER jugador1, jugador2Función InicializarTodo(){ jugador1.x = jugador1.y = 30 // las coordenadas del jugador 1 serán (30,30), por dar un ejemplo jugador2.x = 100 jugador2.y = 20 // Las del jugador 2, serán (100, 20) jugador1.Radio = 5 jugador2.Radio = 3 Colision=False}Función EntradayProcesamiento(){ Si (Usuario_aprieta_izquierda()) { Jugador1.x = Jugador1.x Ð 1 }
  5. 5. Si (Usuario_aprieta_derecha()) { Jugador1.x = Jugador1.x + 1 } Si (Usuario_aprieta_arriba()) { Jugador1.y = Jugador1.y Ð 1 } Si (Usuario_aprieta_abajo()) { Jugador1.y = Jugador1.y + 1 } Colisión=DetectarColision(Jugador1, Jugador2)}Función DetectarColision(OBJETO Jugador1, OBJETO Jugador2) // Válida. Si noacomoda, pasa los 6 argumentos (Radios, Coordenadas){Si ( ( (Jugador2.x-Jugador1.x)* (Jugador2.x-Jugador1.x) ) + ( (Jugador2.y- Jugador1.y)* (Jugador2.y-Jugador1.y) ) <= (Jugador1.Radio+Jugador2.Radio)*(Jugador1.Radio+Jugador2.Radio) ){ //Colisión detectada. Devolvemos True Devolver True;//Return true en la mayoría de los lenguajes}//Si no pasa nada, devolvemos FalseReturn False}Función Salida(){ Dibujar_en_pantalla(IMAGEN_DEL_JUGAGOR_1, Jugador1.x, Jugador1.y)
  6. 6. Dibujar_en_pantalla(IMAGEN_DEL_JUGAGOR_2, Jugador2.x, Jugador2.y) Si (Colisión == True) { MostrarTexto(“Los objetos están colisionando”) }}Función Principal (argumentos) // Entrada del programa, función main{ InicializarTodo() Mientras (Usuario_No_Presione_ESC()) { EntradayProcesamiento() Salida() }}Este es el esquema básico de un sistema de colisión circular. Es bastante útil enlos juegos.Sin embargo, en otros casos podríamos necesitar un tipo de colisiónrectangular.Colisión Rectangular:Este método es parecido al sistema “Bounding Box”, sin embargo, es másoptimizado, y requiere solo las coordenadas de los objetos, sus anchos y susalturas.Imaginemos que hay 2 cuadrados en un plano, que no están colisionando. Alcentro de cada cuadrado, hay un punto actúa como pivote central (es decir, la
  7. 7. coordenada del cuadrado es relativa a ese punto). ¿Qué condición se debecumplir, para que ambos cuadrados colisionen?Simple. Al igual que en el caso anterior de la colisión circular, generemos lasrectas perpendiculares a los ejes, para generar los catetos de un triángulorectángulo.A la vista, podemos ver que habrá colisión si se cumplen 2 condiciones:* Que la medida del cateto paralelo al eje X sea menor o igual que la suma delas distancias de los centros a cualquier lado paralelo al eje Y, de amboscuadrados.* Que la medida del cateto paralelo al eje Y sea menor o igual que la suma delas distancias de los centros a cualquier lado paralelo al eje X, de amboscuadrados.Si se cumplen estas condiciones, entonces existe colisión rectangular.Implementación:Booleano ColisiónObjeto PLAYER{ Entero X, Y Entero Alto Entero Ancho}PLAYER jugador1, jugador2Función InicializarTodo(){ jugador1.x = jugador1.y = 30 // las coordenadas del jugador 1 serán (30,30), por dar un ejemplo jugador2.x = 100
  8. 8. jugador2.y = 20 // Las del jugador 2, serán (100, 20) jugador1.Alto = 20 jugador2.Alto = 30 jugador1.Ancho = 20 jugador2.Ancho = 40 Colision=False}Función EntradayProcesamiento(){ Si (Usuario_aprieta_izquierda()) { Jugador1.x = Jugador1.x Ð 1 } Si (Usuario_aprieta_derecha()) { Jugador1.x = Jugador1.x + 1 } Si (Usuario_aprieta_arriba()) { Jugador1.y = Jugador1.y Ð 1 } Si (Usuario_aprieta_abajo()) { Jugador1.y = Jugador1.y + 1 } Colisión=DetectarColision(Jugador1, Jugador2)}Función DetectarColision(OBJETO Jugador1, OBJETO Jugador2) // Válida. Si noacomoda, pasa los 6 argumentos (Radios, Coordenadas)
  9. 9. { Entero Dist1_x, Dist1_y // Almacenaran las distancias del centro delprimer cuadrado hasta ambos lados Entero Dist2_x, Dist2_y // Almacenaran las distancias del centro delsegundo cuadrado hasta ambos lados // Calculamos las distancias de los centros de cada cuadrado Dist1_x = Jugador1.Ancho / 2 Dist1_y = Jugador1.Alto / 2 Dist2_x = Jugador2.Ancho / 2 Dist2_y = Jugador2.Alto / 2 // Planteamos ambas condiciones Si( (Jugador2.x Ð Jugador1.x) <= ( Dist1_x + Dist2_x) Y (Jugador2.y Ð Jugador1.y) <= ( Dist1_y + Dist2_y) { //Colisión detectada. Devolvemos True Devolver True; //Return true en la mayoría de los lenguajes } //Si no pasa nada, devolvemos False Return False}Función Salida(){ Dibujar_en_pantalla(IMAGEN_DEL_JUGAGOR_1, Jugador1.x, Jugador1.y) Dibujar_en_pantalla(IMAGEN_DEL_JUGAGOR_2, Jugador2.x, Jugador2.y) Si (Colisión == True) {
  10. 10. MostrarTexto(“Los objetos están colisionando (Utilizando colisiónrectangular)”) }}Función Principal (argumentos) // Entrada del programa, función main{ InicializarTodo() Mientras (Usuario_No_Presione_ESC()) { EntradayProcesamiento() Salida() }}

×