Kollisionsabfrage

mavinatic

Bekanntes Mitglied
Hallo Community,

ich hatte schonmal einen Thread dazu aufgemacht, welcher nun nicht mehr ausgegraben werden soll. Hier geht es um die Kollision auf einer Map.

Im nachfolgenden Quellcode seht ihr eine von mir bereits implementierte Version der Kollsion, welche nicht funktioniert. Habt ihr eine Idee wieso das nicht funktioniert?
Java:
private void move(long delta) throws Exception {		
//		if(!handler.isMenuKey()) {
//			if(handler.isAKey())
//				this.x -= getSpeed()*(delta/1e9)+1;
//			if(handler.isDKey())
//				this.x += getSpeed()*(delta/1e9)+1;
//			if(handler.isWKey())
//				this.y -= getSpeed()*(delta/1e9)+1;
//			if(handler.isSKey()) 
//				this.y += getSpeed()*(delta/1e9)+1;
//		}
		
		if(!handler.isMenuKey()) {
			if(handler.isAKey())
				tmpX = -1;
			if(handler.isDKey())
				tmpX = 1;
			if(handler.isSKey())
				tmpY = 1;
			if(handler.isWKey())
				tmpY = -1;
			
			double newPosX = getX() + (tmpX * (getSpeed() * (delta/1e9)+1));
			double newPosY = getY() + (tmpY * (getSpeed() * (delta/1e9)+1));
			
			if(isMovable(newPosX, newPosY, tmpX, tmpY)) {
				parent.setOffset(parent.getScreenWidth()/2 - newPosX, parent.getScreenHeight()/2 - newPosY);
				this.x = newPosX;
				this.y = newPosY;
			}		
			
			tmpX = 0;
			tmpY = 0;
		}
	}
	
	private boolean isMovable(double px, double py, int factorX, int factorY) throws Exception {
		if(factorX==1)
			px += images[0].getWidth();
		if(factorY==1)
			py += images[0].getHeight();
		
		if(px<0)
			px=0;
		if(py<0)
			py=0;
		if(px>(level.getWidth()*Tile.SIZE))
			px=level.getWidth()*Tile.SIZE;
		if(py>(level.getHeight()*Tile.SIZE))
			py=level.getWidth()*Tile.SIZE;
		
		
		//return true;
		return level.getTile((int)px / Tile.SIZE,(int)py / Tile.SIZE).isMovable();
	}
 
S

SlaterB

Gast
noch offen?
erstaunlich wie oft man im Forum den immer gleichen Begriff liest

zum Code muss ich sagen, dass ich solange schauen kann wie ich will, eine Kollision mag ich nicht erkennen,
habe ich aber auch noch nie selber programmiert, was ist denn da das Hauptanliegen?

ich denke an die Berechnung eines boolean, Kollision ja/nein,
isMovable() klingt dazu nicht ganz so eindeutig, darin erkenne ich auch nichts eindeutiges und der Aufrufer scheint mir danach auch nicht deutlich mit Einleitung einer Explosion oder so zu reagieren..

wie quasi überall und dir sicher bekannt ist die Lösung aber loggen ;)
schaue dir die Positionen an, die Berechnungen daraus, die if-Vergleiche
 

mavinatic

Bekanntes Mitglied
Hi SlaterB,

du hast vollkommen recht, irgendwie war ich abwesend während des Thread schreibens.... also ich habe eine TileMap und ich möchte wissen, ob der Spieler an der aktuellen Position(px/py) sich bewegen kann.

Ich habe es schon 3 Millionen mal durchgespielt, aber komme zu keinem Resultat, deswegen frage ich euch.
 
S

SlaterB

Gast
nur durch kleine Themenänderung wird es aber nicht so leicht bearbeitbar,
es fehlen lauter Informationen, z.B. ist nicht bekannt ob isMovable() von irgendeinem Tile je true liefert,

was newPosX/Y usw. ausrechnet, zumal getSpeed() und delta beliebige Werte, gar beliebige Datentypen sein können,
was alles immensen Einfluss hat (int/großen int == 0)

gewisse Vorstellungen kann man schon machen (wenn A gedrückt dann geht es eins nach oben),
aber das weißt du ja selber nur zu gut, und bringt nix

was im einfachen passieren soll, welche newPosX/Y ausgerechnet und dann an Feldern nachgeschaut wird kannst du mit System.out.println() bestens nachschauen,
für komplizierteres braucht es anscheinend ein vollständiges Testprogramm, idealerweise plus Beschreibung zur Fehlersituation,
falls nicht trivial der erste Schritt schon misslingt,
in einem möglichst kleinen Array, nicht 100x100
 

Fu3L

Top Contributor
Mir sieht das vor allem immer noch nach dem Problem aus, dass wir hier über 3, 4 Seiten besprochen haben und wofür ich eine funktionierende! Lösung gepostet habe. Schau dir die doch noch einmal an.
(Ich meine mich zu erinnern, dass die Figur nur hin und wieder ein paar Pixel entfernt von einem Objekt zum stehen kam, wenn die Geschwindigkeit so hoch war, dass pro Tick mehr als 1 Pixel zurückgelegt wurde.)
 

