Collision in der Win32-Console



  • 1.Es gibt ja schon viele z.B. Snake Beispiele mit einer Spielfeldrand Collision.Aber was ist so die beste Methode ?
    2.Wie macht man das am besten wenn man nicht nur den Rand als nicht passierbar machen möchte, sondern auch Objekte auf dem Spielfeld?Einene Container wählen und alle Coordinaten des Objekts reinspeichern und bei jeder Bewegung der Spielfigur einen Vergleich durchführen ?



  • Speed reicht auf alle Fälle für die vier Randabfragen und ein Objekt pro Hindernis im Container.

    Edit: Nicht allgemein, aber bevor man durch irgendwelche Tricks/Hacks die Performance zu heben versucht sollte man schon Performanceprobleme haben.

    MfG SideWinder



  • Also es ging mir jetzt eher weniger um die Performance sondern eher darum, ob man das überhaupt so macht.



  • Ja, hört sich sehr vernünftig an. Algorithmis am Interessantesten ist wohl noch die Prüfung auf Kontakt mit der Schlange selbst.

    MfG SideWinder



  • Algorithmis am Interessantesten ist wohl noch die Prüfung auf Kontakt mit der Schlange selbst.

    Definitiv, doch ich denke ich belass es erstmal bei einem Char.
    Eine andere Sache :
    Ich habe hier gerade einen Problem und weiß nicht wie ich es beheben kann.

    bool collision_detection(std::vector<int> &coords, int current_x){
    	for(unsigned int i = 0; i < coords.size(); i++) {
    		if(current_x != coords[i]){return false;}
    		else if(current_x = coords[i]){return true;}
    	}
    }
    

    Das geht soweit so gut, doch wenn ich z.B. sagen wir mal eine Burg( 🤡 ) habe

    #   #
    #####
    #####
    

    und alle Coordinaten in den vector schreibe, hört die for schleife ja beim aller ersten Treffer auf.Ich weiß gerade echt kein bisschen wie ich das verbessern kann.Ich dachte mir schon dass man da dann mit && operator noch mehr zu erfüllende Parameter einfügen kann, aber man weiß ja nie wie viele Coordinaten in dem Vector gespeichert sind und so fällt das auch raus.Oder vielleicht nochmal eine for schleife außenrum legen die mit zählt, wie oft true zurück gegeben wurde und wenn die zurückgegebene Zahl der Menge an Elementen im Vector entspricht gibt die eigentliche Funktion true zurück?



  • Ich verstehe deinen Algorithmus nicht ganz, wieso prüft er nur auf die x-Koordinate?

    // hab mal das COORD aus windows.h genommen
    vector<COORD> obstacles;
    

    In diesem vector stehen für die Burg jetzt alle 12 Koordinaten. Du kannst den vector nun inkrementell durchgehen und prüfen ob deine Spielfigur die selbe Position wie irgendeine COORD im vector hat, falls ja => Boom. Falls bis zum Ende der Schleife keine Übereinstimmung gefunden wurde => Ok.

    MfG SideWinder



  • Ok hab gerade selbst einen fehler in der schleife entdeckt.Ich tüftel nochmal kurz dran und zeigs dir dann



  • Ich wollte ne dynamische funktion draus machen :

    //EDIT:
    bool collision_detection(std::vector<int> &coords, int &x_y){
    	int _true = 0, _false = 0;
    	for(int j = 0; j < coords.size(); j++) {
    		if(x_y != coords[j]){ _false =+ 1;}
    		else if(x_y = coords[j]){_true =+ 1;}
    	}
    if ( _true > 1 ) {return true;}
    else{return false;}
    }
    

    Dann später könnte man das ganze so machen

    int x,y;
    	std::vector<int> col_dec_x;
    	col_dec_x.push_back(3);
    	col_dec_x.push_back(2);
    	col_dec_x.push_back(12);
    
    	x = 3;
    	if(x < 13 && collision_detection(col_dec_x, x) == false) {
    		std::cout << "kein col";
    	}
    	if(x < 13 && collision_detection(col_dec_x, x) == true) {
    		std::cout << "col";
    	}
    

    Ist noch nicht getestet, aber ich hab das jetzt mal so hingeschrieben wie ich mir das gedacht habe, wie es gehen könnte ⚠



  • So etwa ?

    std::vector<int> Burg;
    Burg.push_back(...);
    for( int i = 0; i < Burg.size(); i++) {
    if( Player.posX == Burg[i] || Player.posY == Burg[i]){
    Kollision erkannt
    return true;
    }
    }
    return false;
    


  • Zum letzten Beitrag: Ja, bis auf && statt || im if. Es muss x UND y passen damit die Schlange kollidiert.

    MfG SideWinder



  • Hast recht, war mein Fehler.

    bool collision_detection2(std::vector<int> &Object,int &posX,int &posY) {
    for( int i = 0; i < Object.size(); i++) {
    	if( posX == Object[i] && posY == Object[i]){
    		return true;
    	}
    }
    return false; 
    }
    

    Perfekt, geht wunderbar.
    Vielen Dank SideWinder 😉



  • schon erledigt



  • [url]http://coretechteam.co.funpic.de/DATA/Text based game.exe[/url]
    Die Kollision by zu vielen elementen ist noch gebuggt.Eig. wollte ich das auch garnicht so machen wie es bis jetzt ist, andererseits wäre vielleicht einer container angebracht 😕 Das ganze dann in diesem Format speichern 'x-pos y-pos elementname' und die kollision ist für jedes element getrennt



  • Also für eine Kollisionsabfrage in der Konsole finde ich das zu aufwändig. Ich würde einfach feststellen, meine Figur möchte die Koordinate x,y betreten, also lese ich x,y aus und ermittele, was sich dort befindet ... ein freier Platz oder irgendein anderes Objekt oder Bestandteil eines anderen Objektes ...



  • Auch interessant, aus dieser Perspektive hab ich das noch nicht gesehen.Morgen werd ich mir das auch mal aneignen.Danke