7. Programación en Videojuegos 2D I. Programación Gráfica 7. Programación en Videojuegos 2D I.
7.1 Sprites
Sprites Es un mapa de bits que se dibujan en pantalla. Debe tener transparencias. Para crear una animación se crea una secuencia de sprites.
Secuencia de sprites Para más sprites: http://www.nes-snes-sprites.com
Utilizando 1 imagen Para mover sólo cambiamos la posición: void SetPosition(float x, float y) { position->x = x; position->y = y; }
Utilizando 1 imagen Para pintar sólo dibujamos la imagen en la posición del sprite. void Draw( Graphics g ) { g->DrawImage(image, posX, posY); }
7.2 Background
Utilizando 1 imagen
Utilizando 1 imagen
Utilizando 1 imagen Movemos el background hacia la izquierda a una velocidad constante. Move() { posX += velocityX; if( posX <= -pantalla->width) posX += pantalla->width; }
Utilizando 1 imagen Pintamos la imagen hasta que complete toda el ancho de la pantalla. Draw(Graphics graphics) { for(int i=posX; i<pantalla->width: i+=image- >width) graphics->drawImage(image, i, 0); }
Utilizando un conjunto de imágenes Más imágenes background en http://www.panelmonkey.org
Utilizando un conjunto de imágenes
Utilizando un conjunto de imágenes Movemos de derecha a izquierda. Move() { posX += velocityX; if(posX <= -imagen[ imagen_actual] == nImage) { posX += width; image_actual++; if(image_actual == nImage) image_actual = 0; }
Utilizando un conjunto de imágenes Pintamos todo el conjunto de imágenes que representan en fondo del videojuego. Draw(Graphics graphics) { for(int i=posX, j=imagen_actual; i<pantalla->width; i+=imagen[j]->width) graphics->drawImage(image[j++], i, 0); if(j == nImage) j = 0; }
7.3 Collision Detection
Collision Detection Conjunto de algoritmos matemáticos que nos permiten detectar si 2 objetos están colisionando. Sin ellas podemos decir que NO puede existir un videojuego. El algoritmo varía dependiendo de la forma de los objetos. El algoritmo clásico es collisión box, y hoy en día se utiliza per-pixel-collision.
Detección de Colisiones Entre Círculos
Detección de Colisiones Entre Círculos Hay colisión No hay colisión Hay colisión Fuente: http://juank.black-byte.com/xna-colisiones-2d/
Detección de Colisiones Entre Círculos bool IsCollision(Sprite sp1, Sprite sp2) { float dx = (sp2->x – sp1->x); float dy = (sp2->y – sp1->y); float distance = sqrt( dx*dx + dy*dy); return ( distance <= (sp1->radio + sp2->radio)) }
Collision Box
Collision Box Fuente: http://juank.black-byte.com/xna-colisiones-2d/
Collision Box bool IsCollision(Sprite sp1, Sprite sp2) { if( (min( sp1->width + sp1->x, sp2->width + sp2->x) >= max(sp1- >x, sp2->x)) if( (min( sp1->y, sp2->y) >= max(sp1->y + sp1->height, sp2- >height)) return true; } return false
Per-Pixel-Collision La detección de colisiones se realiza por la superposición de los pixeles entre 2 sprites. Para más información: http://www.significant- bits.com/the-1-pixel- collision-box
Preguntas ¿?