# Fragen zu meinem Pong-Clone



## milchkaffee (5. Okt 2008)

Hallo zusammen!

Hier also meine neue Pong-Version, in der ich alle Klassen unter einer Hauptklasse vereint habe, um Probleme beim gegenseitigen Zugriff von ausgelagerten Klassen zu umgehen; dadurch konnte ich auch viele der 'Krücken' abschaffen, wenn auch die eine oder andere noch vorhanden ist. 
Ist dadurch leider etwas lang geworden, aber ich habe den Code nach Kräften mit Anmerkungen dokumentiert...

Was derzeit noch ein Problem ist:

- 'Pause' funktioniert nicht (siehe Key-Abfrage ganz am Schluss und 'paused'-Schalter in der gScreen-Klasse oben, hmm)
- Restart-Funktion mittels Space klappt nicht, wenn Applet mit 'view'-Methode aufgerufen wurde!
- Ballreflektion in Abhängigkeit von der Abweichung von der Padmitte klappt nicht (Code auskommentiert, arbeite noch dran)
- variabler Schwierigkeitsgrad Ballgeschwindigkeit/Computerpad fehlt noch (sollte nicht so schwierig sein)
- beim Starten mit der 'run file'-Methode wird nur ein sehr kleines Fenster geöffnet (gibt es da eine Möglichkeit mit 'setPreferredSize' oder so?)
- Der Mauszeiger bleibt sichtbar (irritierend) und das Pad hängt beim aus- und eintreten des Zeigers aus dem Zeichenbereich 
- beim benutzen der Thread-pause() ist kein Anzeigen von Text oder sonstiges möglich (Hilfe!!)
- automatische Größenanpassung ans Browserfenster fehlt (bin für Tipps dankbar!)
- Vollbildmodus im Browser-Modus fehlt (vielleicht hat da jemand ein paar Hinweise parat)
- bin unsicher, ob das Applet wirklich beendet wird, wenn Browserfenster geschlossen wird
- bin offen für sonstige Hinweise, was besser gemacht werden könnte!
.
.
.

*EDIT: wegen der besseren Übersicht habe ich den gesamten veralteten Code entfernt!*
.
.
.

Vielleicht habt ihr Tipps zur Pausefunktion und Browserfenster-Anpassung oder anderen Dingen... 
Danke schon mal!

schöne Grüße,

milchkaffee


----------



## Fu3L (5. Okt 2008)

Mir ist zwar nciht ganz klar, wie dein KeyListener funktionieren soll, aber ich zeig dir wie ich das bei mir umgesetzt hab:


```
public class GamePanel extends Canvas implements Runnable, KeyListener {
```

Das GamePanel (bei dir wohl gScreen) implementiert KeyListener. Danach addest du den KeyListener zu deinem Panel, wie du dass auch mit dem MouseMotionListener gemacht hast: addKeyListener(this);

Dann fügst du in dein gScreen noch die KeyListener Methoden ein (wieder wie beim MouseMotionListener und bei dir halt mit paused anstatt isPaused):


```
//Beim Loslassen einer Taste
public void keyReleased(KeyEvent e) {
		
	if((e.getKeyCode() == KeyEvent.VK_P) || (e.getKeyCode() == KeyEvent.VK_PAUSE)) {
			
		isPaused = !isPaused;
				
	}
		
}

//Müssen nur überschrieben werden:
public void keyPressed(KeyEvent e) {	}
	
public void keyTyped(KeyEvent e) {	}
```

Mit Applets kenn ich mich sonst leider recht wenig aus  

Edit: Fast vergessen: Du musst (zumindest bei normalen Applikationen) das Panel fokussierbar machen und dir den Fokus holen:


```
setFocusable(true);
grabFocus();
```


----------



## milchkaffee (5. Okt 2008)

Hallo Fu3L, 

Vielen Dank für deine schnelle Antwort!
Mein Programm baut auf einem anderen auf, das ich vorher gebastelt hatte; wie genau der KeyListener funktioniert erschließt sich mir auch nicht so ganz - ich hatte ihn wohl mit Netbeans automatisch eingefügt. Wie sonst würde er auch im GeneratedCode auftauchen:
	
	
	
	





```
gScreen.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                gScreenKeyPressed(evt);
            }
```
 Damit wird dem JPanel-Ableger gScreen ein recht verschachtelter KeyAdapter-Listener verpasst...

Die eigentliche Methode zum Funktionsaufruf baut dann wohl direkt darauf auf:

```
private void gScreenKeyPressed(java.awt.event.KeyEvent evt) {                                   
    
    // Keycodes aus Klasse gScreen abfragen:
    int taste = evt.getKeyCode();
    
    //if (taste == KeyEvent.VK_LEFT && xPosBall1 >= d) xPosBall1 -= 8;
    //if (taste == KeyEvent.VK_RIGHT && xPosBall1 + d <= getWidth()) xPosBall1 += 8;
    //if (taste == KeyEvent.VK_SPACE) System.exit(0);

    // Wenn Schalter 'running' aus, Neustart mit SPACE
    if (running == false && taste == KeyEvent.VK_SPACE) {
        gameScore.resetPlayerScores();
        ball1.resetBall();
        running = true;
    }
.
.
```

Vielleicht liegt es wirklich nur daran, dass der Browser den Focus auf recht aggressive Weise vereinnahmt. Irgendwie auch komisch, dass das Applet für sich gestartet den Space-Event abfängt, aber nicht den TAB-Event und per Browser überhaupt nichts.

