Daemon Thread

gamebreiti

Mitglied
Hallo Leute,

ich arbeite an einem Kartenspiel. Nun suche ich nach einer Möglichkeit folgendes umzusetzen.

Ich habe eine Angriffskarte welche es erlaubt einen bestimmten Gegenspieler anzugreifen. Also habe ich ein Auswahlfenster in welchem die anderen Spieler als Buttons(Spieler 2, Spieler 3 usw.) angezeigt werden. Ich möchte NACH der Auswahl welcher Spieler angegriffen wird überprüfen ob der angegriffene Spieler sich verteidigen kann.
An den Buttons hängen Actionlistener dran, welche ja autmatisch eine Daemon Thread erzeugen.
Gibt es eine Möglichkeit, daß die main wie mit join() auf den Buttonclick (und damit das der Thread stirbt) wartet?


Hier noch ein bisschen Code
Java:
public static void getAktion(int i) {
		
		
		//Angriffsaktion
		zug--;
		angreifenThread.start();
		try {
			angreifenThread.join();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
			if (choose == true)
				if(erfolg == true)
			Aktion.karteZiehen(1);
			
			
		
		zug++;
		aktionPanelUpdate(geld, zug, muenzen, kauf);
		Handkarten.Refresh(listnz,handk,listGespielteKarte,listabl);
	
}
	@Override
	public void run() {
		Aktion.angreifenSolo(1, KNUEPPEL);
		
	}
}

Java:
public static void angreifenSolo(int angriffswert, String karte) {
		trefferPunktAngriff = angriffswert;
		
		//MouseListenerobjekt
		AttSPML attSpML = new AttSPML();
		
		//oeffne Auswahlfenster, welcher Spieler angegriffen werden soll
		angriffsMenu = new JFrame("Spieler: " + spieleranzahl);
		angriffsMenu.setBounds(250,338,500,700);
		angriffsMenu.setUndecorated(true);
		angriffsMenu.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE );
		angriffsMenu.setLayout(null);
		angriffsMenu.setBackground(new Color(0,0,0,1));
		infoUpdate("Wähle einen Mitspieler aus");
		// Panel fuer Hintergrundfarbe
		JPanel back = new JPanel();
		back.setSize(150,180);
		back.setBackground(new Color(0,0,0,0));
		
		// Bilder fuer Button erzeugen
		JLabel bild6 = new JLabel(pos2 + " Spieler");
		bild6.setFont(new Font("Papyrus", Font.BOLD,18));
		bild6.setForeground(Color.WHITE);
		JLabel bild7 = new JLabel(pos3 + " Spieler");
		bild7.setFont(new Font("Papyrus", Font.BOLD,18));
		bild7.setForeground(Color.WHITE);
		JLabel bild8 = new JLabel(pos4 + " Spieler");
		bild8.setFont(new Font("Papyrus", Font.BOLD,18));
		bild8.setForeground(Color.WHITE);
		
		// Buttons erzeugen
		
		for(int count = 1; count < spieleranzahl; count++){
			
			attSp[count] = new JButton();
			attSp[count].setIcon(bilder[48]);
			attSp[count].addActionListener(attSpML);
			attSp[count].setBounds(200,(5 + count*60),128,50);
			//Elemente einbinden
			angriffsMenu.add(attSp[count]);
			if(count == 1)
				attSp[count].add(bild6);
			if (count == 2) 
				attSp[count].add(bild7);
			if (count == 3) 
				attSp[count].add(bild8);
		}
		angriffsMenu.add(back);
		angriffsMenu.setVisible(true);
		
		
			
	}
	public static void trefferpunkteAbwehren(int x, int y,int kraftVerteidiger,int Verteidiger) {
		
		int angriffswert = y;
		int absorbtionswert = x;
		
		if (angriffswert - absorbtionswert <= 0)
			erfolg = false;
			if (erfolg == true){
				kraftVerteidiger = kraftVerteidiger - y;
			schreibeKraft(Verteidiger, kraftVerteidiger);
			
		}
			erfolg = true;
	}
	private static class AttSPML implements ActionListener{
		@Override
		public void actionPerformed(ActionEvent e) {
			int verteidiger = 0;
			// loesche Pruefen
			pruefen.clear();
			// Hole Handkarten des ausgewählen Spielers und Kraftanzeige
			if((e.getSource() == attSp[1])){
				if (pos2 == 1)
					pruefen.addAll(Spieler1.holeHand());
				if (pos2 == 2)
					pruefen.addAll(Spieler2.holeHand());
				if (pos2 == 3)
					pruefen.addAll(Spieler3.holeHand());
				if (pos2 == 4)
					pruefen.addAll(Spieler4.holeHand());
				verteidiger = pos2;
				choose = true;
			}
			if(spieleranzahl > 2){
			if((e.getSource() == attSp[2])){
				if (pos3 == 1)
					pruefen.addAll(Spieler1.holeHand());
				if (pos3 == 2)
					pruefen.addAll(Spieler2.holeHand());
				if (pos3 == 3)
					pruefen.addAll(Spieler3.holeHand());
				if (pos3 == 4)
					pruefen.addAll(Spieler4.holeHand());
				verteidiger = pos3;
				choose = true;
			}
			}
			if(spieleranzahl > 3){
			if((e.getSource() == attSp[3])){
				if (pos4 == 1)
					pruefen.addAll(Spieler1.holeHand());
				if (pos4 == 2)
					pruefen.addAll(Spieler2.holeHand());
				if (pos4 == 3)
					pruefen.addAll(Spieler3.holeHand());
				if (pos4 == 4)
					pruefen.addAll(Spieler4.holeHand());
				verteidiger = pos4;
				choose = true;
			}
			}
			bannreifAktivFuerDefense(verteidiger);
			handkartenAufRuestungPruefen(trefferPunktAngriff,verteidiger);
			angriffsMenu.dispose();
		}
	}

