Objekte in Vector schreiben und gleichzeitig löschen



  • 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.



  • Und Dein letzter Post... sorry, aber "wo" wird nicht mit Code beantwortet, von dem unklar ist, in welcher Funktion oder Methode der steht.

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

    Du hast es umformuliert, nicht erklärt, wofür Du das brauchst. Warum musst Du unbedingt neue hinzufügen, während Du etwas löscht?

    Irgendjemand, der die Partikel nutzt, der braucht zu dem Zeitpunkt den aktuellen Status bestehend aus Partikeln + hinzugefügten - gelöschten, richtig? Aber was spricht dagegen Hinzufügen + Löschen trotzdem hintereinander zu machen?



  • Die Game Loop wird sehr oft aufgerufen, du musst es also nicht paralle, gleichzeitig ausführen, sondenr kannst es nacheinander abarbeiten.

    Sollte das bei dir nicht gehen, dann steckt irgendwo anders ein Wurm dirnne, der die Performance runterzieht und in dir das Verlangen weckt, dass du gleichzeitig den Effekt löschen musst o.ä.



  • ghjghjghj schrieb:

    dann steckt irgendwo anders ein Wurm drinnen

    Ohoh, ich denke du könntest recht haben. ich habe sogar eine Vermutung.

    EDIT:

    Ok, du hast recht, das problem liegt ganz wo anders, das heist 2 Tage hier wegen mir verhaut und viele neue "Freunde" für nichts.............

    Das Problem ist das sobald ich anfange Elemente hinzuzufügen das die LifeTime der Elemente nicht weiter runtergezählt wird sondern pausiert bis ich _PAR._ADDPARTICLE nicht mehr aufrufe.



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

    Wofür muss es sein, dass die alten Partikel auch während du neue hinzufügst gelöscht werden? Trau Dich, verrat es uns! (<- und das ist seit Seiten die Frage)



  • Eisflamme schrieb:

    Wofür muss es sein, dass die alten Partikel auch während du neue hinzufügst gelöscht werden? Trau Dich, verrat es uns! (<- und das ist seit Seiten die Frage)

    Wenn ich die Maustaste drücke werden permanent neue Partikel erzeugt, ohne ende, bis ich die taste loslasse. Während ich die neuen Partikel erzeuge sollen nebenbei die alten wieder verschwinden. Die sollen nicht ewig herumfliegen.



  • Aha! Also willst Du während des Drückens der Maustaste gleichzeitig Partikel löschen und hinzufügen. D.h. es müssen nicht gleichzeitig Partikel gelöscht und hinzugefügt werden, SONDERN Du willst nach Abhandlung des EventHandlers Partikel hinzugefügt und gelöscht haben (<- dafür muss das noch lange nicht gleichzeitig passieren).

    Merkst Du, wie bescheuert es ist nur "gleichzeitig" zu schreiben? Du hast auf vielfache Nachfrage nicht präzisiert. Und wie die Präzisierung aussehen könnte, siehst Du im ersten Absatz dieses Posts (^ oben!). Merkst Du, was da an Informationen plötzlich dazukommt? Informationen, die Du uns nicht mitgeteilt hast? (Du hast Mausklick nicht in Verbindung mit gleichzeitig gebracht, niemand kann das so verstehen)

    Was klappt mit:

    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);
            _PAR._CheckLifeTime(); // <-- NEUE ZEILE! 
        }
    

    Denn nicht?



  • So nur für den Fall das es jemanden interessiert, ich habe den Fehler gefunden.

    ich habe den _Timer 2 mal neu gestartet, anstatt nur einmal wie es sein müsste.

    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();
    
    void PARTICLE::_OPERATE(sf::RenderTexture &render)
    {
        if(_Timer.getElapsedTime().asMilliseconds() >= 100)
            {
    
                _Timer.restart();
    
                for(unsigned int o = 0; o < _AllParticle.size(); ++o)
                {
                    static float value = _AllParticle[o]._LifeTime/2.f;
    


  • Eisflamme schrieb:

    Aha!

    Das jemand AHA! schreibt ist für mich ein kleiner erfolg 🙂

    Seis drum, alles erledigt, es funktioniert.

    Das war der schlimmste Thread überhaut(NICHT WEGEN EUCH!!! Alles meine Schuld, will keinen angreifen), BITTE BITTE löscht diesen Schandmal , so das ich das für immer aus meiner Erinnerung löschen kann.

    An alle, es tut mir leid.Und danke für die mühen, auch wenn sie vergeblich waren, oder auch nicht, sonst hätte ich wer weiss wie lange gesucht bis ich den Fehler gefunden hätte.



  • Hast Du meinen Post gelesen und verstanden, was man hätte besser beantworten können?


  • Mod

    grimmreefer schrieb:

    BITTE BITTE löscht diesen Schandmal , so das ich das für immer aus meiner Erinnerung löschen kann.

    Auch wenn ich deiner Einschätzung zustimme, dass dieses hier unter den Top 10 der schlimmsten Threads eingeordnet werden kann, so löschen wir doch grundsätzlich keine ernsthaften Threads. Ich lass es als mahnendes Beispiel für alle, die in den nächsten Tagen das Forum besuchen, stehen. Sobald der Thread auf die zweite Seite rutscht, interessiert sich ohnehin niemand mehr für deine "Jugendsünde".

    Ich hoffe, du hast ein bisschen was gelernt darüber, wie man Probleme schildert und Fragen stellt.


Anmelden zum Antworten