Kollision tritt nie ein ?

BDG

Aktives Mitglied
Hey leute.
bei mir tritt eine Kollision nie ein, die ganz deutlich wahr ist ...

Hier mal der Code :

(Figur.java)
Java:
if (space)
		{
			y -= jumpValue;
			jumpValue -= gravitation;
			
			for (Rectangle block : stone)
	        {
				if (block.contains(x, y, 40, 70))
				{					
					space = false;
					jumpValue = 10;
					
				}
				       		
	        }
			
		}

Hier werden die Blöcke erzeugt :

(Tilemap.java)
Java:
for (int i = 0; i < map_hoehe; i++)
        {
           
            for (int j = 0; j < map_breite; j++)
            {
               
                switch (tilemap1[i][j])
                {
                    case 0 :  // neeeeee ! Aber nicht doch ! 
                    
                        break;
                    case 1 :   //Wand      
                      stone.add(new Rectangle(tile_breite * j, tile_hoehe * i, 20, 20));
                        break;
                    case 2 :   //später...    
                    
                        break;
                    default:
                        break;
                }

            }
        }


Und hier werden die lassen erzeugt :

Java:
tilemap = new Tilemap();
	
		spieler = new Figur(this, tilemap.stone);

Ist soweit schon was falsch ?

Vielen Dank für eure Hilfe^^
 
an so wenig Code ist auch wenig zu erkennen,
aber allgemeiner Tipp für jedes Problem, sicher schon bekannt, aber da nichts anderes zu schreiben ist:
loggen, loggen, loggen!

prüfe nach ob der Kollisionscode überhaupt dran kommt,
gib am Anfang x, y, space, jumpValue aus,
gib das neuberechnete y aus,
gib die Anzahl Rectangle der Liste aus,
für jedes Rectangle gib dessen Position aus und das Ergebnis der contains-Methode

Meilenstein:
wird die Kollision an der erwarteten Stelle erkannt, aber danach geht es falsch weiter?
oder funktioniert contains nicht wie gewünscht?

je nachdem die Positionen der Rectangle/ die Rechnung der contains-Methode genauer prüfen
oder eben der Ablauf der nächsten Bewegungen usw.

alles loggen, alles prüfen -> alles wissen 😉
 
Falls du überhaupt nicht zurecht kommst, dann sieh dir bitte einmal das Quaxli Tutorial an.
Da wird eigentlich alles relevante perfekt erklärt und lässt sich auf eigene Spiele übertragen.
 
ich hab mir den Code incht direkt angeguckt aber kann es sein, dass bei
Java:
(block.contains(x, y, 40, 70)

dann y evtl. dazwischen ist ? also der Typ sozusagen nicht genau an y springt, sondern in den Block hinein und die Koordinaten dann irgendwie mitten im Block liegen?

weil so prüfst du ja nur, ob ein Block mit x,y,40,70 exisitert dass sind die "Startkoordinaten" des Blocks und deren Länge/ Breite ....aber du musst ja prüfen ob er irgendein Pixel des Blocks berührt

außerdem erstellst du die Blöcke mit 20, 20 und prüfst dann auf 40,70
 
Zuletzt bearbeitet:
ja, die Breiten sieht man direkt am Code, da hilft er dann doch,
was contains macht, von welcher Klasse auch immer, kann man sicher irgendwo nachschlagen,

bevor du kompliziert Bewegung und Listen durchgehst,
hast du schon ganz einfach gestestet?
Block A an Position X stellen, Spieler direkt daneben, ist contains true/ false?
immer einfach testen bevor es kompliziert wird..

vielleicht die intersects()-Methode oder irgendwas selber rechnen
 
ich hab mir den Code incht direkt angeguckt aber kann es sein, dass bei
Java:
(block.contains(x, y, 40, 70)

dann y evtl. dazwischen ist ? also der Typ sozusagen nicht genau an y springt, sondern in den Block hinein und die Koordinaten dann irgendwie mitten im Block liegen?

weil so prüfst du ja nur, ob ein Block mit x,y,40,70 exisitert dass sind die "Startkoordinaten" des Blocks und deren Länge/ Breite ....aber du musst ja prüfen ob er irgendein Pixel des Blocks berührt

außerdem erstellst du die Blöcke mit 20, 20 und prüfst dann auf 40,70

Ähm ? Hab ich denn jetzt garkeine Ahnung von meinem Code mehr ?
(Sehne mich back to c#...)
Also aber ich prüfe doch für jeden Block in der Liste, ob er das Rectangle der Figur berührt oder nicht ???
 
Moin,

also ich kann daraus keine Kollisionserkennung ersehen. Dein Code erschließt sich mir so garnicht. Lies daoch mal das Tutorial und schreibe den dort geposteten c++ / c# code in java um.

LG
 
Aber genau so hat es in c# auch funktioniert...
I beiden war vorher eine foreach schleife und dann in java :
(block.contains(x, y, 40, 70)
Und in c# :
(block.contains(new Rectangle(x, y, 40, 70))

Also eigentlich kein Unterschied ^^
 
API:
Checks whether this Rectangle entirely contains the Rectangle at the specified location (X,Y) with the specified dimensions (W,H).

bei einem Miniblock von 20x20 unmöglich, egal was in anderen Programmiersprachen los ist
 
Bei einfachen 2D Anwendungen bei den ich Kollision benötige, definiere ich in den Objektklassen eigentlich immer eine Variable bounds vom Typ Rectangle welche ich transparent um das Image zeichne und so mit intersects(Object) Kollisionen abfrage.

Die bounds werden mit jeder update Methode aktualisiert, wenn sich das Objekt bewegt. (x,y)

Einfach und effektiv, sollte für die meisten Vorhaben ausreichen.
 

Neue Themen


Zurück
Oben