2D Bild bewegen, Pixel Problem :)



  • Dann nimm doch die Werte die du hast alle mal 10, dann kommst immer auf nen schönen wert. Und es sollte immer noch recht schön aussehn (die bewegung also flüssig).



  • Mortal2006 schrieb:

    Aber wie bewege ich mich denn mit der einheit 0,7 ? 😉 geht ja irgendwie nicht ganz oder 😃

    Naja, du kannst ja die Position und Richtung als Fliesskommawerte (floats) speichern und sie nur beim rendern auf integer runden.
    Oder wo liegt das Problem?



  • Naja, es ist so das die bewegung bei mir doch eher langsam ist 😉
    Sprich ich bewege mich eigentlich nur 2-3pixel pro sekunde ...
    So das ich mich in einem Schritt ja nur von z.b. (1/1) zu (1/2) oder (2/2) bewege ... da fällt *10 nehmen ja irgendwie wech...
    Beim runden ist es erstmal so das ich im moment nicht weiss wie es geht 😉 was ja nicht das problem sein sollte, und dann das die bewegung glaub ich ziehmlich eckig ist dann oder ? Wobei ich das mal testen werde... Hab aber erstmal noch ne eigene idee die ich "gleich" mal Probieren werde 🙂



  • Mortal2006 schrieb:

    Beim runden ist es erstmal so das ich im moment nicht weiss wie es geht 😉

    Naja, "runden" ist eigentlich nicht ganz der richtige Ausdruck, ich dachte bloss es wäre dann einfacher zu verstehen. Du musst einfach nur den Positionswert von einer Fliesskomma-Zahl in eine Integer-Zahl casten. In C++:

    float position[2]; // Die Fliesskomma-position
    // position updaten
    int RenderPos[2]; // Die Position, an der das Bild später angezeigt wird
    RenderPos[0] = static_cast<int>(position[0]);
    RenderPos[1] = static_cast<int>(position[1]);
    

    und dann das die bewegung glaub ich ziehmlich eckig ist dann oder ?

    Nein, wüsste jetzt nicht warum...



  • Jo ansich ist deine idee echt cool 🙂
    Ich habs jetzt auch in Code umgesetzt ..

    xer=1/(sqrt(1+steigung*steigung));
    yer=sqrt(1-(xer*xer));
    
    schiffx=schiffx+xer;
    schiffy=schiffy-yer;
    
    posi.x = static_cast<int>(schiffx);
    posi.y = static_cast<int>(schiffy);
    

    schiffx und schiffy ist die float position vom 2D Bild.
    Der Bewegen Funktion übergeb ich dann die steigung und daraus wird dann halt berechnet wie weit es sich halt in x und y richtung bewegen soll.
    Ich berechne das so das der vektor halt immer genau 1 ist damit die geschwindigkeit konstant ist...
    Leider sieht das jetzt doch scheisse aus 😃 sprich das Bild bewegt sich sehr eckig ... kommt das vom Runden oder kommt das weil ich scheisse rechne ? 😃

    Edit: So eben nochmal getestet, kommt anscheinent ganz auf die steigungen an und so ... hmm ... morgen mal gucken wie es ausschaut wenns komplett fertig ist ... falls wer trotzdem noch verbesserungsvorschläge hat immer her damit 😃

    Und danke schonmal ! 👍



  • Tja, ich schätze, bei so kleinen Positionsveränderungen wirst Du die Eckigkeit nicht ganz rausbekommen. Ist ja auflösungsabhängig. Du könntest nur
    a) die Auflösung höher stellen (wenn das bei Deinem Programm geht)
    b) wie schon vorher erwähnt die Schrittweite vergrößern.

    Aber um nochmal auf Dein Richtungsproblem zurückzukommen:
    Du kannst die Änderung der x- bzw. y-Koordinaten auch direkt mit nem Winkel berechnen:

    xer = sin(w);
    yer = cos(w);
    

    Das liefert Dir immer hübsche Werte von 0 bis 1, je nach Winkel und der zurückgelegte Weg (sqrt(xer*xer+yer*yer)) ist immer normiert auf 1. Wenn Du nun eine größere Schrittweite brauchst, multiplizierst Du diese Werte einfach mit dem entsprechenden Faktor.



  • Na super da denk ich mir sowas tolles aus und dann geht das sooo einfach 😃
    Was genau gibt mir denn die cos und sin Funktion dann eigentlich wieder das das so genau passt ?
    Hmm ... wobei wenns cos und sin heisst wohl genau das 😃
    Mir leuchtet zwar im moment nicht ein warum das genau passt... mist hab das Jahr wo das in Mathe dran kam wohl komplett verdrängt 😉

    Edit: Das scheint nur bei 45 genau zu funzen ... kaum geb ich 46 an bewegt es sich komplett anders...



  • Echt? Moment, ich prüf das nochmal. Hatte es jetzt nur aus dem Stehgreif zusammengebastelt, sollte aber eigentlich gehen.
    Ich schau nochmal nach, wie ich es realisiert hatte. M



  • das problem ist, dass die funktionen nicht grad, sondern irgendwas anderes nehmen, dessen name mir jetzt nicht mehr einfällt. das andere sind soweit ich mich erinnern kann werte zwischen 0 (=0°) und 2*pi (=360°). ich bin mir nciht mehr ganz sicher.
    geloescht



  • Exakt. Hab ich auch gerade in meinem Programm gesehen.
    Du musst Bogenmaß nehmen, nicht Gradmaß. Also wie "geloescht" schon sagte, 0°=0, 360°=2PI.

    Daraus ergibt sich:

    bg = PI * w / 180;
    xer = sin(bg);
    yer = cos(bg);
    

    So, jetzt sollte das aber gehen.


Anmelden zum Antworten