myGully.com

myGully.com (https://mygully.com/index.php)
-   Programmierung (https://mygully.com/forumdisplay.php?f=67)
-   -   [C++] Problem mit 2D Kollision (https://mygully.com/showthread.php?t=2162894)

waldfee0071 15.11.10 00:15

[C++] Problem mit 2D Kollision
 
Ich versuchs mal kurz un knapp zu machen.

Ich programmiere derzeit einen 2D Sidescroller, doch ich habe Probleme damit die Kollision umzusetzen.

Mein Problem schaut nun so aus, dass die 3 Rechtecke/Objecte gezeichnet werden, ebenso wird auch der text ausgegeben, dass die Kollision statt findet, jedoch wird der bool wert für die Kollision nur bei
Code:

obj3.check();
geändert.

Warum das so ist weiß ich nicht ^^

Zitat:

void object::check(){
int ox1=x1; //object x1
int ox2=x2; //object x2
int oy1=y1; //object y1
int oy2=y2; //object y2
float px=x; //player x
float py=y; //player y

if(px>ox1&&px<ox2&&py>oy1&&py<oy2){ //Kollisions abfrage
textprintf(buffer, font, 0, 0, makecol(100,255,125),"Kollision !"); // textausgabe falls kollision - libary spezifisch
col=true;} //bool wert für kollision
else col=false;


if(col==true){
up=false; //bool werte für steuerung
down=false;
left=false;
right=false;}
else{
up=true;
down=true;
left=true;
right=true;}
das ist die funktion der Klasse, die die Kollision erkennt/regelt (lies sich nur per "quote" machen, mit code tag wurde nicht alles angezeigt)

Code:

obj1.ini(0,0,200,200);        // zeichnen der rechtecke/objekte
obj2.ini(200,200,350,500);
obj3.ini(500,200,650,500);
obj1.check();                        // kollisionscheck
obj2.check();
obj3.check();

und das der aufruf in der main funktion.

Ich würd mich echt freuen, falls sich jemand die Zeit nimmt mal einen Blick drauf zu werfen um mich mit der Nase ins Code-Häufchen zu drücken ^^

€dit: so, ich hoffe das bild machts anschaulicher. Bild 1: "player im object" aber bewegung nicht eingeschränkt. Bild 2: "Player im "letzten" object, Bewegung wird wie gewollt eingeschränkt.

http://img14.imageshack.us/f/test1ij.jpg/

PornoPenner 15.11.10 11:11

Ehrlich gesagt ist es ein wenig mühsam Deine Frage zu verstehen.
Was Du also genau willst ist ein wenig schwammig beschrieben.

col ist global.
Und obj3 prüfst Du zuletzt. Daher hat nur die letzte Prüfung Einfluss auf "col".

P.S.: EIn genereller Hinweis: Um Deinen Code sauberer, lesbarer und wiederverwendbar zu machen, solltest Du (logischer) kapseln. In der check()-Methode, die ja besser einen boolschen Wert zurückgeben müsste (aber nicht tut), hast Du Darstellungs-Elemente und weitere Implikationen.

waldfee0071 15.11.10 12:26

Ja, ich lerne nicht großartig nach Büchern/Tutorials. Learning by Doing ^^ Da geht schonmal der en oder andere Fachausdruck / Ordnung verloren.

Zitat:

... hast Du Darstellungs-Elemente und weitere Implikationen.
Darstellungselemente kann ich da keine finden (wenn man mal von dem "Kollision" schriftzug absieht, der nur da ist, ums beim testen mir zu erleichtern zu schauen, ob die Funktion das tut, was sie tun soll)

Zitat:

col ist global.
nein ist col garnich ^^

Code:

class object{
private:
        bool col;
        int x1;
        int x2;
        int y1;
        int y2;
        int player_x;
        int player_y;

public:
        void ini(int,int,int,int);
        void check();
       
        void draw_object();

.......

Mehr, als das ich nun weiß, dass mein Programierstil grausam ist, weiß ich dadurch nun aber auch nicht.

PornoPenner 15.11.10 13:25

Ok, hab übersehen, dass Du Dich ja innerhalb der Klasse befindest.

Aber dennoch verstehe ich nicht, wie man Dir helfen kann.

Warum hat Dein Objekt Instanzvariablen von der Spielerfigur(?) ?
Wozu die Variablen ox1, ox2 etc?

Warum sollte der boolsche Wert "col" bei allen Objekten auf true stehen, wenn Deine Figur nur mit einem Objekt koolidiert?

Also, was willst Du genau von uns und was soll der Code genau machen?
Wie sieht die Fehlersituation aus?

waldfee0071 15.11.10 13:53

Zitat:

Warum hat Dein Objekt Instanzvariablen von der Spielerfigur(?) ?
Da die Funktion die Kollisionsabfrage regelt, werden die Koordinaten der Spielfigur mit der der dergestellten Objecte verglichen.

Zitat:

Wozu die Variablen ox1, ox2 etc?
ox1,ox2,oy1,oy2= eckpunkte des dargestellten objectes, bzw der Rahmen, der die Kollision hervorrufen soll (Bounding Box)

Zitat:

Warum sollte der boolsche Wert "col" bei allen Objekten auf true stehen, wenn Deine Figur nur mit einem Objekt koolidiert?
Der wert col soll bei jeglicher Kollision auf true stehen, damit ich darüber die bewegung einschränken kann, unabhängig davon, mit welcher box man kollidiert.

Zitat:

Also, was willst Du genau von uns und was soll der Code genau machen?
Der Code soll am ende wie schon gesagt bei Kollision den boll wert "col" auf true setzen. Wenn dieser = true, dann wird die bewegung eingeschränkt, bzw mithilfe von temporären variablen die position zurück gesetzt -> solide wand, die nicht zu durchqueren ist.

Zitat:

Wie sieht die Fehlersituation aus?
Immer noch keine Lösung Q.Q

Hoffe diesmal ist es verständlicher :D

PornoPenner 15.11.10 14:09

Objekte dürfen nur Instanzvariablen haben, die zu dem Objekt gehören.
Die Koordinaten des Spielers sind keine Eigenschaften des Objekts.

Die anderen booleschen "col"-Werte können gar nicht auf true stehen, wenn nur eines der Objekte kollidiert.
Da es ja keine globale Variable ist sondern eine Instanzvariable.

Wenn Du es aber so haben willst, dann darf col keine Instanzvariable sein oder die überdenkst nochmal Deine gesamte Architektur. z.B. wäre es vielleicht angebracht ein Player-Objekt zu erzeugen, diesem die Umgebung zu übergeben und eventuelle Kollidierung zu überprüfen. Diese Objekt könnte dann eine einzige "col" Instanzvariable besitzen.

waldfee0071 15.11.10 14:33

Zitat:

Die Koordinaten des Spielers sind keine Eigenschaften des Objekts.
Die Koordinaten des Spielers sind in globalen Variablen definiert. Sie werden lediglich (zur Abfrage der Kollision) an 2 Instanzvariablen übergeben. Gibt sicherlich schönere Lösungen, da hast du recht. Sollte jedoch funktionieren.


Selbst wenn "col" eine globale variable ist besteht das Problem ohne jegeliche Änderung weiter.

Das was ich nur absolut nicht verstehe ist:
Wenn sich der Spieler innerhalb eines der drei Objectes befindet (also die if Bedingung zutrifft) wird der text(rot) ausgegeben.
Allerdings trifft der rest der Anweisungen nur auf das zu letzt aufgerufene object zu. Obwohl nun alle bool Werte für die Kollision global sind.

Code:

          if(px>ox1&&px<ox2&&py>oy1&&py<oy2){        // bounding box
                textprintf(buffer, font, 0, 0, makecol(100,255,125),"overlapping bitmaps !");
                col=true;
                up=false;                        //bools for controling elements
                down=false;
                left=false;
                right=false;}               
          else col=false;                        //bool for collision

ohne " else col=false; " wird durch jedes object die bewegung eingeschränkt (und nicht mehr zurück gesetzt). Also wird tatsächlich der bool wert (egal ob instanziert oder global) mehrfach gesetzt und erst der letzte aufruf der check funktion "zählt". Ich hab echt keinen Plan wie ich das umgehen kann Q.Q

PornoPenner 15.11.10 18:06

Genau sowas passiert, wenn man einfach drauf los programmiert :)
Wie Du schon sagtest, Learning by Doing...

Jetzt hast Du gelernt, dass auch bei kleinen Programmen Planung eine wichtige Rolle spielt...

Ohne den gesamten Code kann ich aber leider auch nicht "debuggen". Dabei ist mir immer noch nicht klar, was das eigentliche Problem genau ist... (kann dies nur halbwegs erraten...)

waldfee0071 15.11.10 19:46

Ich befürchte, mit dem gesamten Codek annst du auch nicht viel anfangen, weils auf die 2D Lybary Allegro ausgelegt ist, aber wenn du unbedingt was zum grinsen haben willst ^^

[Link nur für registrierte und freigeschaltete Mitglieder sichtbar. Jetzt registrieren...]

ist noch alles dort hingeschrieben, wo ich grade dran gedacht hab, dass man es machen könnte, also teils noch functionen, die 12 dinge auf einmal regeln sollen ^^ Würde mich aber trotzdem echt freuen, wenn du mal nen Blick drauf werfen könntest, denn ich verzweifel langsam an dem ding :(


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:47 Uhr.

Powered by vBulletin® (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.