Rozszerzanie tablicy typu sprite bez korzystania z klasy vector
Ostatnio zmodyfikowano 2014-09-26 15:57
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); int licznik = 1; int a = 0; int pokaz = 1; double ck = 0;
CircleShape * kulka = new CircleShape[ 1 ]; kulka->setRadius( 4 ); kulka->setFillColor( Color( 247, 236, 28, 255 ) ); kulka->setPosition( 100, 200 );
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. if( Keyboard::isKeyPressed( Keyboard::Space ) ) { CircleShape * t_kulka = new CircleShape[ licznik ]; a = 0; while( a < licznik ) { t_kulka[ a ] = kulka[ a ]; a++; } delete[] kulka; licznik++; kulka = new CircleShape[ licznik ]; kulka->setRadius( 4 ); kulka->setFillColor( Color( 247, 236, 28, 255 ) ); kulka->setPosition( 100, 200 ); a = 0; while( a <= licznik ) { kulka[ a ].setPosition( p.getPosition().x, p.getPosition().y ); a++; } ck = 0; } Następnie ustawiam pozycję kulki taką samą jak postaci w grze i włączam ruch kulki. if( pokaz == 1 ) { ck += dt1; kulka->move( 50 * ck, 0 ); if( ck >= 0.15 ) { ck = 0; } }
Wyświetlam kulki na koniec: if( pokaz == 1 ) { 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ć? |
|
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. |
|
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 ;) |
|
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<>. |
|
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
|
|
« 1 » |