Kollision mit Wand

Lukases2

Aktives Mitglied
Hallo,
ich habe bis jetzt den Anfang eines Spiels, welches so aus sieht:
javaw 2015-02-09 20-40-28-35.png

Ich zeichne das Ganze so:
Java:
private class Screen extends JLabel{
		protected void paintComponent(Graphics g){
			//------Einstellungen Kollisionserkennung ------//
			int skalierung = 32;
			int boundingSizeObjects = 15;
			int zentralität = 7;
			//------Ende------------------------------------//
			super.paintComponent(g);
			try {
				for(int i = 0; i < 15; i++){
					for(int j = 0; j < 15; j++){
						LevelReader l = new LevelReader();
						if(l.getTempArray(i, j) == 1)g.drawImage(boden.getLook(), i*skalierung, j*skalierung, null);
						if(l.getTempArray(i, j) == 5){
							g.drawImage(boden.getLook(), i*skalierung, j*skalierung, null);
							g.drawImage(monster.getLook1(), i*skalierung, j*skalierung, null);
						}
						if(l.getTempArray(i, j) == 0){
							g.drawImage(boden.getLook(), i*skalierung, j*skalierung, null);
							g.drawImage(wand.getLook(), i*skalierung, j*skalierung, null);
							wand.setBounding(new Rectangle(i*skalierung+zentralität, j*skalierung+zentralität, boundingSizeObjects, boundingSizeObjects));
							if(player.getBounding().intersects(wand.getBounding())){
								player.setPosition(100, 100);
								
							}
							//g.fillRect(i*skalierung+zentralität, j*skalierung+zentralität, boundingSizeObkects, boundingSizeObkects);
						}
						if(l.getTempArray(i, j) == 3){
							g.drawImage(boden.getLook(), i*skalierung, j*skalierung, null);
							g.drawImage(tuer.getLook(), i*skalierung, j*skalierung, null);
							tuer.setBounding(new Rectangle(new Rectangle(i*skalierung, j*skalierung, boundingSizeObjects, boundingSizeObjects)));
							if(tuer.getBounding().intersects(player.getBounding())){
								if(player.getHasKey() == true){
									player.setLevelGeschafft(true);
									player.setPosition(0, 0);
									player.setHasKey(false);
									System.out.println("Level geschafft!");
								}else {
									player.setLevelGeschafft(false);
								}
							}
						}
						if(l.getTempArray(i, j) == 2){
							g.drawImage(boden.getLook(), i*skalierung, j*skalierung, null);
							g.drawImage(schluessel.getLook(), i*skalierung, j*skalierung, null);
							schluessel.setBounding(new Rectangle(i*skalierung, j*skalierung, boundingSizeObjects, boundingSizeObjects));
							if(player.getBounding().intersects(schluessel.getBounding())){
								player.setHasKey(true);
							}
							System.out.println(player.getHasKey());
						}
						if(l.getTempArray(i, j) == 6){
							g.drawImage(boden.getLook(), i*skalierung, j*skalierung, null);			//zeichnet Boden
							g.drawImage(monster.getLook2(), i*skalierung, j*skalierung, null);		//zeichnet Monster
							monster.setBounding(new Rectangle(i*skalierung, j*skalierung, boundingSizeObjects, boundingSizeObjects));
							//erstellt Bounding															//Kontrolle
							//System.out.println(wand.getBounding());
							//System.out.println(player.getAlive());								
							/*System.out.println("Bounding der Monster:");							
							System.out.println(m.getBounding() + "\n");									
							System.out.println("Bounding des Spielers:");
							System.out.println(player.getBounding() + "\n");*/
						}
						if(l.getTempArray(i, j) == 4){
							g.drawImage(boden.getLook(), i*skalierung, j*skalierung, null);
						}
					}
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
			g.drawImage(player.getLook(), player.getBounding().x, player.getBounding().y, null);
		}
	}
Durch die Zeile
Java:
if(l.getTempArray(i, j) == 1)g.drawImage(boden.getLook(), i*skalierung, j*skalierung, null);
kann ich neue Karten in einem txt Dokument anlegen. Die Zahl steht dabei für ein bestimmtes Objekt.

Womit ich jetzt nicht ganz klar komme ist die Kollision mit der Wand. Das hier:
Java:
if(l.getTempArray(i, j) == 0){
							g.drawImage(boden.getLook(), i*skalierung, j*skalierung, null);
							g.drawImage(wand.getLook(), i*skalierung, j*skalierung, null);
							wand.setBounding(new Rectangle(i*skalierung+zentralität, j*skalierung+zentralität, boundingSizeObjects, boundingSizeObjects));
							if(player.getBounding().intersects(wand.getBounding())){
								player.setPosition(100, 100);
								
							}
							//g.fillRect(i*skalierung+zentralität, j*skalierung+zentralität, boundingSizeObkects, boundingSizeObkects);
						}
realisiert ja die Kollision, allerdings wird der Spieler nun einfach wieder im Frame bei (100, 100) platziert, statt nicht mehr weiterlaufen zu können.
Ich habe jetzt schon relativ lange probiert, aber ich komme nicht drauf, wie ich das realisieren kann.
 

BRoll

Bekanntes Mitglied
Frag doch einfach vor der Bewegung ob er laufen darf, und adde nur dann was dazu, anstatt zyklisch zu checken und in dann zurückzusetzen?
 

Lukases2

Aktives Mitglied
Das ist eigenlich 'ne gute Idee, aber ich komme trotzdem nicht ganz dahinter.
Im 'Player' habe ich jetzt hinzugefügt:

Java:
if(alive && darfLaufen){
			if(up)posy -= 5;
			if(down)posy += 5;
			if(right)posx += 5;
			if(left)posx -= 5;
			if(space){
				bullets.add(new Bullet(posx, posy, 500, 0));
			}else{
			posx = posy = 100;
			if(respawn){
				alive = true;
				posx = 100;
				posy = 100;
				hasKey = false;
			}

und in der Zeichnen-Klasse sieht es so aus:

Java:
if(l.getTempArray(i, j) == 0){
							g.drawImage(boden.getLook(), i*skalierung, j*skalierung, null);
							g.drawImage(wand.getLook(), i*skalierung, j*skalierung, null);
							wand.setBounding(new Rectangle(i*skalierung+zentralität, j*skalierung+zentralität, boundingSizeObjects, boundingSizeObjects));
							if(player.getBounding().intersects(wand.getBounding())){
								player.setDarfLaufen(false);
							}
							//g.fillRect(i*skalierung+zentralität, j*skalierung+zentralität, boundingSizeObkects, boundingSizeObkects);
						}

Aber hier setze ich ja dann 'darfLaufen' auf false, und er darf nicht mehr weiter laufen, stoppt also an Ort und Stelle. Jetzt muss ich ihn ja doch an einen neuen Ort stellen.
 

BRoll

Bekanntes Mitglied
Ja aber jetzt prüfst du die eigentliche Kollision immer noch in der Zeichen-Klasse.
Wie du bestimmt selber merkst sollte die Zeichenklasse sowas niemals selber machen!
Dort wird wirklich nur gezeichnet, mach am besten eine neue Klasse nur für die Kollision.
Diese könntest du so gestalten, dass du die Position und Bewegunsrichtung einer Methode übergibst,
und die dir dann True oder False zurückgibt. Dann kannst du direkt entscheiden ob er laufen darf oder nicht.
 

Lukases2

Aktives Mitglied
Ich habe das Problem jetzt so gelöst:
Ich habe eine Methode updateNeq() geschrieben, die genau die Gegenoperation ausführt, wie die eigentliche update-Methode. Bei einer Kollision läuft der Spieler also runter statt wie gedrückt hoch, nach rechts statt wie gedrückt links, usw.
Danke für deine Hilfe, auch wenn ich es anders (und sehr wahrscheinlich unschöner) gelöst habe.
 

Ähnliche Java Themen

Neue Themen


Oben