Usuwanie postaci z vectora gdy warunek jest spełniony
Ostatnio zmodyfikowano 2013-05-04 17:25
RazzorFlame Temat założony przez niniejszego użytkownika |
Usuwanie postaci z vectora gdy warunek jest spełniony » 2013-05-04 11:48:42 O jaaa. Tego to już się nie spodziewałem. Te vector'y to jednak zło wcielone... Mam sobie taki kodzik: for( int i = 0; i < armySize(); i++ ) { if( getUnit( i )->m_Hp <= 0 ) { for( int i2 = 0; i < armySize(); i++ ) { if( getUnit( i2 )->m_AttackDest == getUnit( i ) ) { getUnit( i2 )->m_AttackDest = NULL; getUnit( i2 )->m_Dest = getUnit( i2 )->m_Pos; } } if( selectedUnit == getUnit( i ) ) selectedUnit = NULL; cout << "Hp postaci nr. " << i << " jest rowne" << getUnit( i )->m_Hp << endl; cout << "usuwanie postaci nr. " << i << endl; deleteUnit( i ); } }
Funkcja deleteunit(); void Army::deleteUnit( int id ) { if( m_Units.size() == 0 || m_Units.size() <( unsigned ) id ) return; else m_Units.erase( m_Units.begin() + id ); }
Tak usuwam postać, na moje oko powinno to działać dobrze. Jednak jest pewien szkopuł. Mam 3 postacie. Kiedy 1 postac zabije postac nr.2 to znika też 3 postać. Kiedy 2 postać zabije 1 postać to znikają wszystkie 3 postacie. Kiedy 3 postać zabije 2 postać to znikają postacie nr. 2 i nr. 3 Kiedy 3 postac zabije 1 postac to znikają wszystkie postacie. No i jak tu pracować z takim czymś. Warunek jest że jeśli Hp danej postaci jest <= 0 to ta postać jest usuwana. Co mógłbym zrobić żeby to naprawić? Nie wiem zbytnio jakie nieprzyjemności się wiążą z używaniem vectora. Naprowadzilibyście mnie? Jeśli czegoś nie rozumiecie w kodzie to wytłumacze. A i "getUnit()" zwraca wskaźnik na dany obiekt w vectorze. |
|
pekfos |
» 2013-05-04 11:50:59 Aktualizujesz wskaźniki po usuwaniu postaci? |
|
RazzorFlame Temat założony przez niniejszego użytkownika |
» 2013-05-04 11:54:04 Wskaźniki używam tylko z funkcji getUnit(). Jak widać w kodzie zadbałem o to żeby przed usunięciem postaci wszystkie wskaźniki każdej postaci są ustawiane na NULL. |
|
pekfos |
» 2013-05-04 12:14:32 Jak wyświetlasz? |
|
RazzorFlame Temat założony przez niniejszego użytkownika |
» 2013-05-04 12:18:00 Taką sobie szubienicą (czyt. pętelką ;p): Rect2D srcrect; for( int i = 0; i < armySize(); i++ ) { if( m_Units[ i ].getPosition().X + m_WinPtr->getCamPos().X >= - 40 && m_Units[ i ].getPosition().X + m_WinPtr->getCamPos().X <= 800 && m_Units[ i ].getPosition().Y + m_WinPtr->getCamPos().Y >= - 40 && m_Units[ i ].getPosition().Y + m_WinPtr->getCamPos().Y <= 600 ) { if( m_Units[ i ].m_Type == UNIT_SWORDFISH ) { srcrect.Y = 0; srcrect.X = 40 * m_Units[ i ].getAnimation(); srcrect.W = 40 + srcrect.X; srcrect.H = 40; spr->SetSubRect( srcrect.convertToI() ); spr->SetCenter( 20, 20 ); spr->SetPosition( sf::Vector2f( m_Units[ i ].m_Pos.X + m_WinPtr->getCamPos().X + 20, m_Units[ i ].m_Pos.Y + m_WinPtr->getCamPos().Y + 20 ) ); spr->SetRotation( m_Units[ i ].m_Direction ); } m_WinPtr->m_Window.Draw( * spr ); } }
A i dodam że armySize() to: int Army::armySize() { return m_Units.size(); }
Edit: Metody z Vector2D convertToI zwraca sf::IntRect a convertToF sf::FloatRect. Taka zwykła konwertacja. Edit x2: To jednak nie ma sensu... widać z wypisu konsoli (dalem cout-y zeby wiedziec co sie dzieje) Zaatakowano wojownika. Zadano mu 15 obrazen. Jego HP wynosi: 285/300 Zaatakowano wojownika. Zadano mu 15 obrazen. Jego HP wynosi: 270/300 Zaatakowano wojownika. Zadano mu 15 obrazen. Jego HP wynosi: 255/300 Zaatakowano wojownika. Zadano mu 15 obrazen. Jego HP wynosi: 240/300 Zaatakowano wojownika. Zadano mu 15 obrazen. Jego HP wynosi: 225/300 Zaatakowano wojownika. Zadano mu 15 obrazen. Jego HP wynosi: 210/300 Zaatakowano wojownika. Zadano mu 15 obrazen. Jego HP wynosi: 195/300 Zaatakowano wojownika. Zadano mu 15 obrazen. Jego HP wynosi: 180/300 Zaatakowano wojownika. Zadano mu 15 obrazen. Jego HP wynosi: 165/300 Zaatakowano wojownika. Zadano mu 15 obrazen. Jego HP wynosi: 150/300 Zaatakowano wojownika. Zadano mu 15 obrazen. Jego HP wynosi: 135/300 Zaatakowano wojownika. Zadano mu 15 obrazen. Jego HP wynosi: 120/300 Zaatakowano wojownika. Zadano mu 15 obrazen. Jego HP wynosi: 105/300 Zaatakowano wojownika. Zadano mu 15 obrazen. Jego HP wynosi: 90/300 Zaatakowano wojownika. Zadano mu 15 obrazen. Jego HP wynosi: 75/300 Zaatakowano wojownika. Zadano mu 15 obrazen. Jego HP wynosi: 60/300 Zaatakowano wojownika. Zadano mu 15 obrazen. Jego HP wynosi: 45/300 Zaatakowano wojownika. Zadano mu 15 obrazen. Jego HP wynosi: 30/300 Zaatakowano wojownika. Zadano mu 15 obrazen. Jego HP wynosi: 15/300 Zaatakowano wojownika. Zadano mu 15 obrazen. Jego HP wynosi: 0/300 Teraz wielkosc armii wynosi 2 Teraz wielkosc armii wynosi 1 Teraz wielkosc armii wynosi 0
|
|
pekfos |
» 2013-05-04 12:32:39 Podaj kod z tymi ostatnimi 3 coutami. |
|
RazzorFlame Temat założony przez niniejszego użytkownika |
» 2013-05-04 12:35:25 Tzn teraz dodałem ten cout do pętli zaraz za deleteunit(i): if( selectedUnit == getUnit( i ) ) selectedUnit = NULL;
deleteUnit( i ); cout << "Teraz wielkosc armii wynosi " << armySize() << endl;
|
|
pekfos |
» 2013-05-04 12:37:29 Zmniejsz i o 1, jeśli obiekt został usunięty. |
|
« 1 » 2 3 |