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

Rozszerzanie tablicy typu sprite bez korzystania z klasy vector

Ostatnio zmodyfikowano 2014-09-26 15:57
Autor Wiadomość
qwers
Temat założony przez niniejszego użytkownika
Rozszerzanie tablicy typu sprite bez korzystania z klasy vector
» 2014-09-24 23:03:08
Dzień dobry.

Mam kłopot z rozszerzaniem dynamicznej tablicy sprite'ów z biblioteki SFML.
Otóż utworzyłem sobie dynamiczną tablicę Sprite z 1 elementem (na początek);
C/C++
int licznik = 1; //licznik kulek
int a = 0; //zmienna pomocnicza
int pokaz = 1; //zmienna uruchamia pokazywanie kulek
double ck = 0; //czas istnienia kulki

CircleShape * kulka = new CircleShape[ 1 ]; //utworzenie tablicy kulek
kulka->setRadius( 4 ); //ustawianie promienia kulek
kulka->setFillColor( Color( 247, 236, 28, 255 ) ); //ustawienie koloru kulki
kulka->setPosition( 100, 200 ); //ustawienie pozycji początkowej kulki
I teraz chcę, po naciśnięciu klawisza spacja, aby tablica mi się rozszerzała o 1 element Sprite.
Gdy, nacisnę znowu klawisz Spacja, ma się dodać drugi element, itd.
C/C++
if( Keyboard::isKeyPressed( Keyboard::Space ) ) // spacja (strzał)
{
    CircleShape * t_kulka = new CircleShape[ licznik ]; //tworzę tablicę tymczasową kulek, do której chcę wpisać obecną zawartość tablicy kulka przed jej usunięciem
   
    a = 0;
    while( a < licznik ) //pętla kopiująca zawartość tablicy kulka do tablicy t_kulka
    {
        t_kulka[ a ] = kulka[ a ];
        a++;
    }
   
   
    delete[] kulka; //usuwam obecną tablicę kulka
    licznik++; //zwiększam ilość kulek o 1
   
    kulka = new CircleShape[ licznik ]; //tworzę nową tablicę kulek zwiększoną o 1
    //poniżej wpowadzam ustawienia takie jak poprzednio
    kulka->setRadius( 4 ); //ustawianie promienia kulek
    kulka->setFillColor( Color( 247, 236, 28, 255 ) ); //ustawienie koloru kulki
    kulka->setPosition( 100, 200 ); //ustawienie pozycji początkowej kulki
   
   
    //ustawiam pozycję kulki taką jak gracza
    a = 0;
    while( a <= licznik )
    {
        kulka[ a ].setPosition( p.getPosition().x, p.getPosition().y );
        a++;
    }
   
    ck = 0; //wyzerowuję czas istnienia kulki
   
}
Następnie ustawiam pozycję kulki taką samą jak postaci w grze i włączam ruch kulki.
C/C++
if( pokaz == 1 )
{
    ck += dt1; //dt1 - to zmienna, która liczy różnicę czasu między wyświetlonymi ramkami obrazu
   
    kulka->move( 50 * ck, 0 );
    if( ck >= 0.15 ) { ck = 0; }
}
Wyświetlam kulki na koniec:
C/C++
if( pokaz == 1 ) //wyświetlam kulki
{
    a = 0;
    while( a < licznik )
    {
        okno.draw( kulka[ a ] );
        a++;
    }
   
}
I teraz program po naciśnięciu spacji wyłącza się i otrzymuję komunikat o błędzie (a największy problem sprawia: delete [] kulka; ).
Czy da się rozszerzać dynamiczną tablicę typu Sprite bez stosowania klasy vector?
Tego tego dokonać?
P-117485
maly
» 2014-09-25 08:53:19
Twój algorytm:
tworzysz pustą tablicę t_kulka
przepisujesz kulka do t_kulka
usuwasz kulka
tworzysz pustą tablicę kulka
używasz kulka

Niedość że używasz nie wypełnionej poprawnie tablicy to jeszcze masz wyciek.

while( a <= licznik )
 trochę za daleko.
P-117489
libed
» 2014-09-25 16:32:02
Mam nadzieję, że to nie używanie std::vector nie jest spowodowane moimi ostatnimi wywodami ;)

I teraz chcę, po naciśnięciu klawisza spacja, aby tablica mi się rozszerzała o 1 element Sprite.
Gdy, nacisnę znowu klawisz Spacja, ma się dodać drugi element, itd.
Nie alokuj pamięci co każdy jeden obiekt, bo jest to mało efektywne.
W zależności od przewidywanej liczby obiektów rozszerzaj tablicę co X elementów. Ile zostało wolnych miejsc możesz sobie sprawdzić tworząc dodatkową zmienną, która będzie mapowała obiekty na bity. bit ustawiony - miejsce zajęte, bit nieustawiony - miejsce wolne. Czyli notabene tak jak mniej więcej działa std::vector czy std::string.
Wybór należy do Ciebie ;)
P-117522
pekfos
» 2014-09-25 17:33:54
Ile zostało wolnych miejsc możesz sobie sprawdzić tworząc dodatkową zmienną, która będzie mapowała obiekty na bity. bit ustawiony - miejsce zajęte, bit nieustawiony - miejsce wolne. Czyli notabene tak jak mniej więcej działa std::vector czy std::string.
Raczej wystarczy int dla rozmiaru zaalokowanej pamięci i drugi, ile z tej pamięci jest aktualnie używane. Wtedy otrzymamy coś w rodzaju std::string, czy (dużo większe 'mniej więcej') std::vector<>.
P-117532
libed
» 2014-09-26 15:57:16
Racja. W tym przypadku indeksy nie mają większego znaczenia, tym bardziej użyłbym zwykłego vectora :P
P-117601
« 1 »
  Strona 1 z 1