Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[Allegro 5]Vector subscript out of range po chwili grania

Ostatnio zmodyfikowano 2012-10-21 19:25
Autor Wiadomość
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):
C/C++
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:
C/C++
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:
C/C++
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.
P-67242
SeaMonster131
» 2012-10-21 19:14:58
C/C++
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:
C/C++
ktory = rand() %( enemy.size() - 1 );
Ponieważ, możesz nie zawsze mieć 30 przeciwników, poza tym, tablicę liczymy od 0 :)
P-67244
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.
P-67245
« 1 »
  Strona 1 z 1