KollisionsAbfrage..... und jetzt?



  • Ja hi, ich wollte eine KollisionsAbfrage für mein (2d)Game Programmieren, ich habe mir also folgenden Code zurechtgelegt

    bool IsKolli;
    bool kollision(objekt objekt1,objekt objekt2) 
    {
      if (objekt1.x > objekt2.x + objekt2.breite) IsKolli = false;
      if (objekt1.y > objekt2.y + objekt2.hoehe) IsKolli = false;
      if (objekt2.x > objekt1.x + objekt1.breite) IsKolli = false;
      if (objekt2.y > objekt1.y + objekt1.hoehe) IsKolli = false;
      IsKolli = true;
    return IsKolli;
    }
    

    Soweit müsste das ja stimmen.
    Doch was jetzt soll ich einfach die Entsprechenden Tasten Blokieren?
    bei mir sieht das jetzt so aus :

    Kollision(ship , Station);/*Parameter stimmen nicht, ich weis, aber unbedeutend für das hier*/
    if (keystate[SDLK_LEFT] )
    	{
    	if (ship.dir == LINKS &&  IsKolli == true)
    	{}
    	else 
    	{
    		ship.x -= (100 * frametime)/ 1000;
    		ship.dir = LINKS;
    	}
    }
    if (keystate[SDLK_RIGHT])
    {
    	if (ship.dir == RECHTS &&  IsKolli == true)
    	{}
    	else 
    	{
    		ship.x += (100 * frametime)/ 1000;
    		ship.dir = RECHTS;
    	}
    }
    //usw, das erspare ich euch jetzt mal...
    }
    

    Doch wenn ich das Programm starte, mird mir das schiff willkürlich blockiert... Keine ahnung was ich Falschgemacht habe....
    THX an alle, die sich Gedanken machen...



  • bool IsKolli;
    bool kollision(objekt objekt1,objekt objekt2)
    {
      if (objekt1.x > objekt2.x + objekt2.breite) IsKolli = false;
      if (objekt1.y > objekt2.y + objekt2.hoehe) IsKolli = false;
      if (objekt2.x > objekt1.x + objekt1.breite) IsKolli = false;
      if (objekt2.y > objekt1.y + objekt1.hoehe) IsKolli = false;
      IsKolli = true;
    return IsKolli;
    }
    

    Bei dieser Funktion wird immer true zurückgegeben 😉
    Du könntest isKolli = true; vor die vier if Abfragen setzen



  • Du bist nicht der Kumpel von Debugger, oder? 😎

    Bye, TGGC (Der Held bei Dir!)



  • Hmmmm, das muss mir wohl irgendwie entgangen sein.....
    Thx für die Hilfe.

    @TGGC = was jemnaden, der DEGBUGGER heisst kenn ich nicht ^^

    aber ein ´Problem hab ich jetzt noch : wenn ich gerade auf ein Object zufliege, wird das geblockt, aber "schräg" also mit 2 Richtungstasten kann ich durchfliegen. wie kann ich das verhindern?



  • ich würde, wenn du mit irgendwas kollidierst, deine bewegungsgeschwindigkeit auf 0 setzen, dann bewegst du dich nämlich cniht mehr. und bei jedem frame vor dem bewegen testen, ob du mit irgendwas kollidierst, dann kannste speed auf 0 setzen und fertig.



  • Ich hätte den Code so geschrieben:

    bool kollision(objekt &objekt1,objekt &objekt2)
    {
      if (objekt1.x > objekt2.x + objekt2.breite) return false;
      if (objekt1.y > objekt2.y + objekt2.hoehe) return false;
      if (objekt2.x > objekt1.x + objekt1.breite) return false;
      if (objekt2.y > objekt1.y + objekt1.hoehe) return false;
    
    return true;
    }
    

    Dann sparst du dir ne Variable (die du am besten eh lokal und nicht global anlegen solltest) und du gehst nicht unbedingt alle if-Anfragen durch, wenn die Funktion schon vorher zurückspringt. Du kannst die if-Anfragen natürlich auch mit || verknüpfen. Achja, und die Objekte als Referenz übergeben.



  • THX für alle Antworten
    @noebef : Wie kann ich dann abfragen, ob es true oder false ist?
    @ Maxi : eigentlich ja ne recht gute Idee, doch leider hab ich (9te Klasse neusprachliches Gym) keine Ahnung, wie ich sowas realisieren soll...
    schau dir meine Bewegungsfunktionen an(erster Beitrag), das war das einzige,was ich mir bis jetzt überlegt habe. Wenn du mir erklärest, wie ich sowas einbauen kann, mach ichs gerne ^^.



  • Laguna schrieb:

    @noebef : Wie kann ich dann abfragen, ob es true oder false ist?

    Ahhh, nein. Ich will STERBEN!!!

    Bye, TGGC (Der Held bei Dir!)



  • Du könntest schreiben

    bool isKoll = false;
    
    bool kollision(objekt &objekt1,objekt &objekt2)
    {
      if (objekt1.x > objekt2.x + objekt2.breite) return false;
      if (objekt1.y > objekt2.y + objekt2.hoehe) return false;
      if (objekt2.x > objekt1.x + objekt1.breite) return false;
      if (objekt2.y > objekt1.y + objekt1.hoehe) return false;
    
    return true;
    }
    
    isKoll = kollision;
    


  • @laguna ein gut gemeinter tipp: tu dir und uns allen bitte den gefallen, und arbeite noch ein halbes jahr mit der konsole. ein guter anfang währen die aufgaben des bundeswettbewerb informatik, www.bwinf.de.



  • Hey Laguna an welchem spiel proggst denn gerade??
    Und wie machste das mit der Grafik??



  • TGGC schrieb:

    Laguna schrieb:

    @noebef : Wie kann ich dann abfragen, ob es true oder false ist?

    Ahhh, nein. Ich will STERBEN!!!

    Bye, TGGC (Der Held bei Dir!)

    Dann geh halt sterben!!! 👎



  • Laguna schrieb:

    bool IsKolli;
    bool kollision(objekt objekt1,objekt objekt2);
    Kollision(ship , Station);

    gnarf.. daraus, und den folgenden fragen würde ich vermuten, daß du besser ERST programmieren an sich lernst und DANN versuchst spiele zu machen. wozu hat deine funktion einen rückgabewert, wenn du ihn nicht benutzt? wozu das grauenhaft umständliche gefummel mit einer globalen variable?

    die schulbildung hat damit wenig bis gar nichts zu tun, zumal erfahrungsgemäßg über 90% des info-unterrichts an schulen für die tonne ist, weil der lehrer meistens weniger ahnung hat als die hälfte seiner schüler oder den leuten "programmieren" beigebracht wird, indem sie irgendwas mit delphi oder vb zusammenklicken, ohne zu kapieren (geschweige denn erklärt zu bekommen), was dabei eigentlich wirklich passiert.

    dein code benutzt den wert genau einmal, also kann da auch gleich
    if (ship.dir == LINKS && Kollision(ship , Station))
    stehen.

    ein ==true ist überflüssig.. wenn die linke seite sowieso true ist, dann muß man nicht zusätzlich prüfen, ob der vergleich mit true ein true ergibt, außerdem kann man sich bei bedingungen drauf verlassen, daß sie von links nach rechts laufen und abbrechen, sobald das ergebnis klar ist (sprich, ist dir NICHT links, dann wird der rest erst gar nicht getestet).

    würde das ganze mehrmals gebraucht, dann steht da eben:
    bool isKoll = Kollision(ship , Station);

    aber isKoll bleibt auf den ort beschränkt, wo es auch gebraucht wird. und selbst wenn einem sauberer code egal ist, dann spricht die performance auch dafür.

    ship.x -= (100 * frametime)/ 1000;

    erm... was spricht gegen frametime * .1 ? divisionen sind pfui (auch wenn die einen einmal pro frame nicht umbringen).

    außerdem prüft deine funktion ob VOR der bewegung irgendwas überschneidet, was eher weniger sinnvoll ist. du willst ja letztlich wissen, OB du die bewegung überhaupt durchführen kannst (die neue position prüfen ist minimal besser, ganz sauber wäre es genau zu bestimmen ob und an welchem punkt der bewegung kollidiert wird).

    und deine schräge bewegung.. wie sieht denn ship.dir überhaupt aus, wenn du dich schräg bewegst? mit etwas raten kann ich dir das sagen:

    du willst nach links oben:

    dir ist links, links ist gedrückt, kollision, nichts passiert.
    dir ist links, oben ist gedrückt, kein test, es bewegt sich, richtung wird oben.

    nächster frame:
    dir ist oben, links ist gedrückt, kein test, bewegung, richtung wird links.
    dir ist linke, oben ist gedrückt, kein test, bewegung, richtung wird oben.

    kurz: die ganze methode KANN nicht funktionieren.

    nur zur verwirrung (und absichtlich mit potentieller falle):

    vec2 oldpos(ship.pos);
    ship.pos += vec2(key[R] - key[L], key[U] - key[D]) * frametime * .1;
    if (kollision(...)) ship.pos=oldpos;



  • stealth00 schrieb:

    TGGC schrieb:

    Laguna schrieb:

    @noebef : Wie kann ich dann abfragen, ob es true oder false ist?

    Ahhh, nein. Ich will STERBEN!!!

    Bye, TGGC (Der Held bei Dir!)

    Dann geh halt sterben!!! 👎

    dann soll er dich mitnehmen-.-



  • Man, seid ihr wieder mies drauf... 😎

    Bye, TGGC (Der Held bei Dir!)



  • Anstatt ihm zu helfen regt sich jeder auf wie dumm dass seine
    Frage ist!! Hilfe hätte er wohl nötiger!! 😋

    PS: Hey Laguna ich bin auch in der 9nten!!



  • ICh liebe Smileys!!!!

    🙂 😃 😉 😞 :p 😡 🙄 😮 😕 🕶

    Tschuldigung für den Spam.



  • mEeX schrieb:

    Tschuldigung für den Spam.

    Kein Problem! 🤡 👍



  • Hey, er ist zurück! 😎

    Bye, TGGC (Der Held bei Dir!)



  • mEeX schrieb:

    Anstatt ihm zu helfen regt sich jeder auf wie dumm dass seine
    Frage ist!! Hilfe hätte er wohl nötiger!! 😋

    ja, hilfe was das programmieren ansich angeht, er ist einfach noch nicht weit genug für ein spiel.

    Und im spiele&grafik wird definitiv nicht das programmieren beigebracht 🙂


Anmelden zum Antworten