10

Guía de programacion de videojuegos II

Embed Size (px)

DESCRIPTION

Segunda parte de la guia sobre como programar videojuegos.

Citation preview

Page 1: Guía de programacion de videojuegos II

Jose Ignacio Alamos Javier Letelier Ruiz

Jestudio.cl

Capitulo 2

GUIAProgramación de video juegos

Page 2: Guía de programacion de videojuegos II

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 dinamismo. , de los juegos y la animación Por otro lado analizaremos sistemas más óptimos , . , de programación .

Ya sabemos la teoría del movimiento de las entradas y todas esas , , parafernalias Sin embargo necesitamos una serie de conceptos que harán. , posible 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 o más objetos en un 2 juego.Supongamos que estamos programando un juego estilo Pong Arcade La bola . debe 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é sistemas de colisión El primero basado en colisión circular y el 2 : , segundo en colisión rectangular En futuras entregas analizaremos un sistema . , de 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 útil , para obtener el lado restante en un triángulo rectángulo .

Page 3: Guía de programacion de videojuegos II

222 cba =+

Donde a y b son los catetos y , c es la hipotenusa .

Imaginemos que tenemos puntos en un plano uno con coordenadas 2 , ),( 11 yx ,el segundo con coordenadas ),( 22 yx Podemos obtener la distancia entre estos. puntos utilizando un plano cartesiano y éste conocido teorema Si en uno de los : puntos trazamos una recta paralela al eje X y en el otro trazamos otra paralela , al eje Y veremos que hay un punto de intersección y que el ángulo de esta , , intersección es º definición del plano cartesiano Si creamos un segmento 90 ( ). desde el primer punto hasta la intersección y otro segmento desde la , intersección hasta el segundo punto notaremos que estos segmentos cumplen , , los requisitos para ser catetos de un triángulo rectángulo Por lo tanto la . , distancia entre estos puntos es la hipotenusa de éste triángulo , .

Podemos obtener las medidas de los catetos pues el primero es ( 12 xx − y el, segundo es 12 yy − Conociendo esto podemos reemplazar la información en la). , fórmula original :

2212

212 )()( distyyxx =−+−

Donde dist es la distancia entre los puntos 2 .

Aplicando raiz cuadrada en ambos lados podemos despejar la variable dist , ,pero en términos computacionales no es necesario Si el lado izquierdo de la , : ecuación es menor o igual al lado derecho de la ecuación entonces hay , colisión No es necesario calcular con raiz cuadrada la distancia en todos los. ciclos pues quitaría recursos, , .

En resumen hay colisión si el cuadrado de la suma de ambas diferencias de , , los componentes X e Y son menores o iguales al cuadrado de la suma de los radios de ambos objetos

Page 4: Guía de programacion de videojuegos II

Por ejemplo supongamos que tenemos objetos circulares uno de radio y el , 2 , 5, otro de radio Habrá colisión si la distancia de los centros de ambos objetos es 3. menor o igual a 8.

Implementación:

Booleano Colisión Objeto PLAYER {

Entero X Y , Entero Radio Podría no ser entera esta variable depende del caso // ,

}PLAYER jugador jugador 1, 2

Función InicializarTodo (){

jugador x jugador y las coordenadas del jugador serán1. = 1. = 30 // 1 (30,por dar un ejemplo30),

jugador x2. = 100jugador y2. = 20

Las del jugador serán// 2, (100, 20)jugador Radio1. = 5jugador Radio2. = 3Colision False=

}

Función EntradayProcesamiento (){

Si Usuario aprieta izquierda ( _ _ ()){

Jugador x Jugador x1. = 1. Ð 1}

Page 5: Guía de programacion de videojuegos II

Si Usuario aprieta derecha ( _ _ ()){

Jugador x Jugador x1. = 1. + 1}Si Usuario aprieta arriba ( _ _ ()){

Jugador y Jugador y1. = 1. Ð 1}Si Usuario aprieta abajo ( _ _ ()){

Jugador y Jugador y1. = 1. + 1}Colisión DetectarColision Jugador Jugador= ( 1, 2)

}Función DetectarColision OBJETO Jugador OBJETO Jugador Válida Si no ( 1, 2) // . acomoda pasa los argumentos Radios Coordenadas, 6 ( , ){Si Jugador x Jugador x Jugador x Jugador x Jugador y ( ( ( 2. - 1. )* ( 2. - 1. ) ) + ( ( 2. -

Jugador y Jugador y Jugador y1. )* ( 2. - 1. ) ) <= Jugador Radio Jugador Radio Jugador Radio Jugador Radio( 1. + 2. )*( 1. + 2. ) )