Ist ein eigener Thread sinnvoll oder sollte man darauf verzichten und auf den Daemon Thread warten??
Hängen schon 2 Wochen dran

Gruß gambreiti
 
Zuletzt bearbeitet:

gamebreiti

Mitglied
nochmal zum besseren Verständnis... ich setze im Actionevent ( also wenn ein Mitspielerbutton gedrückt wurde) ein boolean auf true,
anschließend soll eine if-Anweisung überprüfen ob der boolean true ist, wenn ja wird die Kartenhand des gewählten Spielers auf Verteidigungskarten überprüft. Hat dieser keine bekommt der aktive Spieler eine neue Karte. Beim debuggen sehe ich aber das der boolean noch false ist, da das Programm nicht wartet bis der User seine Benutzeeingabe via Mouseclick gemacht hat.

Die Anderen Methoden funktionieren reibungslos. Wenn ich den boolean am Anfang auf true setze statt auf fasle funktioniert es alles reibungslos (aber halt immer)

Hilfe !!!! Bin für jede Idee dankbar
 

Gucky

Top Contributor
Lass doch den ActionListener die weitere Verarbeitung anstoßen und nicht das Programm warten. Oder du lässt den Thread warten mit wait() und weckst ihn im ActionListener wieder auf.
 

gamebreiti

Mitglied
danke für die Idee @ gucky.

Doch soll das Auswahlfenster und damit der Actionlistener überall einsetzbar sein. D.h. Er soll wirklich nur die Kartenhand des ausgewählten Spielers in ein eine Liste zur Überprüfung laden und den boolean auf true setzen um festzustellen, dass die Auswahl getroffen wurde.
Wenn der Actionlistener eine Methode direkt aufrufen würde, müßte ich an der Stelle alle möglichen Angriffskarten berücksichtigen und dort unterscheiden via if oder so. Dies würde ich aber gern in der getAktion - methode der jeweiligen Karte regeln.

Ich glaube, ich mache es so dass ich einen anderen Thread starte in dem eine while schleiße liegt und auf choose == false prüft. Erst wenn chooe auf true gesetzt wird werden die weitere Überprüfungen ausgeführt und damit der Thread auch beendet sein.
 

Gucky

Top Contributor
Es gäbe noch die Möglichkeit, den Thread mit wait anzuhalten und dem ActionListener eine Variable mitzugeben, die eine Methode bereitstellt, die den Thread notyfied.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Minecraft PlayerBot (Listener Thread für jeden Spieler?) Spiele- und Multimedia-Programmierung 3
H Exeption in thread "Thread-2" NullPointerExeption: init methode? Spiele- und Multimedia-Programmierung 25
O Thread pausieren und wieder starten Spiele- und Multimedia-Programmierung 2
kaoZ Animation in eigenen Thread auslagern..... Spiele- und Multimedia-Programmierung 1
M Point & Click Thread Probleme Spiele- und Multimedia-Programmierung 20
N JPanel Inhalt aktualisiert nach Thread.sleep nicht Spiele- und Multimedia-Programmierung 2
S Thread und jpanel-paintcomponent kombinierbar?? Spiele- und Multimedia-Programmierung 14
Kenan89 Alternative zu Thread Runnable Spiele- und Multimedia-Programmierung 2
O Universe <- show Thread Spiele- und Multimedia-Programmierung 14
Y Warum Thread für Spieleprogrammierung? Spiele- und Multimedia-Programmierung 27
C ***** bitte thread löschen *** Spiele- und Multimedia-Programmierung 3
A KeyListener - Thread Problem Spiele- und Multimedia-Programmierung 2
D Snake n+1-Thread Spiele- und Multimedia-Programmierung 2
B Applet startet, aber führt den Thread nicht aus Spiele- und Multimedia-Programmierung 7
S Ein Thread für alle Animationen oder mehrere? Spiele- und Multimedia-Programmierung 2
G Thread startet nicht im Vollbild modus Spiele- und Multimedia-Programmierung 3
E TetrisApplet Thread Hilfe Spiele- und Multimedia-Programmierung 6
Developer_X Thread in Java3D Spiele- und Multimedia-Programmierung 8
D Methode in eigenem Thread auslagern Spiele- und Multimedia-Programmierung 9
S Probleme mit Thread beim Streaming Spiele- und Multimedia-Programmierung 1
F Problem mit Thread.sleep() Spiele- und Multimedia-Programmierung 7
Tapsi Thread wartet auf Threads Spiele- und Multimedia-Programmierung 7
M Thread.sleep() problem Spiele- und Multimedia-Programmierung 10
0 Workaround für Thread.sleep()-Bug Spiele- und Multimedia-Programmierung 15
M Roundbased - Thread anhalten Spiele- und Multimedia-Programmierung 8
D Wasserstrahl animieren: ein Thread je Tropfen? Spiele- und Multimedia-Programmierung 7
S Thread unterbrechen Spiele- und Multimedia-Programmierung 3

Ähnliche Java Themen

Neue Themen


Oben