[Allegro 5]Vector subscript out of range po chwili grania
Ostatnio zmodyfikowano 2012-10-21 19:25
bingo009 Temat założony przez niniejszego użytkownika |
[Allegro 5]Vector subscript out of range po chwili grania » 2012-10-21 19:06:06 Witam was serdecznie, mam problem z wyżej wymienionym problemem. Po przerwie wróciłem do kodzenia mojej gry. No i postanowiłem zrobić, aby przeciwnicy nie stali jak kołki, tylko bronili się. Pociski są proste, lecą w prostej linii do dołu, jak wykroczą poza ekran, albo trafią w gracza(tego jeszcze nie zrobiłem) to są kasowane. Problem w tym, że chwilę działa dobrze, a po chwili pokazuje się błąd, który widnieje w treści. Oto kod funkcji shoot(przeciwnicy są klasą enemy, która jest w kontenerze vector): void shoot( int ile ) { int ktory; for( int i = 0; i < ile; ++i ) { ktory =( rand() % 30 ) + 1; POCISK nowy_pocisk2; nowy_pocisk2.x = enemy[ ktory ].x + 28; nowy_pocisk2.y = enemy[ ktory ].y; enemybullet.push_back( nowy_pocisk2 ); } }
Funkcja shoot jest wywoływana co jakiś czas: if( al_get_time() > czas3 + 1.3 ) { shoot( level ); czas3 = al_get_time(); }
Od levela zależy ilu przeciwników naraz wystrzeli. Dla testów ustawiłem level na 4. A oto rysowanie i kasowanie pocisków: for( short i = 0; i < enemybullet.size(); i++ ) { al_draw_bitmap( vsbullet, enemybullet[ i ].x, enemybullet[ i ].y, 0 ); if( enemybullet[ i ].y > 480 ) { enemybullet.erase( enemybullet.begin() + i ); } }
Po wywaleniu wywoływania funkcji shoot problem nie występuje(dla strzelania gracza jest ta sama funkcja + sprawdzanie kolizji), więc problem musi leżeć tu. Proszę o pomoc. |
|
SeaMonster131 |
» 2012-10-21 19:14:58 ktory =( rand() % 30 ) + 1; .. nowy_pocisk2.x = enemy[ ktory ].x + 28; nowy_pocisk2.y = enemy[ ktory ].y;
Wydaje mi się, że tutaj wychodzisz poza zakres. Na Twoim miejscu losowałbym sobie w ten sposób przeciwnika: ktory = rand() %( enemy.size() - 1 );
Ponieważ, możesz nie zawsze mieć 30 przeciwników, poza tym, tablicę liczymy od 0 :) |
|
bingo009 Temat założony przez niniejszego użytkownika |
» 2012-10-21 19:25:06 Właśnie, masz rację. Wprawdzie zawsze na start jest 30 przeciwników, ale jak ich ostrzelam to zostaje mniej. Dzięki za pomoc, problem rozwiązany. Muszę bardziej uważać na takie rzeczy. Zamykam.
Edit: Wiem, że tablice numeruje się od zera, na ekranie jest 32 przeciwników maksymalnie. |
|
« 1 » |