{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 Jugador x Jugador y_ _ ( _ _ _1, 1. , 1. )

Page 6: Guía de programacion de videojuegos II

Dibujar en pantalla IMAGEN DEL JUGAGOR Jugador x Jugador y_ _ ( _ _ _2, 2. , 2. )

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 en . los juegos .Sin embargo en otros casos podríamos necesitar un tipo de colisión , rectangular.

Colisión Rectangular :

Este método es parecido al sistema “Bounding Box” sin embargo es más , , optimizado y requiere solo las coordenadas de los objetos sus anchos y sus, , alturas.

Imaginemos que hay cuadrados en un plano que no están colisionando Al 2 , . centro de cada cuadrado hay un punto actúa como pivote central es decir la , ( ,

Page 7: Guía de programacion de videojuegos II

coordenada del cuadrado es relativa a ese punto ¿Qué condición se debe ). cumplir para que ambos cuadrados colisionen, ?

Simple Al igual que en el caso anterior de la colisión circular generemos las. , rectas perpendiculares a los ejes para generar los catetos de un triángulo , rectángulo.A la vista podemos ver que habrá colisión si se cumplen condiciones , 2 :

Que la medida del cateto paralelo al eje X sea menor o igual que la suma de* las distancias de los centros a cualquier lado paralelo al eje Y de ambos , cuadrados.

Que la medida del cateto paralelo al eje Y sea menor o igual que la suma de* las distancias de los centros a cualquier lado paralelo al eje X de ambos , cuadrados.

Si se cumplen estas condiciones entonces existe colisión rectangular , .

Implementación:

Booleano Colisión Objeto PLAYER {

Entero X Y , Entero Alto Entero Ancho

}PLAYER jugador jugador 1, 2

Función InicializarTodo (){

jugador x jugador y las coordenadas del jugador serán1. = 1. = 30 // 1 (30,por dar un ejemplo30),

jugador x2. = 100

Page 8: Guía de programacion de videojuegos II

jugador y2. = 20Las del jugador serán// 2, (100, 20)

jugador Alto1. = 20jugador Alto2. = 30 jugador Ancho1. = 20jugador Ancho2. = 40

Colision False=}

Función EntradayProcesamiento (){

Si Usuario aprieta izquierda ( _ _ ()){

Jugador x Jugador x1. = 1. Ð 1}Si Usuario aprieta derecha ( _ _ ()){

Jugador x Jugador x1. = 1. + 1}Si Usuario aprieta arriba ( _ _ ()){

Jugador y Jugador y1. = 1. Ð 1}Si Usuario aprieta abajo ( _ _ ()){

Jugador y Jugador y1. = 1. + 1}Colisión DetectarColision Jugador Jugador= ( 1, 2)

}Función DetectarColision OBJETO Jugador OBJETO Jugador Válida Si no ( 1, 2) // . acomoda pasa los argumentos Radios Coordenadas, 6 ( , )

Page 9: Guía de programacion de videojuegos II

{Entero Dist x Dist y Almacenaran las distancias del centro del 1_ , 1_ //

primer cuadrado hasta ambos lados Entero Dist x Dist y Almacenaran las distancias del centro del 2_ , 2_ //

segundo cuadrado hasta ambos lados

Calculamos las distancias de los centros de cada cuadrado// Dist x Jugador Ancho1_ = 1. / 2Dist y Jugador Alto1_ = 1. / 2

Dist x Jugador Ancho2_ = 2. / 2Dist y Jugador Alto2_ = 2. / 2

Planteamos ambas condiciones// Si Jugador x Jugador x Dist x Dist x Y Jugador y( ( 2. Ð 1. ) <= ( 1_ + 2_ ) ( 2. Ð Jugador y Dist y Dist y1. ) <= ( 1_ + 2_ ){

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 Jugador x Jugador y_ _ ( _ _ _1, 1. , 1. )Dibujar en pantalla IMAGEN DEL JUGAGOR Jugador x Jugador y_ _ ( _ _ _2, 2. , 2. )

Si Colisión True ( == ){

Page 10: Guía de programacion de videojuegos II

MostrarTexto “Los objetos están colisionando Utilizando colisión( ( rectangular ”) )

}}Función Principal argumentos Entrada del programa función main ( ) // , {

InicializarTodo()Mientras Usuario No Presione ESC ( _ _ _ ()){

EntradayProcesamiento()Salida()

}}