Jedenfalls, da ich nach wie vor nicht so recht verstehe, wie die Methode genau funktioniert, werde ich erst mal deinen Vorschlag probieren, hoffentlich mit mehr Erfolg! :]
Allerdings sollte ich vorher den Generated Code von Netbeans entfernen...

Übrigens hatte ich das Problem mit dem nicht geholten Focus schon früher und deswegen das hier eingefügt, was aber anscheinend im Browser nicht funktioniert:

```
gScreen.requestFocus();
```

Gruß,

milchkaffee


----------



## Guest (5. Okt 2008)

Jetzt habe ich doch noch einen anderen Versuch gestartet (wegen dem Focus-Problem):

eine Lösung ist, die Anweisung
	
	
	
	





```
gScreen.requestFocus();
```
einfach in die gScreen-Klasse hineinzupacken, damit sie immer wieder aufgerufen wird (der Browser oder das OS entzieht dem Applet sonst den Focus). Problem dabei: läuft das Applet im Hintergrund weiter (im Tab) zieht es von allen anderen Fenstern dauern den Focus ab (z.B. auch von diesem Editor-Fenster hier) 

Was kann man da tun?

milchkaffee


----------



## milchkaffee (5. Okt 2008)

Ich habe die Tastenabfrage ganz unten im Code abgeändert:


```
// Wenn Schalter 'running' aus, Neustart mit SPACE
    if ( taste == KeyEvent.VK_SPACE && !running ) {
        gameScore.resetPlayerScores();
        ball1.resetBall();
        running = true;
    }
    // Wenn Spiel nicht zuende ist und noch nicht im Pausemodus, in Pausemodus mit 'P' schalten
    // Wenn Spiel im Pausemodus, fortsetzen mit 'P'
    if ( taste == KeyEvent.VK_P && running && !paused ) paused = true;
    
    else if ( taste == KeyEvent.VK_P && paused ) paused = false;
```
Jetzt läuft es problemlos! Trotzdem danke für den Tipp mit dem KeyListener, werde ich bei Gelegenheit nochmal aufgreifen...
Einzig das andauernde gScreen.requestFocus(); im Browser stört nun... 
da müsste wohl eine andere Art von Focus-Request her, bei Mausklick auf den Zeichenbereich z.B....

milchkaffee[/code]


----------



## milchkaffee (6. Okt 2008)

Heute ist mir aufgefallen, dass der IE6 überhaupt kein Wiedereinfangen des Focus für das Java Applet zulässt - Firefox hingegen zieht den Focus selbst von anderen Tabs/Fenstern ab, wie ich im letzten Post geschildert habe...

Kann man da was gegen tun?

*EDIT: hat sich erledigt, nicht reproduzierbar, solange dauernd Focus-Request stattfindet.*

milchkaffee


----------



## milchkaffee (18. Okt 2008)

Obwohl sich der Code meines Applets mittlerweile völlig verändert hat, hier noch mal ein paar allgemeine Probleme, auf die ich noch Antworten suche:


- beim Starten mit der 'run file'-Methode unter Netbeans wird nur ein sehr kleines Fenster geöffnet; im 'index.html', das wiederrum JApplePong.jar aufruft (beim Öffnen mit der 'view'-Methode in NB), ist folgende Zeile enthalten: 





> <applet archive="Pong.jar" code="jApplets/pong/JApplePong.class" width="800" height="480">
> <param name="fps" value="80">
> </applet>


 Im Generated Code des Applets selbst ist 
	
	
	
	





```
gScreen.setMaximumSize(new java.awt.Dimension(32000, 32000));
        gScreen.setMinimumSize(new java.awt.Dimension(640, 480));
        gScreen.setPreferredSize(new java.awt.Dimension(800, 480));
```
 und die entsprechenden Layout-Befehle enthalten - trotzdem wird bei Aufruf mit 'run-file' (Shift+F6) nur ein Fenster von ca. 350x200 geöffnet. Im Browser stimmt die Fenstergröße. Woran liegt das? 

- Der Mauszeiger bleibt im Applet-Bereich im Browser sichtbar (irritierend) und das Pad hängt beim aus- und eintreten des Zeigers aus dem Zeichenbereich. Wie kann ich den Zeiger verstecken und die Mausbewegung unabhängig davon erfassen, ob sich der Zeiger über dem Applet-Zeichenbereich befindet oder nicht?

- eine automatische Größenanpassung des Zeichenbereichs ans Browserfenster - wie muss ich vorgehen, um so etwas zu realisieren?

- Vollbildmodus im Browser-Modus - unterscheiden sich die einzusetzenden Methoden hier von den üblichen Vollbild-Methoden?

- durch das ständige Anfordern des Focus 'mittels focusRequest();' in der Hauptklasse gScreen wird jeglicher Focus vom Browser und selbst vom Desktop beeinträchtigt, bzw. abgezogen - wenn kein dauernder Focus-Request stattfindet, ist aber der Erfolg der Tastenabfrage für einen Neustart in Frage gestellt, vor allem beim IE6! Könnte evtl. ein expliziter Focus-Request beim Klicken auf das Applet die Sache bereinigen? Eigentlich müsste es aber funktionieren, zumindest, solange sich der Mauszeiger über dem Zeichenbereich des Applets befindet...

Ich habe jetzt keine Codes eingefügt, um die Übersichtlichkeit des Threads nicht zu beeinträchtigen. Bitte lasst mich wissen ob und wenn ja, was ihr am derzeitigen Code sehen wollt!


greetz,

milchkaffee[/quote]


----------

