250 likes | 403 Views
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.
E N D
Programación Gráfica 7. Programación en Videojuegos 2D I.
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); }
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 • 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; } }
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 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 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