problem mit klassen



  • das problem, kurz

    der übergabe / bzw. der erwartete übergabewert stimmt nicht

    also
    void steuerung(vector<cSchuss*>) stimmt

    nur übergeben einfach ohne & ?!



  • Nein stimmt nicht. Wir haben uns ja auf eine Referenzübergabe geeinigt:
    [cpp]
    // Deklaration einer Funktion die einen Parameter als Referenz übernimmt
    void steuerung (vector<cschuss*>& shots)

    // Im Gegensatz zu Zeigern sind Referenzen andere Namen für bestehende Variablen
    // und nicht Zeiger auf Adressen im Speicher, daher haben wir auch nicht die
    // Speicheradresse der Variable mitzuteilen sondern die Variable selbst:
    steuerung(shots);
    [/cpp]

    Edit: Ein paar Enter eingefügt damit der Thread nicht horizontal über 3 Bildschirme verläuft.

    MfG SideWinder



  • ahhh *leucht* ... mir ging ein licht auf 😃
    klar, so isses ^^
    vielen dank

    jetzt hab ich nur noch en verarbeitungs problem, also das mit logik() un grafik() .. weil er arbeit den nächsten schuss erst ab, wenn der vorige fertig is ... aber das is doch, hoffentlich, leicht zu beheben

    also, nochma danke 🙂



  • ok, nach langen versuchen den fehler zu finden, muss ich mich doch noch ma hier melden ...

    und zwar, habe immer noch das problem, das die schüsse nacheinander abgearbeitet werden ...
    hier der code

    if(!shots.empty())
            {
                    vector<cSchuss*>::iterator iter = shots.begin();
                    while(iter != shots.end())
                    {
                        if((*iter)->y_pos_schuss > 2)
                        {
                           (*iter)->logik();       
                           (*iter)->grafik();
                        }    
                        ++iter;
                    }
            }
    

    das ganze befindet sich in der spiel schleife ....

    achja, noch eine kleine sache, wie kann ich einzelne / den kompletten vector löschen ?!
    mit ?

    delete (*iter);
    


  • ich verzweile fast ... 😃

    bekomms einfach nicht hin, das die schüsse gleichzeitig abgearbeitet werden ....
    irgendwie komm ich nich auf den fehler ...



  • 1. Natürlich werden alle Schüsse hintereinander abgearbeitet -> am PC gibt es (außer du hast HT-Technologie, zwei Prozessoren, ...) keine Gleichzeitigkeit. Du kannst im besten Fall erreichen, dass alle Schüsse auf Basis der gleichen Daten berechnet werden und die jeweils neuen Daten erst *nach* dem Durchlauf zählen.

    2. Den kompletten Vektor leeren kannst du mit:

    vec.clear();
    

    Achtung: In deinem Fall hast du dynamisch erzeugte Objekte in deinem Vektor, das heißt du musst noch für jedes Element vorher delete aufrufen:

    vector<cschuss*>::iterator iter = shots.begin();
    while(iter != shots.end())
    {
        delete *iter;
        ++iter;
    }
    

    3. Einzelne Elemente kannst du über den Iterator löschen (auch hier normalerweise *kein* delete notwendig, da die Resorucen vom Vektor selbst freigegeben werden -> da deine Resourcen aber auf weitere Resourcen zeigen musst du wiederrum selbst Hand anlegen)

    // Bei dir also:
    delete *iter;
    iter.remove();
    

    MfG SideWinder



  • ok, danke

    aber hier nochma (mit kommentaren / fragen)

    if(!shots.empty()) // also, wenn "shots" nicht leer ist
            {
                    iter = shots.begin();  // iter auf anfangsposition setzen
                    while(iter != shots.end()) // solange nicht das ende des vectores erreicht wird
                    {
                        if((*iter)->y_pos_schuss > 2) // der schuss soll nich höher als y = 2 fliegen
                        {
                           (*iter)->logik(); //positionsberechnung für den aktuellen schuss      
                           (*iter)->grafik(); //zeichnen des aktuellen schusses
    
                        }    
    
                        ++iter; //aktuellen schuss ändern
                    }
            }
    

    so, die funktionen logik() und grafik() sind aber so aufgebaut, das sie pro aufruf, die position nur um 1 verändern, un dem entsprechend müsste das programm doch so laufen:

    1. schuss
    logik()
    grafik()

    ++iter -> 2.schuss
    logik()
    grafik()

    usw.

    also, müsster er doch eigetnlich alle schüsse "gleichzeitig" ausführen ...



  • *topic wieder hochpush*
    sry , aber hab immer ncoh keine lsg gefunden ....



  • *push* (sry)



  • will ja nich nerven ... aber kann mir keiner sagen warum die schüsse nicht richtisch abgearbeitet werden ?! für infos siehe oben bei den code mit kommentaren ...



  • Ja er führt alle Schüsse in dieser Schleife aus. Danach sind alle am selben Stand, ich verstehe aber noch nicht ganz *was* genau nicht ausgeführt wird. Tatsächlich gleichzeitig ist ja auf einem Single-CPU-System nicht möglich 😕

    MfG SideWinder



  • ja das mit dem gleichzeitig is mir schon klar ... ( doch isses, mit threads , oder ?)
    aber egal ... es muss ja net gleichzeitig sein ...

    das problem ist, das er den schuss immer erst berechnet wenn der vorherige oben angekommen ist .. sie fliegen nicht "gleichzeitig"

    es is glaubig einfacher wenndu dir die exe ma anschaust , hier das game

    musst aber die konsolen größe auf 80 x 50 umstellen ....

    http://mitglied.lycos.de/digitalworld/spacewars.rar



  • dabei siehste auch gleich noch den 2. aktuellen bug ... das gegnerschiff bleibt stehen wenn man schiesst ^^



  • wollts ma wieder hochschieben ... vllt kann mir jetzt ja jdm helfen 🙂



  • auf einen letzten versuch .... *push*


Anmelden zum Antworten