Witam.
Piszę grę w stylu arkanoid. Mam problem z resetem mapy. Używam allegro5. Na początku kod:
void cMap::make()
{
bricks.clear();
cMap::load();
for(int i=0; i<total_amount; i++)
{
if(tiles[i])
{
int modulo = (i%w_amount);
bricks.push_back(new cBrick(modulo*brick_w, (((int)i/w_amount)*brick_h), brick_w, brick_h));
}
}
}
tiles[] to dynamiczna tablica, która opisuje zawartość każdej części ekranu(0 - pustka, 1 - klocek), ustawiana za pomocą metody load()
bricks to wektor wskaźników na obiekty cBrick
bool cMap::check_coll(cBall *ball)
{
for (unsigned int i=0; i<bricks.size(); i++)
{
if(bricks[i]->check_coll(ball))
{
tiles[i] = 0;
bricks.erase(bricks.begin()+i);
return TRUE;
}
}
return FALSE;
}
Po wykryciu kolizji usuwany jest klocek, który ją spowodował.
Generalnie wszystko działa dobrze, aż do restartu mapy(np. po 3 zniszczeniach piłki) , czyli powtórnego wywołania metody cMap::make();
Obraz się wtedy 'zawiesza', ale logika działa tak, jak ma działać(np. dostaje w konsoli informacje o kolizji), eventy z klawiatury również są wciąż obsługiwane. Dodam jeszcze, że podczas wywołania metody cMap::make(), klocki nie są wyświetlane, a w dekonstruktorze cBrick usuwam bitmapę, którą zajmował.
Problem tkwi w linii:[code]bricks.push_back(new cBrick(modulo*brick_w, (((int)i/w_amount)*brick_h), brick_w, brick_h));[/code]
Po jej usunięciu wszystko odbywa się prawidłowo, tyle, że mapa nie jest zrobiona.
Nie pomaga także stworzenie nowego wskaźnika na cMap i wywołanie jego metody make().
Gdy ustawiam nowy wskaźnik w tym samym miejscu w pętli głównej, efekt jest taki sam.
Proszę o pomoc w rozwiązaniu problemu :)