mavinatic

Bekanntes Mitglied
Hey Fu3l,

das war richtig, aber ich wollte nun eine exakte Lösung, dass ich quasi diese "pixel zuviel" genau treffe.

@SlaterB:

Meine Map besteht aus 0en und 1en wenn der Wert == 1 ist dann kann man sich NICHT bewegen. Ist er 0 kann man sich auf dem Tile bewegen.

Datentypen:

double newPosX, newPosY
double speed
long delta
 
S

SlaterB

Gast
als Rückmeldung kann ich sagen, dass ich zwar diese Punkte angesprochen habe, sie mir aber nicht reichen, um irgendwas weiter zu sagen,

getX()/ getY() könnte was falsches liefern,
images[0].getWidth() ist unbekannt
/ Tile.SIZE kommt in die Rechnung
usw.

du könntest durch ein einfaches System.out.println() herausfinden, was die neuen Koordinaten sind,
ich verstehe absolut nicht, was du dazu hier fragst,

gut, natürlich kann jemand erkennen ob du im Code irgendwo falsches + statt - hast, initial ja ok als Hoffnung,
aber was ich zuvor sagte war dann eben dass diese Ebene vorbei ist (falls nicht wer anders noch was sieht)
und es dann in undurchschaubaren Details der Berechnung weitergeht,
lohnt nicht darüber hier zu diskutieren, System.out.println() liefert alles

neben der Berechnung irgendwelcher Koordinaten + Übertrag ins TILE-Koordinatensystem ist der andere große Punkt die Umgebung:
wo steht wer auch immer, etwa X, und wie sehen die Nachbar-TILE-Felder ganz real aus

alles kannst du nachschauen, hier ist nichts zu erkennen ohne komplettes Testprogramm posten
 
Zuletzt bearbeitet von einem Moderator:

Sotsch

Mitglied
Wäre vielleicht erstmal interessant zu wissen wie diese Kollision zu Stande kommen soll bzw. wie du sie prüfst. Man erkennt zum Beispiel nicht was Delta zu bedeuten hat und warum die Methode getSpeed() zur Berechnung benötigt wird.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A DoodleJump programmieren: Kollisionsabfrage Spiele- und Multimedia-Programmierung 6
T Problem bei Kollisionsabfrage Spiele- und Multimedia-Programmierung 4
S Polygon Kollisionsabfrage Spiele- und Multimedia-Programmierung 2
RalleYTN Erweiterte Kollisionsabfrage Spiele- und Multimedia-Programmierung 7
S Kollisionsabfrage zwischen Rechteck und Polygon Spiele- und Multimedia-Programmierung 1
J Java Kollisionsabfrage Spiele- und Multimedia-Programmierung 21
kaoZ Kollisionsabfrage implementieren Spiele- und Multimedia-Programmierung 63
T Problem mit Kollisionsabfrage der NPC Spiele- und Multimedia-Programmierung 1
F Kollisionsabfrage bei schnellen Objekten Spiele- und Multimedia-Programmierung 2
J Problem bei pixelgenauer Kollisionsabfrage Spiele- und Multimedia-Programmierung 10
N Quake - Kollisionsabfrage Spiele- und Multimedia-Programmierung 21
N Problem mit Kollisionsabfrage beim Fallen Jump & Run Spiele- und Multimedia-Programmierung 5
R Kollisionsabfrage haut nicht hin Spiele- und Multimedia-Programmierung 15
Gossi Quaxlis 2D Tutorial....Probleme nach hinzufügen der Kollisionsabfrage Spiele- und Multimedia-Programmierung 16
U Jump n' Run 2D Geometrie und Kollisionsabfrage? Spiele- und Multimedia-Programmierung 11
baddestpoet Problem mit Kollisionsabfrage Spiele- und Multimedia-Programmierung 18
D Kollisionsabfrage von 2 Autos Spiele- und Multimedia-Programmierung 2
G Kollisionsabfrage (Mario klon) Spiele- und Multimedia-Programmierung 6
gieser Buggy Kollisionsabfrage Spiele- und Multimedia-Programmierung 4
masta // thomas Kollisionsabfrage - inspiriert durch "pixelgenaue Kolli Spiele- und Multimedia-Programmierung 13
gieser pixelgenaue Kollisionsabfrage der Kreise Spiele- und Multimedia-Programmierung 9
T Kollisionsabfrage von einem Stein mit einem Ball Spiele- und Multimedia-Programmierung 5
N Kollisionsabfrage Spiele- und Multimedia-Programmierung 6
D Jump and Run Game -- Kollisionsabfrage Spiele- und Multimedia-Programmierung 30
J Kollisionsabfrage Ball <-> Paddle Spiele- und Multimedia-Programmierung 2

Ähnliche Java Themen

Neue Themen


Oben