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

Usuwanie postaci z vectora gdy warunek jest spełniony

Ostatnio zmodyfikowano 2013-05-04 17:25
Autor Wiadomość
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:
C/C++
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();
C/C++
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.
P-81964
pekfos
» 2013-05-04 11:50:59
Aktualizujesz wskaźniki po usuwaniu postaci?
P-81965
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.
P-81966
pekfos
» 2013-05-04 12:14:32
Jak wyświetlasz?
P-81971
RazzorFlame
Temat założony przez niniejszego użytkownika
» 2013-05-04 12:18:00
Taką sobie szubienicą (czyt. pętelką ;p):
C/C++
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 )
        {
            //setting up image source rectangle
            srcrect.Y = 0;
            srcrect.X = 40 * m_Units[ i ].getAnimation();
            srcrect.W = 40 + srcrect.X;
            srcrect.H = 40;
            spr->SetSubRect( srcrect.convertToI() );
            //calculating and setting position in window
            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 ); //calculating direction
        }
        m_WinPtr->m_Window.Draw( * spr );
       
       
    }
}
A i dodam że armySize() to:
C/C++
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
P-81973
pekfos
» 2013-05-04 12:32:39
Podaj kod z tymi ostatnimi 3 coutami.
P-81974
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):
C/C++
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 );
cout << "Teraz wielkosc armii wynosi " << armySize() << endl;
P-81975
pekfos
» 2013-05-04 12:37:29
Zmniejsz
i
 o 1, jeśli obiekt został usunięty.
P-81976
« 1 » 2 3
  Strona 1 z 3 Następna strona