# Kollisionsabfrage



## mavinatic (16. Jun 2012)

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?

```
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();
	}
```


----------



## SlaterB (18. Jun 2012)

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 (18. Jun 2012)

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.


----------



## SlaterB (18. Jun 2012)

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 (18. Jun 2012)

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 (18. Jun 2012)

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


----------



## SlaterB (18. Jun 2012)

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


----------



## Sotsch (26. Jun 2012)

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.


----------

