# Ein paar Fragen...



## DVDB (25. Nov 2013)

Guten Abend!

Programmiere momentan ein Spiel wie Pong, nur ohne Gegenspieler (man muss halt den Ball in der Luft halten). Ich hätte mal ein paar Fragen zur Spieleentwicklung:

1. tick() und render():

tick() macht das rechnerische, render() das graphische. tick() soll nur 60 mal die Sekunde ausgeführt werden. hab dafür folgendes Konzept:


```
if (zeitgestoppt == false) {
	time_1 = System.currentTimeMillis();
	zeitgestoppt = true;
}
time_2 = System.currentTimeMillis();
if (time_2 - time_1 >= 1000 / 60) { //tick() alle 1/60 Sekunden
	tick();
        zeitgestoppt = false;
}
			
render();
```

Ich schätze mal das diese Rangehensweise zimlich schlecht ist. Wie macht man das richtig?

2. KeyListener und Co.:

Ich benutze auf Empfehlung aus einem anderen Forum folgendes:


```
map = panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);

panel.getActionMap().put("exit", new AbstractAction() {
	@Override
	public void actionPerformed(ActionEvent arg0) {
	System.exit(0);				
        }
});

map.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), "exit");
```

Ich würde gerne ein Menü machen, mit dem man das Spiel neustarten kann und auf dem nach einem Match die erspielte xp angezeigt wird. Allerdings ist da immer das Problem mit dem Fokus von Fenstern, dank dem weder KeyListener noch ActionMap funktionieren.

3. Spielstand speichern/laden:

Textdokument beschreiben/auslesen lassen oder was macht man da am besten?


Danke!

MfG,
DVDB


----------



## BuddaKaeks (27. Nov 2013)

verwende auf jeden fall System.nanoTime(); zur Zeitmessung, da die System.currentTimeMillis(); auf 16 ms ungenau ist, was bei messungen auf 1/60 sekunden eine große ungenauigkeit sein kann.


----------



## Gucky (27. Nov 2013)

1. Es ist nicht ersichtlich, ob du schon einen benutzt. Guck dir bitte mal die Threads an.

2. Ein Menü kannst du mit einem weiteren Panel machen, dass du einfach über das Spiel legst. Den Thread stoppst du. Soll etwas anderes den Fokus bekommen, dann benutzt du requestFokus(); Bitte auch angucken. Willst du Events weiterleiten, so ist das kein Problem. Du machst eine Methode public tasteGedrückt(Event e){}, in der du anhand des Events darauf reagierst. Diese Methode wird auch von deinem KeyListener aufgerufen.

3. Zum schreiben in ein Textdokument guck dir bitte mal den BufferedWriter und den OutputStream an. Zum lesen den BufferedReader, den Scanner und den InputStream.


----------



## DVDB (28. Nov 2013)

Das mit dem Fokus krieg ich nie hin... Alles was ich lese ist, dass ich es mit "requestFocus()" oder "setFocusable(false)" machen soll. Funzt aber nie! 


```
public void menu() {
		Game.this.add(menu);
		menu.setLayout(null);
		menu.setFocusable(false);
		
		start.setBounds(width / 2 - 600 / 2, height / 2 - 200 / 2, 600, 200);
		start.addActionListener(new ActionListener() {
			{
		}
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				running();
			}
		});
		start.setFocusable(false);
		
		menu.add(start);
	}
	
	public void running() {
		Game.this.requestFocus();
		
		running = true;
		map = new Map();
		while(running == true) {
			render();
			//tick(); Wird noch nicht gebraucht!
		}
	}
```


----------



## BuddaKaeks (28. Nov 2013)

setFocusable(false);

macht ja genau das gegenteil von dem, was du willst:
Es führt dazu, dass dein JFrame, etc. niemals den Focus bekommen kann


----------



## DVDB (6. Dez 2013)

ich hab das setFocusable() auf alle anderen Objekte gemacht (Button, panel), damit der JFrame immer den Focus behält - nicht umgekehrt!


----------

