Upload
fabian-rodriguez
View
1.579
Download
4
Embed Size (px)
DESCRIPTION
Segunda parte de la guia sobre como programar videojuegos.
Citation preview
Jose Ignacio Alamos Javier Letelier Ruiz
Jestudio.cl
Capitulo 2
GUIAProgramación de video juegos
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 .
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
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}
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. )
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 , ( ,
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
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 ( , )
{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 ( == ){
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()
}}