# Java zwei gleiche Threads mit unterschiedlichen Parametern



## FreshD (18. Feb 2012)

Hey Leute!

nach längerer Recherche im Internet wende ich mich mit meinem Problem jetzt an euch:
Ich schreibe zur Zeit ein kleines Spiel, welches ungefähr wie Super Smash Bros ist. Dazu erstelle ich zwei Charaktere, welche jeweils einen Thread und einen KeyListener benötigen:

Hier der Listener


```
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

public class KeyCharListener extends KeyAdapter
{
	private static MoveThread run;

	public KeyCharListener(MoveThread x)
	{
		run = x;
	}
	
	public void keyPressed(KeyEvent e)
	{
		if (e.getKeyCode() == run.getKeyUp())
		{
			run.setDochar(true);
			run.setUp(true);
		}

		if (e.getKeyCode() == run.getKeyDown())
		{
			run.setDochar(true);
			run.setDown(true);
		}

		if (e.getKeyCode() == run.getKeyRight())
		{
			run.setDochar(true);
			run.setRight(true);
		}

		if (e.getKeyCode() == run.getKeyLeft())
		{
			run.setDochar(true);
			run.setLeft(true);
		}
	}

	public void keyReleased(KeyEvent e)
	{

		if (e.getKeyCode() == run.getKeyUp())
		{
			run.setDochar(false);
			run.setUp(false);
		}

		if (e.getKeyCode() == run.getKeyDown())
		{
			run.setDochar(false);
			run.setDown(false);
		}

		if (e.getKeyCode() == run.getKeyRight())
		{
			run.setDochar(false);
			run.setRight(false);
		}

		if (e.getKeyCode() == run.getKeyLeft())
		{
			run.setDochar(false);
			run.setLeft(false);
		}
	}
}
```

und der Thread


```
import javax.swing.ImageIcon;

public class MoveThread extends Thread
{
	private Character character;
	private int keyUp;
	private int keyDown;
	private int keyLeft;
	private int keyRight;
	
	private static Boolean dochar = false;
	private static Boolean up = false;

	private static Boolean left = false;
	private static Boolean right = false;
	private static Boolean down = false;

	public MoveThread(Character x, int u, int d, int l, int r)
	{
		character = x;
		keyUp = u;
		keyDown = d;
		keyLeft = l;
		keyRight = r;
	}

	public void run()
	{
		int a = 2;
		while (true)
		{
			if (!dochar)
			{
				character.setIcon(new ImageIcon("files/01_Image/04_Characters/" + character.getName() + "/" + character.getView() + "/Normal/0" + a + "_" + character.getName() + ".png"));
				if (a == 1)
				{
					a = 2;
				}
				else
				{
					a = 1;
				}
				try
				{
					Thread.sleep(200);
				}
				catch (InterruptedException e)
				{
					e.printStackTrace();
				}
			}
		}
	}

	public void setDochar(Boolean x)
	{
		dochar = x;
	}

	public void setUp(Boolean x)
	{
		up = x;
	}

	public void setLeft(Boolean x)
	{
		left = x;
	}

	public void setRight(Boolean x)
	{
		right = x;
	}

	public void setDown(Boolean x)
	{
		down = x;
	}
	
	public int getKeyUp()
	{
		return keyUp;
	}

	public int getKeyDown()
	{
		return keyDown;
	}


	public int getKeyLeft()
	{
		return keyLeft;
	}


	public int getKeyRight()
	{
		return keyRight;
	}


	public static Boolean getDochar()
	{
		return dochar;
	}

	public static Boolean getUp()
	{
		return up;
	}

	public static Boolean getLeft()
	{
		return left;
	}

	public static Boolean getRight()
	{
		return right;
	}

	public static Boolean getDown()
	{
		return down;
	}
}
```

zum Schluss der Aufruf:


```
public static void startFight()
	{
		MoveThread runChar1 = new MoveThread(CharacterSelect.getChar1(), KeyEvent.VK_UP, KeyEvent.VK_DOWN, KeyEvent.VK_LEFT, KeyEvent.VK_RIGHT);
		MoveThread runChar2 = new MoveThread(CharacterSelect.getChar2(), KeyEvent.VK_W, KeyEvent.VK_S, KeyEvent.VK_A, KeyEvent.VK_D);

		runChar1.start();
		runChar2.start();

		Main.getFrame().addKeyListener(new KeyCharListener(runChar1));
		Main.getFrame().addKeyListener(new KeyCharListener(runChar2));
	}
```

Nun das Problem: Wenn ich die Tasten des ersten Listeners drücke, passiert gar nichts.
Drücke ich aber die Tasten des zweiten Listeners, so werden beide Threads angesprochen.
Wenn ich die Listener in zwei gleiche Klassen aufteile und dass auch mit den Threads mache, funktioniert es einwandfrei.

Kann mir irgendjemand helfen?

Danke im Vorraus, FreshD


----------



## Firephoenix (18. Feb 2012)

Hi,
dein MoveThread im KeyListener ist static und daher unabhängig von Instanzen.
Du hast da etwas richtung Monostate  Zwei Objekte aber gleiche Daten.
Gruß


----------



## FreshD (18. Feb 2012)

Das war die Lösung!
musste nur die ganzen static bei die booleans in MoveThread entfernen und schon gehts!
Danke FirePhoenix!


----------

