Zwei JLabels auf Berührung prüfen

Roxas

Grünschnabel
Hi Leute,

ich bin gerade dabei ein Tower-Defense-Spiel zu programmieren und möchte gerne das mein Schuss (der ein JLabel ist), wenn er einen Gegner (der auch ein JLabel ist) trifft, ihn quasi "außer Gefecht setzt".

Das ich das ganze mit einem Koordinatensystem lösen kann, ist mir schon bewusst. Doch ich würde meinen Code gerne so kurz wie möglich halten.

Da es bei einem MouseListener möglich ist eine Komponente auf Berührung zu prüfen, dachte ich mir das es vielleicht auch hierzu eine einfache Möglichkeit gibt.

Hat vielleicht jemand spontan eine Idee?:)
 
Guten Tag Roxas,

programmiere grad selbst ein Tower Defense^^ Habe auch eine gute Lösung parad, bin nur grad in der Arbeit^^ ich kann die das heute abend mal hier reinstellen. Aber andere Fragen, bewegen sich deine Monster schon und wie ermittelst du ob sich eins in bestimmter Entfernung eines Turmes befindet, kannst du schon Towers setzen? Würd mich interressieren wie du das gelöst hast :) Haste du eig feste Pfade oder baust du dir welche durch Türme etc.

Gruß Chris
 
Mein Tipp: Je nachdem kann es einfacher sein, wenn du die Komponenten selber zeichnest. Am Anfang vielleicht nicht, aber später geht es, jedenfalls für mich, einfacher.

Wenn ich es richtig verstanden habe:
Du willst "hit detection" implementieren? Also wenn dein "Schuss" einen "Gegner" trifft, soll xy passieren, aber jetzt ist das "Treffen" das Problem?

Dafür gibt's die Methode Rectangle.intersects(inRectangle: Rectangle)

Code:
		Rectangle player = new Rectangle(100, 50, 25, 25);
		Rectangle bullet1 = new Rectangle(95, 45, 5, 5);
		Rectangle bullet2 = new Rectangle(99, 49, 5, 5);
		System.out.println(player.intersects(bullet1));
		System.out.println(player.intersects(bullet2));

Gruss
slowy
 
hi,
sry ich kam bis jetzt nicht zum antworten.
slowfly, ich hab das nen wenig anderst gelöst, lade es nacher noch hoch wenn ich dazu komme^^
Ich hab einfach den Umfang zu prüfen. Dazu den Mittelpunkt meines JLabel genommen und abgefragt wann sich etwas in dem Umfang befindet ;) Was hälst du von der Lösung ;)
Gruß Chris
 
Jo, schau mal, was intersects genau macht - prinzipiell das gleiche:

Code:
    public boolean intersects(Rectangle r) {
	int tw = this.width;
	int th = this.height;
	int rw = r.width;
	int rh = r.height;
	if (rw <= 0 || rh <= 0 || tw <= 0 || th <= 0) {
	    return false;
	}
	int tx = this.x;
	int ty = this.y;
	int rx = r.x;
	int ry = r.y;
	rw += rx;
	rh += ry;
	tw += tx;
	th += ty;
	//      overflow || intersect
	return ((rw < rx || rw > tx) &&
		(rh < ry || rh > ty) &&
		(tw < tx || tw > rx) &&
		(th < ty || th > ry));
    }
 
Vielen Dank für die Hilfen!

Bis ich in diesem Thread eine Antwort hatte habe ich mein Problem schon längst gelöst:
Meine Lösung war, einfach in meinem Objekt "Bullet"(für Schuss) eine Überprüfung zu schreiben die die eigene Position prüft ob Sie am Rand eines Labels ist. Da mein "Bullet-Thread" deutlich schneller läuft als meine "Enemys"(Gegner) gab es bis jetzt, selbst auf den langsamsten PC´s die ich zur Verfügung hatte keine Probleme.

An slowfly: Auf diese Idee bin ich auch schon davor gekommen. Ich habe diese aber nicht benutzt da ich später relativ einfach, Bilder in die Labels setzen kann.

An Funresort: Ich weiß nicht ob du noch Hilfe beim setzen von Towern brauchst aber ich habe in meinem Spiel in der oberen linken Ecke mehrere JButtons. Wenn ich darauf klicke kann ich mittels eines Mouse-Listeners bestimmen wo der Tower gesetzt wird.
Momentan habe ich 5 Tower:

CannonTower: Simple Schüsse.
FastCannonTower: Feuert schneller als ConnonTower.
AllSidesTower: Feuert in mehrere Richtungen gleichzeitg.
TargetTrackingTower: Zielverfolgende Schüsse.
SolarTower: Fügt jede Sekunde 5 Money hinzu.

Wenn ich damit fertig bin werde ich evtl. ein Tutorial dazu machen, welches ich hier im Thread verlinken werde.

Gruß,
auch Chris
 
Tut mir leid slowfly. Du hast natürlich vollkommen Recht mit dem was du schreibst.
Habe vorher nur bis zum ersten Absatz deines Beitrags gelesen und dachte zuerst du meinst, ich soll alles mit der paint-methode zeichnen.

Nochmals Danke.:)
 
Hi Roxas,

brauche keine Hilfe beim setzen^^ hab wie gesagt das towerdefense schon so gut wie fertig, wollte nur ma deine lösung wissen ;)

Gruß Chris
 
Zurück