Hola,
Para poder comprobar si un bloque colisiona con otro previamente necesitas tener almacenado el conjunto de bloques que ya han sido colocados al fondo de la pantalla (llamemosle 'muertos').
Lo que puedes hacer es dividir cada bloque en 4 bloquecitos, y tener una lista con todos los bloquecitos muertos. Entonces a la hora de mover el bloque en juego primero compruebas si algun bloquecito de ese bloque colisiona con algun otro de la lista de bloquecitos muertos.
En C++, un algoritmo podría ser así:
- Código: Seleccionar todo
struct Bloquecito {
SDL_Surface * pixmap;
SDL_Rect posicion, clip;
};
struct Bloque {
struct Bloquecito * bloquecitos[4];
int centro_x, centro_y;
};
vector<Bloquecito*> bloquecitos_muertos;
bool colisiona_bloque (Bloque* bloque)
{
vector<Bloquecito*>::iterator it;
for (it=bloquecitos_muertos.begin(); it!=bloquecitos_muertos.end();it++)
{
for (int i=0; i<4;i++)
{
if(colisiona_rect((*it)->posicion,bloque->bloquecitos[i]->posicion))
return true;
}
}
return false;
}
Donde colisiona_rect() comprueba si dos SDL_rect's intersectan. Puedes encontrar esta función en casi cualquier juego, es bastante sencilla.
Por otro lado tene en cuenta que ademas debes llevar cuenta de que cantidad de bloquecitos muertos hay en cada linea, por lo que en realidad convendria utilizar una matriz para los bloquecitos muertos. Donde para cada fila i le corresponde un vector con los bloquecitos pertenecientes a la linea i , entonces las estructuras quedarían así:
- Código: Seleccionar todo
struct Bloquecito {
SDL_Surface * pixmap;
SDL_Rect posicion, clip;
// nuevo atributo.... inicialmente 'false'
bool muerto;
};
struct Bloque {
struct Bloquecito * bloquecitos[4];
int centro_x, centro_y;
};
// una matriz, m[i][j] representa el bloque j de la linea i
vector<vector<Bloquecito*> > bloquecitos_muertos;
Luego, recorriendo esa matriz puedes determinar la cantidad de bloquecitos muertos para cada linea, y asi eliminar esa linea (que en este caso seria eliminar una fila de la matriz).
Si no estas familiarizado con la biblioteca STL te recomiendo el sitio:
http://www.cplusplus.com/reference/
saludos!!