kollisionsabfrage -> SDL -> umsetzung?



  • Tipp1: Es gibt Schleifen.
    Tipp2: Deine Tiles haben Positionen, sowie alles in der Scene (sollten zumindest).



  • Apollon schrieb:

    Tipp1: Es gibt Schleifen.
    Tipp2: Deine Tiles haben Positionen, sowie alles in der Scene (sollten zumindest).

    Is ja Hammer! Das würde ich so machen.

    Bye, TGGC (You don't get it and never will)



  • Apollon schrieb:

    Tipp1: Es gibt Schleifen.
    Tipp2: Deine Tiles haben Positionen, sowie alles in der Scene (sollten zumindest).

    kannst du mal mehr von der birne beschreiben anstatt nur zu sagen das sie ne frucht ist? (lol)



  • Was hat das eigentlich mit SDL zu tun?
    Um dein Problem zu lösen solltest du übrigens die Positionen in einer Schleife vergleichen.

    Bye, TGGC (You don't get it and never will)



  • TravisG schrieb:

    Apollon schrieb:

    Tipp1: Es gibt Schleifen.
    Tipp2: Deine Tiles haben Positionen, sowie alles in der Scene (sollten zumindest).

    kannst du mal mehr von der birne beschreiben anstatt nur zu sagen das sie ne frucht ist? (lol)

    Ich kaue es dir morgen vor. OK?



  • ja ich weiss wie ich kollisionsabfragen machen kann mir geht es jedoch darum nicht bei jeder kleinen bewegung 10000000000 abfragen machen zu müssen. ich suche eine methode, in der das programm nicht überprüft ob tile1 jetzt mit tile2 kollidiert sondern in dem das programm überprüft ob tile1 mit IRGENDEINEM tile kollidiert.



  • Dann hör auf hier rumzusülzen und bau ne Schleife in dein Programm, das jedes Tile mit jedem anderen Vergleicht. Wenn du das nicht kannst, solltest du mal ein Grundlagenbuch über Programmierung lesen und die Beispielprogramme daraus verstehen und nachprogrammieren.



  • ChockoCookie schrieb:

    Dann hör auf hier rumzusülzen und bau ne Schleife in dein Programm, das jedes Tile mit jedem anderen Vergleicht. Wenn du das nicht kannst, solltest du mal ein Grundlagenbuch über Programmierung lesen und die Beispielprogramme daraus verstehen und nachprogrammieren.

    das kann ich doch aber wenn ich 100 tiles hab muss ich dann 100 mal das zeugs machen oder gibt es gar keinen anderen weg?^^



  • TravisG schrieb:

    das kann ich doch aber wenn ich 100 tiles hab muss ich dann 100 mal das zeugs machen oder gibt es gar keinen anderen weg?^^

    Die Tiles, die sich nicht schneiden muss man theoretisch nicht testen.

    Bye, TGGC (You don't get it and never will)



  • TGGC schrieb:

    TravisG schrieb:

    das kann ich doch aber wenn ich 100 tiles hab muss ich dann 100 mal das zeugs machen oder gibt es gar keinen anderen weg?^^

    Die Tiles, die sich nicht schneiden muss man theoretisch nicht testen.

    Bye, TGGC (You don't get it and never will)

    hm ich könnte also testen welche tiles sich NICHT schneiden!!! 👍 🤡



  • Ich könnt' Dir den Thread hier empfehlen, in dem gezeigt wurde, daß eine Programmiersprache wie C oder C++ auch das erstellen eigener Funktionen erlaubt, und in dem rapso mir leider die Grundlage zum Trollen nahm... 🤡



  • ok, da du anscheinend wirklich nicht weiter weisst:

    Sagen wir deine Welt besteht aus 100.000 mal 100.000 Pixeln, und deine Sprites sind etwa 4-10 pixel breit bzw. lang. Und du hast von mir aus 1.000 Sprites in dieser Welt.

    1. Ueberlegung
    Mal ganz primitiv ueberlegt: du kommst wirklich nicht drum rum, fuer jedes von diesen Sprites zu testen, ob es mit einem der anderen 999 Sprites kollidiert. Klingt jetzt etwas scheisse (ist es auch!) aber... na ja.... Versuchen wir's mal:
    du wolltest eine Funktion, die dir sagt: stoesst diese Surface mit IRGEND einer anderen Surface zusammen. Nun, lass dir gesagt sein: sowas GIBT ES NICHT. Zumindest nicht in SDL. Meines Wissens auch nicht in Allegro, ClanLib oder sonstigen Libraries. Aber kein Grund zur Verzweiflung, wir sind ja alle Programmierer, sowas koennen wir doch auch selber:

    // angenommen deine Sprites schauen in etwa so aus:
    class Sprite
    {
        public:
            // ich mach jetzt einfach alles public, damit ich nicht so viel zum Schreiben hab ;)
            int x;
            int y;
            int width;
            int height;
    };
    
    // ...
    
    bool isCollidingWithOtherObject(Sprite a)
    {
        // ich nehm jetzt mal an, diese Funktion hat irgendwie Zugriff auf ein array "sprites", in dem alle Sprites des Spieles gespeichert sind
        for (int i = 0; i < N_OF_SPRITES; ++i)
        {
            if (a.x + a.width > sprites[i].x && sprites[i].x + sprites[i].width > a.x)
                return true;
    
            if (a.y + a.height > sprites[i].y && sprites[i].y + sprites[i].height > a.y)
                return true;
        }
    
        return false;
    }
    

    So, fertig ist eine ganz primitive "kollidiert dieses Sprite mit IRGEND einem anderen Sprite"-Funktion. Wobei ich mir die jetzt aus den Fingern gesaugt hab, bin also nichtmal sicher ob die Abfrage so stimmt :D. Aber das kriegst du auch alleine hin.
    Diese Methode ist alles andere als optimal, aber da wir CPUs im Ghz-Bereich haben koennt sie ja durchaus ausreichen. Teste das mal, wenn's wirklich katastrophale FPS gibt (was ich ehrlich gesagt nicht glaube), kannst du's ja mal mit einer 2ten Ueberlegung versuchen:

    2. Ueberlegung (<< das ist das, was dir alle anderen seit Anbeginn dieses Threads sagen wollen)
    Du unterteilst deine Spielewelt in kleinere Sektoren (von mir aus z. B. Quadrate von 1.000 * 1.000 Pixeln) und merkst dir, in welchem Sektor sich ein Sprite befindet. Sprites die sich in verschiedenen Sektoren befinden, koennen garantiert nicht kollidieren. Also brauchst du jedes Sprite nur noch mit den anderen Sprite des gleichen Sektors vergleichen. Wenn deine "Untersektoren" z. B. auch nur ein Zehntel der urspruenglichen Spielewelt darstellen, reduzierst du damit die Anzahl der notwendigen Kollisionsvergleiche auf 1%!

    so, ich hoff jetzt hast du's begriffen, ich geh schlafen... gut n8 :xmas1:



  • danke auf sone antwort hab ich gewartet! 👍


Anmelden zum Antworten