Tipp zu Bewegung mehrerer Zeichen



  • Hallo,

    ich habe wieder ne Blockade, wo ich ab einem Bestimmten Punkt einfach nicht weiter komme. Ich versuche das mal mit einem eigenen Beispiel, was dem Code entsprechen müsste.

    Gegeben ist ein Feld mit x=0 bis x=40. In diesem sollen sich Zeichen bewegen mit der Breite 5. Das erste Zeichen entsteht bei x=40-5. Dann soll es um 5 Richtung x=0 springen.

    Dieser Teil ist schon gelöst:

    for (size_t i=0; i<20 ; i++)
            {
                x -= 5;
                if (x <= 0) x = 40 - 5;
    
                setzeZeichen(x, y, Zeichen[i]);
                etwas_warten();
                löscheZeichen(x, y, Zeichen[i]);
    
            }
    

    Nun soll aber, nachdem das erste Zeichen um 5 gesprungen ist, ein neues Zeichen an der alten Stelle auftauchen. Wenn das erste wieder um 5 gesprungen ist, springt das zweite um 5 und ein drittes taucht neu auf. Dies wiederholt sich, bis das Feld voll ist.
    Nur wird das ganze mit neuen Zeichen (die in einem Container stehen) wiederholt.

    Ich hoffe, ist das einigermaßen verständlich?



  • Ich würd einfach eine allgemeine update Funktion schreiben, die jeden Frame jedes Zeichen um 5 nach oben verschiebt. Sollte die Verschiebung über die Grenzen hinaus gehen, dann wird es stattdessen einfach gelöscht (oder was auch immer du tun willst, auf jeden Fall ist dein Feld ja begrenzt.

    Ebenfalls wird in jedem Frame an einer bestimmten spawn Position ein neues Zeichen eingefügt. Da es eben eingefügt wurde, wird es im nächsten Frame dann wieder, wie alle anderen vorhandenen Zeichen, verschoben.

    "Voll" wird das Feld eigentlich ja nicht werden, da du immer ein Zeichen um 5 verschiebst, d.h. da bleibt immer ein Platz dazwischen.

    So hab ichs jetzt verstanden....

    Das würde ich grafisch meinem Verständnis gemäß so darstellen (etwas verkleinert)

    Zeichen: x, y, z
    | |  | |  | |  | |  |x|  |x|  |x|  |x|  |y|  |y|  |y|  |y|  |z|
    | |  | |  | |  |x|  |x|  |x|  |x|  |y|  |y|  |y|  |y|  |z|  |z|
    | |  | |  |x|  |x|  |x|  |x|  |y|  |y|  |y|  |y|  |z|  |z|  |z|
    | |  |x|  |x|  |x|  |x|  |y|  |y|  |y|  |y|  |z|  |z|  |z|  |z|
    -------------------------------------------------------------------> Zeit
    

    LG



  • Hmm ... vielen Dank. Ich denke, ich verstehe was Du meinst. Auch für die kleine Tabelle. Werde mir das mal durchspielen.



  • Naja es geht ja eigentlich darum, was du meinst, denn du willst ja etwas erreichen und dabei Hilfe erhalten. Dafür müssen aber diejenigen, die dir eventuell helfen könnten wissen exakt was du erreichen willst.

    Eigentlich hatte ich jetzt erwartet, dass du sagst "Ja, genau, dass will ich haben", oder "Neee, diesen oder jenen Aspekt hatte ich anders gemeint".

    LG



  • Sorry, kam noch nichts dazu, es wirklich nachzuspielen, aber eine kleine Zusatzfrage, weil es gerade dort bei mir hängt.

    Da ja jedes Zeichen (für eine Bewegung) neu geschrieben muss, muss es für jedes Zeichen auch seinen x-Wert geben.

    Bei glatten Summen könnte man den einfach entsprechend des Feld jedes mal nehmen. Ich würde aber gerne eine Schleife nehmen für beliebige x-Werte, die aber auch in einem Container stehen.

    Nur wie bekomme ich den (reihenfolgenden) Index für den Container? Kann sein, das dies schon in Deiner Tabelle enthalten ist, muss man nur folgen. Aber wie gesagt, ich konnte es noch nicht durchspielen bzw und heute wohl auch nicht mehr.



  • HarteWare schrieb:

    Eigentlich hatte ich jetzt erwartet, dass du sagst "Ja, genau, dass will ich haben", oder "Neee, diesen oder jenen Aspekt hatte ich anders gemeint".

    So schnell geht das nicht bei mir 😉 Ich muss ja erst Deinen Tipp verinnerlichen und dann für mich übersetzen. Das dauert etwas, sind ja keine direkten Anweisungen, die ich nur eintippen muss.



  • Habe das nun endlich hinbekommen. Bin nie auf einen grünen Zweig gekommen. Hatte versucht, mich auch an Deine Tabelle zu orientieren, nur hatte ich verschwiegen, das die Zeichen verschiedene Breiten haben, weshalb auch eine unterschiedliche Anzahl von Zeichen im Fenster auftauchen können.

    Am Ende hatte ich dann eine "Brute-Force"-Methode angestrebt. Weil es WriteConsoleOutputCharacter() scheinbar nicht stört, beliebige Koordinaten zu bekommen, wollte ich den gesamten Text-string im "Hintergrund" mit absinkenden x-Werten "abbilden". Irgendwelche werden dann schon im Bereich des Konsolenfensters sein. Nur hat man dann ab bestimmten Werten nur einen schwarzen Schirm vor sich.

    Meine "Lösung" war dann, die Ausgabe um einen groben Bereich des Konsolenfenster zu beschränken.
    Und ich muss sagen, für meine Verhältnisse bin ich mit dem Ergebnis zufrieden 😉

    Danke für die Unterstützung 😉

    void charScroller(HANDLE set, std::vector <Char> charMask, std::string text)
    {
        int x = 0, y = 9;
        int x_tmp = x;
        size_t idx = 0, idx_tmp = 0;
    
        while (!kbhit())
        {
            do
            {
                if (idx >= text.size()-1)
                {
                    idx = 0;
                    idx_tmp = 0;
                }
                drawChar(set, x_tmp, y, text.at(idx), charMask, lBlock);
                x_tmp += charMask[size_t(text.at(idx)) - 32].dim_x;
                idx ++;
            }
            while (abs(x_tmp) < Width);
    
            x --;
            if (abs(x) > charMask[size_t(text.at(idx_tmp)) - 32].dim_x)
            {
                x = -1;
                idx_tmp ++;
            }
            x_tmp = x;
            idx = idx_tmp;
        }
    }
    

Log in to reply