Objekte in Vector schreiben und gleichzeitig löschen



  • grimmreefer schrieb:

    wie kann ich gleichzeitig Elemente in einen Vector hinzufügen und gleichzeitig beliebige Elemente während des push_back löschen.

    Was passt euch an der Fragestellung nicht?

    SeppJ schrieb:

    Was meinst du mit gleichzeitig?

    Ich meine während des push_backs.

    SeppJ schrieb:

    Was hat remove_if mit irgendetwas davon zu tun?

    Nexus schrieb:

    Ich würde eher std::remove_if() verwenden.

    SeppJ schrieb:

    Wie hängt das alles mit Mausklicks zusammen?

    grimmreefer schrieb:

    per Mausklick werden Elemente in eine vector<struct> gepackt

    SeppJ schrieb:

    Was ist überhaupt dein Problem?

    grimmreefer schrieb:

    Leider passiert diese Überprüfung immer erst wenn ich die Maustaste wieder losgelassen habe, bzw keine neuen Partikel hinzugefügt werden.

    Ich versteh nicht was euch nicht passt.



  • grimmreefer schrieb:

    SeppJ schrieb:

    Was meinst du mit gleichzeitig?

    Ich meine während des push_backs.

    push_back fügt ein Element in den vector ein. Da passiert nichts "gleichzeitig".

    Meinst du vielleicht "unmittelbar danach"?



  • grimmreefer schrieb:

    Ich versteh nicht was euch nicht passt.

    Es fehlen die Zusammenhänge. Du hast lauter Bruchstücke an Informationen. Selbst durch Raten ist es noch sehr schwer, diese zusammenzusetzen und sich dein Problem vorzustellen.

    Auf jede Frage, die wir stellen, kommt eine Antwort, nach der man kaum mehr weiss als vorher. "Was hat das mit Mausklicks zu tun" - "Mit Mausklicks werden Elemente eingefügt" - UND? Was ist denn das Problem, die Einfügung oder der Mausklick? Blende irrelevante Information aus und fokussiere dich auf das Wichtige.

    Im Übrigen ist es nicht gerade die feine Art, den gleichen Thread im SFML-Forum zu erstellen und dort ebenso schlecht zu beschreiben. Verwende die Zeit lieber um deine Problembeschreibung hier zu überarbeiten, dadurch kriegst du bessere Antworten. Dass du meinen Hinweis auf die reservierten Bezeichner im anderen Thread ebenfalls überlesen hast, steigert meine Motivation zu helfen übrigens auch nicht gerade.

    Also streng dich bitte ein wenig an, wir wollen dir nicht jedes Stück Information aus der Nase ziehen. Versetze dich in die Lage von Leuten, die dein Programm nicht kennen und aus deiner Beschreibung schlau werden müssen.



  • Nexus schrieb:

    Im Übrigen ist es nicht gerade die feine Art, den gleichen Thread im SFML-Forum zu erstellen

    Nichts für ungut, aber wenn ich in 10 verschiedenen Foren reinschreibe bleibst es immer noch meine Sache. Das soll keine Provokation sein.

    grimmreefer schrieb:

    per Mausklick werden Elemente in eine vector<struct> gepackt, via for-Schleife wird die LifeTime von jeden Partikel überprüft und wenn diese vorbei ist mit vector.erase(vector.begin()+i) gelöscht.

    Leider passiert diese Überprüfung immer erst wenn ich die Maustaste wieder losgelassen habe, bzw keine neuen Partikel hinzugefügt werden.

    Ich verstehe nicht was dabei unklar ist. Ich drücke die linke Maustaste. Über eine Memberfunktion werden Elemente mit push_back in einen vector<struckt> gepackt.

    WÄHRENDDESSEN wird im selben Moment in einer anderem Memberfunktion überprüft ob ein Element noch gültig ist. Wenn nicht wird es gelöscht.

    Das erfolgt aber nur wenn ich die Maustaste nicht drücke und damit Elemente hinzufüge.

    Falls ihr mir jetzt Folgen könnt, wie kann ich das lösen, so das während ich hinzufüge auch gelöscht wird?



  • Ich verstehe nicht was dabei unklar ist. Ich drücke die linke Maustaste. Über eine Memberfunktion werden Elemente mit push_back in einen vector<struckt> gepackt.

    Die linke Maustaste ist hier erstmal irrelevant, Du sagst ja nicht, wie die damit zusammenhängt (technisch... Du sagst, dass das beim Klick passiert, aber gibst keine Implementierungsdetails -> vollkommen unmöglich darauf basierend Hilfestellung zu geben). Aber okay, Du hast offensichtlich einen EventHandler dafür (auch erstmal egal), in dem mehrere Elemente in einen vector eingefügt werden. Gut, mag ja so sein.

    WÄHRENDDESSEN wird im selben Moment in einer anderem Memberfunktion überprüft ob ein Element noch gültig ist. Wenn nicht wird es gelöscht.

    Du unterliegst dem Irrtum, dass es so etwas wie Gleichzeitigkeit gibt. Das gibt es auf einem Computer nie wirklich.

    Sag doch Mal, wieso Du das gleichzeitig haben willst. Meinst Du, während der push_back-Iteration, in der etwas eingefügt wird? Meinst Du mit "währenddessen" zeitlich parallel, also wirklich mit Threads?

    push_back dient zum Einfügen, mehr kann das nicht. Du kannst also nicht gleichzeitig etwas löschen. Du könntest etwas ändern (dafür wäre eine andere Methode notwendig). Oder Du kannst danach löschen. Mit einem push_back-Methodenaufruf wirst Du kein Löschen erreichen können.

    Das erfolgt aber nur wenn ich die Maustaste nicht drücke und damit Elemente hinzufüge.

    Es gibt tausend Möglichkeiten Maustasten-Drücke zu behandeln, das ist je nach Bibliothek eine ganz andere Sache. Und je nachdem, wie Du das gerade behandelst. Wenn Du denkst, aus Deiner Aussage kann man etwas Sinnvolles ziehen, um Dir zu helfen, dann musst Du bei jedem hier Kristallkugeln voraussetzen.

    Falls ihr mir jetzt Folgen könnt, wie kann ich das lösen, so das während ich hinzufüge auch gelöscht wird?

    Definiere währenddessen. Du hast etwas dazu im Kopf, was nicht allgemeingültig ist. Wir wiederum können aber nicht in Deinen Kopf schauen und sehen, was Du damit meinst (oder tun es nicht, weil das Fähigkeiten preisgeben würde, die zu verbergen sind, um nicht diverse Untergrund-Organisationen dazu zu bringen uns zu kidnappen oder zu erpressen, um eben diese telepathischen Fähigkeiten auszunutzen). Das Wort währenddessen alleine ist einfach zu wenig.


  • Mod

    Dir wurde schon vor Ewigkeiten eine Antwort gegeben:

    SeppJ schrieb:

    Was meinst du mit gleichzeitig? [...] vector ist in der Regel nicht threadsicher, außer du verwendest spezielle threadsichere Varianten. Meinst du das mit gleichzeitig?

    Da du niemals darauf eingegangen bist und bloß patzig wurdest bei Gegenfragen, wie sollen wir dann wissen, ob es diese Antwort ist, die du suchtest?



  • SeppJ schrieb:

    Dir wurde schon vor Ewigkeiten eine Antwort gegeben:

    SeppJ schrieb:

    Was meinst du mit gleichzeitig? [...] vector ist in der Regel nicht threadsicher, außer du verwendest spezielle threadsichere Varianten. Meinst du das mit gleichzeitig?

    Da du niemals darauf eingegangen bist und bloß patzig wurdest bei Gegenfragen, wie sollen wir dann wissen, ob es diese Antwort ist, die du suchtest?

    Ich mach mir hier echt Freunde.

    Und ich wurde nicht patzig, ich verzweifle nur an mir selbst. Was hat hat es mit dieser threadsichere Varianten auf sich?



  • WAS meinst Du mit gleichzeitig. Antworte Mal, bevor Du Gegenfragen stellst. Denn das Ignorieren der Fragen, das macht dich echt antipathisch... Und wenn Du wichtige Gegenfragen ignorierst, dann kann Dir keiner helfen, wird Dir keiner helfen und - ganz ehrlich - dann will Dir auch keiner helfen.

    Also beantworte doch bitte einfach ALLES, was Dich gefragt wird.



  • Eisflamme schrieb:

    WAS meinst Du mit gleichzeitig.

    Im gleichen Moment in dem ich den push_back mache.



  • Zeig verdammt nochmal Code.
    Und im gleichen Moment, in dem du push_back() machst geht nicht, außer du arbeitest mit Threads (was ich bezweilfe).



  • Erzeugen:

    void PARTICLE::_ADDPARTICLE(string type, float LIFETIME, float SPEED, float GRAVITY, string TEXTURENAME, sf::Vector2f POSITION, unsigned int AMOUNT, unsigned int DIRECTION)
    {
    
        unsigned int counter = AMOUNT;
    
        _Timer.restart();
    
        _Texture.loadFromFile(TEXTURENAME);
        _Texture.setSmooth(true);
    
        sf::Sprite      _Sprite;
        _Sprite.setTexture(_Texture);
    
        _Data._Type = type;
        _Data._LifeTime = LIFETIME;
        _Data._Position = POSITION;
        _Data._Sprite = _Sprite;
        _Data._Sprite.setPosition(POSITION);
        _Data._Speed = SPEED;
        _Data._Gravity    = GRAVITY;
        _Data._Alpha = 255;
        _Data._Sprite.setOrigin(_Texture.getSize().x/2.f, _Texture.getSize().y/2.f);
    
    if(_Data._Type == "SPARK")
    {
        for(unsigned int i = 0; i < counter; i++)
        {
            unsigned int _Direction = rand()%360;
            _Data._Direction = _Direction;
            _Data._Sprite.setRotation(_Direction);
    
            _AllParticle.insert(_AllParticle.begin(),_Data);
        }
    }
    
    if(_Data._Type == "JET")
    {
        for(unsigned int i = 0; i < counter; i++)
        {
            _Data._Direction = DIRECTION;
    
            _AllParticle.insert(_AllParticle.begin(),_Data);
        }
    }
    
    }
    

    Prüfe, löschen:

    void PARTICLE::_CheckLifeTime()
    {
    
            for(unsigned int i = 0; i < _AllParticle.size(); i++)
        {
                if(_AllParticle[i]._LifeTime <= 0 )
                {
                    _AllParticle.erase(_AllParticle.begin()+i);
                }
        }
    }
    


  • Beim push_back löschen: Ja, das geht nicht, überhaupt nicht.

    Das ist aber auch nicht nötig. Du hast ja ein Problem, was Du lösen willst, wofür Du denkst, dass die Lösung sei eine Gleichzeitigkeit einzubauen. Aber das ist die Sache: Diese von Dir erdachte Lösung ist gar keine gute Lösung.

    D.h. Du solltest beschreiben, wofür Du diese Gleichzeitigkeit brauchst oder: Welches Problem willst Du mit der Gleichzeitigkeit von push_back + Löschen lösen? (das hast Du uns nicht verraten oder es wurde nicht ersichtlich)


  • Mod

    da ist keinerlei Gleichzeitigkeit. Auch keine Abfolge. Weil nirgendwo irgendetwas aufgerufen wird. Du hast uns bloß ein paar Funktionen gezeigt (übrigens mit jeder Menge ungültiger Bezeichner). Keinerlei Zusammenhang zwischen diesen Funktionen.

    Ich geb es auf. Ich moderier diesen Thread bloß noch, aber ich werde nicht mehr mitlesen oder helfen.



  • SeppJ schrieb:

    Keinerlei Zusammenhang zwischen diesen Funktionen.

    Ok, Jetzt werde ich Patzig, wieso gibt es da keinen Zusammenhang??? Erklär mir was du damit meinst! Das sind beides Methoden einer Klasse die in der main aufgerufen werden. Was bitte ist da unklar?

    Ich drücke die Maus:

    if(sf::Mouse::isButtonPressed(sf::Mouse::Left))
        {
            sf::Vector2f temp;
            temp.x = window.mapPixelToCoords(sf::Mouse::getPosition(window)).x;
            temp.y = window.mapPixelToCoords(sf::Mouse::getPosition(window)).y;
    
            _PAR._ADDPARTICLE("SPARK", 10, 20, 0, "Images/SPARK.png", temp, 20, 0);
        }
    

    Partike werden hinzugefügt mit:

    if(_Data._Type == "SPARK")
    {
        for(unsigned int i = 0; i < counter; i++)
        {
            unsigned int _Direction = rand()%360;
            _Data._Direction = _Direction;
            _Data._Sprite.setRotation(_Direction);
    
            _AllParticle.push_back(_AllParticle.begin(),_Data);
        }
    }
    

    Während ich Partikel hinzufüge prüfe ich mit

    void PARTICLE::_CheckLifeTime()
    {
    
            for(unsigned int i = 0; i < _AllParticle.size(); i++)
        {
                if(_AllParticle[i]._LifeTime <= 0 )
                {
                    _AllParticle.erase(_AllParticle.begin()+i);
                }
        }
    }
    

    ..ob irgendwo im vector ein element ist welches "Tot" ist und löscht es. Das geschieht aber nur wenn ich keine Elemente hinzufüge. Erst danach, also wenn ich meine maus nicht mehr drücke.



  • Wie, wann und von wem wird _CheckLifeTime aufgerufen?



  • In eine while schleife in der main.



  • grimmreefer schrieb:

    SeppJ schrieb:

    Was meinst du mit gleichzeitig?

    Ich meine während des push_backs.

    grimmreefer schrieb:

    Eisflamme schrieb:

    WAS meinst Du mit gleichzeitig.

    Im gleichen Moment in dem ich den push_back mache.

    Genau diese Art von Antworten ist der Grund, wieso wir nach 2 Seiten gleich weit sind wie am Anfang. Bemüh dich doch wenigstens ein kleines bisschen.

    Eisflamme bringt das Ganze auf den Punkt:

    Eisflamme schrieb:

    Das ist aber auch nicht nötig. Du hast ja ein Problem, was Du lösen willst, wofür Du denkst, dass die Lösung sei eine Gleichzeitigkeit einzubauen. Aber das ist die Sache: Diese von Dir erdachte Lösung ist gar keine gute Lösung.

    D.h. Du solltest beschreiben, wofür Du diese Gleichzeitigkeit brauchst oder: Welches Problem willst Du mit der Gleichzeitigkeit von push_back + Löschen lösen? (das hast Du uns nicht verraten oder es wurde nicht ersichtlich)

    Solange du nicht imstande bist, seine Frage vernünftig zu beantworten, hat das hier keinen Sinn...



  • Und wo wird _LifeTime runtergezählt?



  • Nexus schrieb:

    D.h. Du solltest beschreiben, wofür Du diese Gleichzeitigkeit brauchst oder: Welches Problem willst Du mit der Gleichzeitigkeit von push_back + Löschen lösen? (das hast Du uns nicht verraten oder es wurde nicht ersichtlich)

    Solange du nicht imstande bist, seine Frage vernünftig zu beantworten, hat das hier keinen Sinn...

    Ich brauche diese "Gleichzeitigkeit" damit die "alten" Partikel auch während ich "neue " hinzufüge, gelöscht werden.



  • MFK schrieb:

    Und wo wird _LifeTime runtergezählt?

    if(_Timer.getElapsedTime().asMilliseconds() >= 100)
            {
                _Timer.restart();
    
                for(unsigned int o = 0; o < _AllParticle.size(); ++o)
                {
                    static float value = _AllParticle[o]._LifeTime/2.f;
    
                    _AllParticle[o]._LifeTime -= 0.1f;
    
                    if(_AllParticle[o]._LifeTime  <= value)
                    {
    
                        _AllParticle[o]._Alpha -= _AllParticle[o]._Alpha / _AllParticle[o]._LifeTime;
                        _AllParticle[o]._Sprite.setColor(sf::Color(255,255,255, _AllParticle[o]._Alpha));
    
                    }
                }
    
            }
    

    Läuft auch in der main.


Anmelden zum Antworten