Runnable + KeyListener?

Status
Nicht offen für weitere Antworten.

StickToFreak

Aktives Mitglied
Hey Leute,

also mal ne Frage, vielleicht geht das garnicht so einfach wie ich es mir vorstelle.
Ich möchte - Snake-like - Ein Objekt (in meinem Fall ein Kreis) per Tasten-Druck, weiterlaufen lassen Geht ja per Runnable, aber doch nicht per Tastendruck oder?

Also so sieht das ganze bisher aus:

[HIGHLIGHT="Java"]
import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class Snake extends Applet implements KeyListener {


private int mouseX;
private int mouseY;
private int radius, diameter = 20;
private Color circleColor = Color.black;
private Color rectColor= Color.black;





public void init() {
Dimension full = getSize();
mouseX = full.width/2;
mouseY = full.height/2;
radius=diameter/2;
addKeyListener(this);
}


public void paint (Graphics g) {
g.drawRect(10,10,300,200);
g.setColor(rectColor);
g.setColor (circleColor);
g.fillOval ((mouseX-radius), (mouseY-radius),diameter, diameter);

}



public void keyPressed(KeyEvent ev) {

if (ev.getKeyCode() == KeyEvent.VK_RIGHT && mouseX <300) {
mouseX = mouseX+2;
mouseY = mouseY;

repaint();
}
if (ev.getKeyCode() == KeyEvent.VK_DOWN && mouseY <200) {
mouseX = mouseX;
mouseY = mouseY+2;

repaint();
}
if (ev.getKeyCode() == KeyEvent.VK_UP && mouseY >20) {
mouseX = mouseX;
mouseY = mouseY-2;

repaint();
}
if (ev.getKeyCode() == KeyEvent.VK_LEFT && mouseX >20) {
mouseX = mouseX-2;
mouseY = mouseY;

repaint();


}
if (mouseX == 20 && ev.getKeyCode() == KeyEvent.VK_LEFT){
System.out.println("Game Over!");
repaint();
}

if (mouseY==20 && ev.getKeyCode() == KeyEvent.VK_UP){
System.out.println("Game Over!");

}

if (mouseX==300 && ev.getKeyCode()== KeyEvent.VK_RIGHT){
System.out.println("Game Over!");
}

if (mouseY==200 && ev.getKeyCode() == KeyEvent.VK_DOWN){
System.out.println("Game Over!");
}





}


public void keyTyped(KeyEvent ev) {

}
public void keyReleased(KeyEvent ev) {

}

}

[/HIGHLIGHT]

Als weiteres wollte ich ncoh fragen, wenn ich das ganze per GameLoop mache, wie würde das funktionieren? einfach while(true){ davor setzen? Wäre ja ganz schön. Nur wenn ich das mache, dann bewegt sich der Kreis kein Stück, sondern er bleibt stehen (im Applet) und unten kommt die ganze Zeit per System.out.println("Game Over!") :-D sieht alles sehr lustig aus, aber funktionieren tut es nicht ;).

Bin ich komplett auf dem Holzweg, oder gibt es da eine einfache Lösung? :D
 

hdi

Top Contributor
Also erstmal musst du aufpassen was du im Listener in welcher Reihenfolge machst.

Du sagst zB if x > 20 then moveLeft. Dabei erniedrigst du x um 2, also ist es jetzt 18.
Danach prüfst du ob x == 20, was nicht der Fall ist. D.h. ein Gameover
wird es nur mit etwas Glück geben, und zwar wenn er genau bei 22 nach links drückt.

Besser also if x < 20, und noch besser das VOR der Bewegung prüfen.

Ansonsten:
Ein KeyListener nimmt nur tatsächlich Aktionen wahr, die DU als User drückst.
Ein GameLoop arbeitet direkt mit der Logik, d.h. dort veränderst du die Position
halt direkt (der gleiche Code wie in deiner Listener-Methode).
Es gibt zwar etwas dass sich "Robot" nennt, und der simuliert Tastendrücke, aber
das is eig. nicht nötig.

Ein GameLoop ist eigentlich immer while(!gameover){...}, und diese Variable wird
eben auf true gesetzt wenn du mit einer Wand kollidierst oder sonst was.

Dein Problem, dass sofort GameOver erscheint ist wohl, dass du kein sleep verwendest.

Ein while(true) wird pro Sekunden hunderttausendfach aufgerufen.

Du solltest also Pausen einbauen, dafür gibt es die Methode

Thread.sleep(long);

long ist dann der Wert in Millisekunden, der geschlafen werden soll.
zB long = 1000 würde heissen, dass sich dein Wurm jede Sekunde mal verschiebt,
und der GameLoop dann ne Pause einlegt usw.
 

StickToFreak

Aktives Mitglied
@hdi

d.H. ich muss boolean benutzen?




[HIGHLIGHT="Java"]
boolean gameover;


//[...]

public void keyPressed(KeyEvent ev) {

if (mouseX1 == 20 && ev.getKeyCode() == KeyEvent.VK_LEFT){
System.out.println("Game Over!");
this.gameover = true;
}

if (mouseY1==20 && ev.getKeyCode() == KeyEvent.VK_UP){
System.out.println("Game Over!");
this.gameover = true;
}



if (mouseX1==300 && ev.getKeyCode()== KeyEvent.VK_RIGHT){
System.out.println("Game Over!");
this.gameover = true;
}


if (mouseY1==200 && ev.getKeyCode() == KeyEvent.VK_DOWN){
System.out.println("Game Over!");
this.gameover = true;
}

while(!gameover){




if (ev.getKeyCode() == KeyEvent.VK_RIGHT && mouseX1 <300 ) {
mouseX1 = mouseY1+2;
mouseY1 = mouseY1;


repaint();
}

if (ev.getKeyCode() == KeyEvent.VK_DOWN && mouseY1 <200) {
mouseX1 = mouseX1;
mouseY1 = mouseY1+2;


repaint();
}

if (ev.getKeyCode() == KeyEvent.VK_UP && mouseY1 >20) {
mouseX1 = mouseX1;
mouseY1 = mouseY1-2;
repaint();
}

if (ev.getKeyCode() == KeyEvent.VK_LEFT && mouseX1 >20) {
mouseX1 = mouseX1-2;
mouseY1 = mouseY1;
repaint();
}
}


}[/HIGHLIGHT]

Das Problem ist, dass wenn ich dies mache, passiert bei mir garnichts. -> ?Weil ich kein Runnable nutze?? <-
Oder ist sonst noch ein Fehler drinne?
 
Zuletzt bearbeitet:

hdi

Top Contributor
Du bringst da was durcheinander.

Die keyPressed-Methode soll ja nicht deinen Game-Loop enthalten.
So wie du es im Moment gemacht hast, bleibt dein Programm beim ersten Tastendruck
hängen (keyPressed wird aufgerufen, dort while(!gameover) -> Endlosschleife).

Die Methode selbst enhält nur die if-Abragen (welche Taste gedrückt wurde) und
dann je nachdem entweder die Repositionierung deines Objekts oder eben, und das hast
du richtig gemacht - ein gameover = true.

Das war's.

Dein GameLoop ist dann ein eigener Thread/Runnable (ist das gleiche).
und dieser enthält in seiner run()-Methode, die du ja überschreiben musst,
die while(!gameover)-Schleife.
Da kommt übrigens auch das repaint() rein, nicht in die keyPressed-Methode!

Der boolean gameover muss also sowohl in der keyPressed
Methode als auch im GameLoop sichtbar sein. Kommt jetzt drauf an wie du das designest, wenn
du eh alles in eine Klasse klatscht sollte es ja kein Problem sein.

Du wirst aber evlt demnächst auf ein anderes Problem stossen, ich schmeiss dir
mal den Begriff "Event Dispatch Thread" vor die Füsse. Aber dazu kommen wir,
wenn es soweit ist ;)
 

StickToFreak

Aktives Mitglied
:-D Ist ja lustig^^. Okay also wenn ich das jetzt richtig verstanden hab, muss ich das in die keyTyped methode reintun?

Wie meinst du das mit dem Der boolean muss in keyPressen sowie im Gameloop sichtbar sein?
 

hdi

Top Contributor
Nein Nein Nein ;)

Ich schreib dir jetz mal das etwas ausführlicher, könnte etwas dauern, edit kommt dann in ~30 mins
 

StickToFreak

Aktives Mitglied
Och du jemine :D
Find ich gut. Bis in 30min. :D
Achja wenn ich schon dabei bin dir Aufwand zu machen, wie sähe das ganze aus, wenn ich dann beim "Game Over" das ganze stoppen will. Also das sich nen Dialog öffnet mit Game Over.
Du verstehen :D ?
 

hdi

Top Contributor
Ok, here we go:

Diese Methoden keyPressed,keyTyped etc. sind ja Methoden vom Interface KeyListener.
Sobald du einen KeyListener an eine Komponente hängst, ist er aktiv und "lauscht" (to listen)
dort auf etwas - in deinem Fall auf Tastatur-Eingaben.

Diese Methoden werden von Java automatisch aufgerufen, wenn du jetzt ne Taste drückst,
wie du sicher schon gemerkt hast.

Vllt kurz der Unterschied zwischen keyTyped und keyPressed:
keyPressed = wird aufgerufen, wenn du ne Taste runterdrückst.
keyTyped = wird aufgerufen, wenn du einen kompletten "Drückvorgang" auslöst, d.h.
du drückst eine Taste und lässt sie auch wieder los.
...das nur nebenbei, überleg dir wie dein Spiel reagieren soll damit du weisst welche
Methode du verwenden willst.

Was jetzt in dieser Methode passieren soll, ist ja: Entweder deine Figur wird bewegt,
oder das spiel soll game Over sein, weil du in ne Wand gerannt bist oder sowas.

Und genau das soll diese Methode machen: Entweder repositionieren, oder einfach nur
das Spiel beenden, und dafür setzt man eben normalerweise einen boolean-Wert,
hier gameOver = true;

Soo, deine Spiel-Logik, also der Game-Loop, der hat mit dieser Aktion erstmal aktiv nix zu tun.

Du musst wissen, dass jedes Programm anfangs nur einen Thread hat. D.h. beim Ausführen
des Programms wird Zeile für Zeile ausgewertet, und dein Programm kann immer nur
eine Sache auf einmal tun.

Wenn du nun also eine while-Schleife in die KeyListener Methode reinbaust, dann heisst das
dass diese Methode nicht "zurückkehrt", also das Programm während der Laufzeit dort
festhängt und die Methode nicht zum Ende bearbeitet.

Das führt dazu, dass dein Listener blockiert -- weitere Tastendrücke können nicht ausgewertet
werden, weil die Methode nicht neu aufgerufen werden kann, solange du noch drinsteckst.

Deshalb trennt man den Gameloop von einem Listener.
Und der Game-Loop ist ein eigener Thread, ein neuer Thread.
Warum? Na ganz einfach: Du willst doch, dass der Computer fortlaufend etwas tut,
zB eine Figur bewegen, und du gleichzeitig deine Figur umlenken kannst, oder?

Weil ein Thread wie oben erwähnt nur zeilenweise, streng sequentiell, arbeiten kann,
klappt das nicht mit einem Thread. Du brauchst zwei.

Der GameLoop ist also ein Thread, d.h. ja nur dass du von der Klasse Thread erbst, bzw.
das Interface Runnable implementierst.

So, wie du vermutlich auch eine Klasse á la:

[HIGHLIGHT="Java"]class MeinSpielFenster extends JFrame {...}[/HIGHLIGHT]

hast, brauchst du jetzt also eine neue Klasse á la:

[HIGHLIGHT="Java"]class MeinGameLoop extends Thread {...}[/HIGHLIGHT]

Und wenn du die gemacht hast, musst du in dieser Klasse die run-Methode überschreiben.
Dort kommt das rein, was dein GameLoop tun soll, also:

[HIGHLIGHT="Java"]@Override
public void run(){
while(!gameover){
// tue, was du halt tun sollst...
}
}[/HIGHLIGHT]

Und jetzt verstehst du wohl auch, was ich meinte als ich sagte, der boolean muss
sowohl im GameLoop als auch im KeyListener sichtbar sein: Du hast ja jetzt 2 verschiedene
Klassen.

Zwar designtechnisch nicht schön, aber für den jetzigen Zweck einfacher, solltest
du diese 2 Dinge also nicht in zwei verschiedene .java Dateien schreiben, sondern
in eine.

Die GameLoop-Klasse schreibst du dann innerhalb von deiner Haupt-Klasse
(darf in diesem Fall aber nicht public sein, einfach weglassen)

Und wenn du dein Programm startest, also in der main-Methode oder meinetwegen
im Konstruktor deines Frames oder so, musst du eine Instanz von deinem GameLoop erzeugen:

[HIGHLIGHT="Java"]GameLoop game = new GameLoop();[/HIGHLIGHT]

die run()-Methode ruft man nicht direkt auf, sondern man macht:

[HIGHLIGHT="Java"]game.start();[/HIGHLIGHT]
(das führt dazu, dass intern die run-Methode aufgerufen wird).

So, wenn du das soweit machst, dann läuft dein GameLoop in einer Endlosschleife,
und tut bisher noch nix sinnvolles. Dafür tut er etwas extrem nicht-sinnvolles:
Er drescht die CPU-Auslastung auf 100%, und legt deinen PC halb lahm.

Der Grund liegt darin, dass eine while(true)-Schleife (!gameover ist ja anfangs true)
in der Sekunde SEHR oft aufgerufen wird, und zwar pausenlos.
Deswegen bauen wir eine Pause ein:

[HIGHLIGHT="Java"]@Override
public void run(){
while(!gameover){
// tue, was du halt tun sollst...
// und dann chill erstmal ne Runde:
Thread.sleep(50);
}
}[/HIGHLIGHT]

Diese sleep-Methode nimmt einen long-Wert in Millisekunden entgegen. D.h. hier
würde der GameLoop immer 50ms "schlafen", bevor er die Schleife wieder durchläuft.
Das langt erstmal, um deine CPU wieder in den grünen Bereich zu kriegen.

Kleine Anm.: Der Aufruf der sleep-Methode kann eine Exception werfen, d.h. das musst
du in einen try-catch Block hauen. Wenn du ne IDE wie zB Eclipse nutzt, wird der dir
das automtaisch machen wenn du auf die Fehler-Meldung klickst.

Für den Fall dass das nicht der Fall ist, das muss am Ende also so aussehen:

[HIGHLIGHT="Java"]try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}[/HIGHLIGHT]

Nochmal zur Erinnerung: Es laufen jetzt 2 Threads: Dein Hauptprogramm, und
dieser GameLoop. Denn wenn du den GameLoop erstellst und startest, springt
dein Hauptprogramm nicht in die run()-Methode, sondern macht einfach in seinem
eigenen Code weiter.

Jetzt setzt du noch nen Listener wie gehabt, und nun läuft der GameLoop, und der
KEyListener steht jederzeit zur Verfügung, um Tastatur-Eingaben zu bearbeiten.

Sobald du gameover auf true setzt, endet der GameLoop, weil seine run()-Methode
zu Ende geht, und damit ist der Thread "tot".

Verstanden? Dein Gameloop macht in gewissen Abständen (druch das sleep festgelegt)
eine bestimmte Aktion. Und der Listener ist einfach "da", und reagiert bei jedem
Tastendruck.

Man muss das jetzt halt alles schlau zusammenbauen können. Wie ich zB sagte
sollte der GameLoop das repaint() machen, dafür braucht er das Panel/Frame, auf
dem das passieren soll.

Du musst also kucken dass du gewisse Variablen global zur Verfügung stellst, damit
beide Klassen drauf zugreifen können.

...ist n bisschen happig, da kommt viel zusammen. Das ganze GUI/Thread Zeugs ist
wirklich alles andere als leichte Kost. Aber versuch einfahc mal deinen Code so umzuschreiben wie du es jetzt verstanden hast.

Viel Spass (und Glück :p)
 

hdi

Top Contributor
Überleg nochmal und beantworte dir die Frage selber.
Nochmal n kleiner Denkanstoss:

Ein Thread läuft streng sequentiell ab, d.h. wenn du in Methode A steckst,
kann Methode B nicht aufgerufen werden, wenn beide Methoden vom dem selben
Thread bearbeitet werden (sollen).

edit: Das @Override kann man weglassen. Man schreibt es für gewöhnlich hin,
damit man als Programmierer sieht: Aha, hier überschreibe ich eine Methode, die
ich geerbt habe.
Bei deinen ganzen KeyListener-Methoden könntest du das also auch hinschreiben.
 

hdi

Top Contributor
GameLoop ist nur eine Klasse, wo du die hinschreibst ist egal. Eine Klasse selbst
"macht" ja noch nix, die ist nur verfügbar.

Das Erstellung und Starten deines Gameloops kannst du eigentlich auch machen,
wann immer du Lust hast.
Als erste Zeile deiner main-Methode, oder innerhalb deines Fenster-Konstruktors.
Wie du willst.

edit: Wenn du die Erstellung am Anfang zu den Variablen schreibst, wird er erstellt
sobald du das Objekt (Fenster) erstellst. Ist also durchaus auch möglich.
 

StickToFreak

Aktives Mitglied
Hm. OKay.
Also nochmal wenn ihc das richtig verstanden ahbe kommt das ganze:

[HIGHLIGHT="Java"] { if (ev.getKeyCode() == KeyEvent.VK_RIGHT && mouseX1 <300 ) {
mouseX1 = mouseY1+2;
mouseY1 = mouseY1;


repaint();
}

if (ev.getKeyCode() == KeyEvent.VK_DOWN && mouseY1 <200) {
mouseX1 = mouseX1;
mouseY1 = mouseY1+2;


repaint();
}

if (ev.getKeyCode() == KeyEvent.VK_UP && mouseY1 >20) {
mouseX1 = mouseX1;
mouseY1 = mouseY1-2;
repaint();
}

if (ev.getKeyCode() == KeyEvent.VK_LEFT && mouseX1 >20) {
mouseX1 = mouseX1-2;
mouseY1 = mouseY1;
repaint();
}[/HIGHLIGHT]

nicht in den GameLoop sondern in die HauptKlasse. Die Überprüfung:
[HIGHLIGHT="Java"]
if (mouseX1 == 20 && ev.getKeyCode() == KeyEvent.VK_LEFT){
System.out.println("Game Over!");
this.gameover = true;
}

if (mouseY1==20 && ev.getKeyCode() == KeyEvent.VK_UP){
System.out.println("Game Over!");
this.gameover = true;
}



if (mouseX1==300 && ev.getKeyCode()== KeyEvent.VK_RIGHT){
System.out.println("Game Over!");
this.gameover = true;
}


if (mouseY1==200 && ev.getKeyCode() == KeyEvent.VK_DOWN){
System.out.println("Game Over!");
this.gameover = true;
}
}[/HIGHLIGHT]
doch auch oder? Was kommt denn dann genau in den GameLoop. In den GameLoop kommt doch das, was ich ständig wiederholen will, das ist nunmal das obere (Code oben). Aber dann mäckert der Editor, dass Variable ev nicht definiert ist.. ( KeyEvent ev)
 

hdi

Top Contributor
Moment mal, einen GameLoop benötigst du ja nur, wenn du automatisch in gewissen
Abständen etwas tun willst. Also nicht durch den User ausgelöst.

Wenn dein Spiel wirklich nur die Figur bewegen soll, wenn du was drückst, und das spiel
ansonsten stillstehen soll, dann brauchst du überhaupt keinen GameLoop...

Zu dem Fehler dass er ev nicht findet: Das ist eine lokale Variable, die ist nur innerhalb
der Listener-Methode sichtbar, ausserhalb gibt es die nicht.
 

StickToFreak

Aktives Mitglied
Nein nein. Es soll ja ein Snake-Spiel werden. Deshalb ist die typed methode schon gut am platz.
Also es soll sich ja von selbst bewegen, per tastendruck hatte ich das ganze ja schon... :D
 
Zuletzt bearbeitet:

hdi

Top Contributor
...und mal nebenbei:

[HIGHLIGHT="Java"]mouseX1 = mouseX1;[/HIGHLIGHT]

da fühlt sich der Compiler verarscht ;) Nimm das doch raus...
 

hdi

Top Contributor
sry ich hab keinen Instant Messanger.

Aber da hast du doch dann die Antwort auf deine Frage, was in den GameLoop reinsoll:
Und zwar soll dort in gewissen Abständen mouseX1 und mouseX2 geändert werden.
Jetzt musst du nur noch die Info reinkriegen, in welche Richtung sich der Wurm grad
bewegt.
Dazu kannst du eine Variable

[HIGHLIGHT="Java"]int currentDirection;
[/HIGHLIGHT]
erstellen (oben, also "global"), und innerhalb der keyTyped da immer das KeyEvent
reinlegen, das grad aufgetreten ist.
Der GameLoop kann dann nachschauen was zuletzt gedrückt wurde.
 

StickToFreak

Aktives Mitglied
:D :D :D :D :D Reine Absicht :D Wollte ihn mal necken^^.

Achja hab das langsam verstanden^^


Edit: Geklärt^^

Neue Frage: es passiert immer noch nichts ôÔ
 
Zuletzt bearbeitet:

StickToFreak

Aktives Mitglied
:D
Sorry du darfst natürlich^^
Aber hier mal der Code:
Einfach mal alles:

[HIGHLIGHT="Java"]
import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class Snake2 extends Applet implements KeyListener {



private int mouseX;
private int mouseX1=150;

private int mouseY;
private int mouseY1=150;

private int radius, diameter = 20;
private Color circleColor = Color.black;
private Color rectColor= Color.black;
int diameter1 = 5;
int diameter2 = 6;
boolean gameover;
boolean links;
boolean rechts;
boolean up;
boolean down;
GameLoop game = new GameLoop();


public void init() {
Dimension full = getSize();
mouseX = full.width/2;
mouseY = full.height/2;
radius=diameter/2;
addKeyListener(this);

}



public void paint (Graphics g) {

g.drawRect(10,10,321,195);
g.setColor(rectColor);

g.setColor(circleColor);
g.fillRect((mouseX1),(mouseY1),diameter1,diameter2);

}

public void keyPressed(KeyEvent ev) {

}

public void keyTyped(KeyEvent ev) {




if (mouseX1 == 20 && ev.getKeyCode() == KeyEvent.VK_LEFT){
System.out.println("Game Over!");
this.gameover = true;
}

if (mouseY1==20 && ev.getKeyCode() == KeyEvent.VK_UP){
System.out.println("Game Over!");
this.gameover = true;
}



if (mouseX1==300 && ev.getKeyCode()== KeyEvent.VK_RIGHT){
System.out.println("Game Over!");
this.gameover = true;
}


if (mouseY1==200 && ev.getKeyCode() == KeyEvent.VK_DOWN){
System.out.println("Game Over!");
this.gameover = true;
}


if (ev.getKeyCode() == KeyEvent.VK_RIGHT && mouseX1 <300 ) {
mouseX1 = mouseY1+2;

this.rechts = true;



}

if (ev.getKeyCode() == KeyEvent.VK_DOWN && mouseY1 <200) {

mouseY1 = mouseY1+2;
this.down = true;



}

if (ev.getKeyCode() == KeyEvent.VK_UP && mouseY1 >20) {
mouseY1 = mouseY1-2;
this.up = true;

}

if (ev.getKeyCode() == KeyEvent.VK_LEFT && mouseX1 >20) {
mouseX1 = mouseX1-2;
this.links = true;

}

}
public void keyReleased(KeyEvent ev) {
}


class GameLoop extends Thread {

public void run(){

game.start();

while(!gameover)

{ if (rechts == true) {
mouseX1 = mouseY1+2;
mouseY1 = mouseY1;


repaint();
}

if (down == true) {
mouseX1 = mouseX1;
mouseY1 = mouseY1+2;


repaint();
}

if (up == true) {
mouseX1 = mouseX1;
mouseY1 = mouseY1-2;
repaint();
}

if (links == true) {
mouseX1 = mouseX1-2;
mouseY1 = mouseY1;
repaint();
}

try{
Thread.sleep(50);
}

catch (InterruptedException ev)
{

}
}


}
}


}[/HIGHLIGHT]
 

hdi

Top Contributor
Das game.start() ruft man auf, damit die run() Methode aufgerufen wird.
Wie du dir jetzt denken kannst, ist das bei dir im Moment eher schlecht realisierbar oder ;)

Also:

game.start()

ans Ende der init-Methode.
 

StickToFreak

Aktives Mitglied
[HIGHLIGHT="Java"]
public void init() {
Dimension full = getSize();
mouseX = full.width/2;
mouseY = full.height/2;
radius=diameter/2;
addKeyListener(this);
game.start();
}[/HIGHLIGHT]


Funktioniert ebenso nicht.

Edit:
Weißt du was? Lass uns das morgen- sorry Heute machen :D auf jedenfall brauchen wir beide jetzt Schlaf :D Ich glaube dann geht das besser^^
 

hdi

Top Contributor
Muss funktionieren, bau mal eine System.out.println() Meldung in die while-Schleife
vom GameLoop rein.

Und mach das gleiche in der keyTyped-Methode. Das müsste beides reagieren,
aber vllt sind wir jetzt bei dem vorher angesprochenen Event Dispatch Problem.

Du erlaubst mir jetzt aber bitte, dass ich mich für heute verabschiede.
Versuch noch n bisschen rum, bau solche Meldungen an verschiedenen Stellen im Code
ein um zu sehen wo es hakt.

gute n8
 

StickToFreak

Aktives Mitglied
Gut gemacht, getan. Mal ein paar System.out.println("Fehler-Test"); eingebaut. GameLoop funktioniert.

aber:

[HIGHLIGHT="Java"]public void keyTyped(KeyEvent ev) {

if (mouseX1 == 20 && ev.getKeyCode() == KeyEvent.VK_LEFT){
System.out.println("Game Over!");
this.gameover = true;
}

if (mouseY1==20 && ev.getKeyCode() == KeyEvent.VK_UP){
System.out.println("Game Over!");
this.gameover = true;
}

if (mouseX1==300 && ev.getKeyCode()== KeyEvent.VK_RIGHT){
System.out.println("Game Over!");
this.gameover = true;
}

if (mouseY1==200 && ev.getKeyCode() == KeyEvent.VK_DOWN){
System.out.println("Game Over!");
this.gameover = true;
}

if (ev.getKeyCode() == KeyEvent.VK_RIGHT && mouseX1 <300 ) {
mouseX1 = mouseY1+2;
this.rechts = true;
System.out.println("Fehler-Test");
}
if (ev.getKeyCode() == KeyEvent.VK_DOWN && mouseY1 <200) {
mouseY1 = mouseY1+2;
this.down = true;
System.out.println("Fehler-Test");
}

if (ev.getKeyCode() == KeyEvent.VK_UP && mouseY1 >20) {
mouseY1 = mouseY1-2;
this.up = true;
System.out.println("Fehler-Test");
}

if (ev.getKeyCode() == KeyEvent.VK_LEFT && mouseX1 >20) {
mouseX1 = mouseX1-2;
this.links = true;
System.out.println("Fehler-Test");
}

}[/HIGHLIGHT]

funktioniert nicht. Ich drücke eine Taste dann sollte ja eigentlich Fehler-Test erscheinen. Tuts nicht.

Dann mal Gute nacht ;)
 

hdi

Top Contributor
So dann flieg ich zwischen Badezimmer und Bett nochmal schnell vorbei:
Bau mal so ne Meldung als allererste Zeile in die keyTyped (ohne irgendein if)

Ich denke es liegt daran dass einfach kein if matcht, weil die mouseX1,mouseY1 Werte
wohl nicht dementsprechend gesetzt sind
 

StickToFreak

Aktives Mitglied
Nein daran liegt es auch nicht siehe da:

[HIGHLIGHT="Java"]
public void keyTyped(KeyEvent ev) {
System.out.println("Fehler-Test");

if (mouseX1 == 20 && ev.getKeyCode() == KeyEvent.VK_LEFT){
System.out.println("Game Over!");
this.gameover = true;
}

if (mouseY1==20 && ev.getKeyCode() == KeyEvent.VK_UP){
System.out.println("Game Over!");
this.gameover = true;
}

if (mouseX1==300 && ev.getKeyCode()== KeyEvent.VK_RIGHT){
System.out.println("Game Over!");
this.gameover = true;
}

if (mouseY1==200 && ev.getKeyCode() == KeyEvent.VK_DOWN){
System.out.println("Game Over!");
this.gameover = true;
}

if (ev.getKeyCode() == KeyEvent.VK_RIGHT && mouseX1 <300 ) {
mouseX1 = mouseY1+2;
this.rechts = true;
System.out.println("Fehler-Test");
}
if (ev.getKeyCode() == KeyEvent.VK_DOWN && mouseY1 <200) {
mouseY1 = mouseY1+2;
this.down = true;
System.out.println("Fehler-Test");
}

if (ev.getKeyCode() == KeyEvent.VK_UP && mouseY1 >20) {
mouseY1 = mouseY1-2;
this.up = true;
System.out.println("Fehler-Test");
}

if (ev.getKeyCode() == KeyEvent.VK_LEFT && mouseX1 >20) {
mouseX1 = mouseX1-2;
this.links = true;

}

}
[/HIGHLIGHT]

Wenn ich nun eine Taste drücke kommt auch keine Meldung.

Edit: Liegt das ganze vllt daran das ich das alles in einem Applet mache? ~.~
 
Zuletzt bearbeitet:

hdi

Top Contributor
Ach ein Applet? Ich denke dein Problem ist, dass dein Applet nicht den Fokus hat.
Ein Listener kann nur reagieren wenn er den Fokus hat.

Wenn du das Applet startest, klick nochmal explizit auf's Fenster, damit es aktiv ist.
Dann sollte das auch alles klappen.
 

StickToFreak

Aktives Mitglied
Ja klar, das weiß ich^^. Nein ich klicke immer drauf. Funktioniert trotzdem nicht.. Keine Fehlermeldungen oder sonstiges. Es passiert einfach nichts *__*.
Hier mal der Code zum reinkopieren in den Editor:

import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class Snake2 extends Applet implements KeyListener {



private int mouseX=150;
private int mouseY=150;
private int radius, diameter = 20;
private Color circleColor = Color.black;
private Color rectColor= Color.black;
private Color EssenColor = Color.red;
int diameter1 = 20;
int diameter2 = 7;
boolean gameover;
boolean links;
boolean rechts;
boolean up;
boolean down;
boolean schlangeplus;
GameLoop game = new GameLoop();
Image img = getToolkit().getImage("Apple-Logo-icon.jpg");




public void init() {
Dimension full = getSize();
mouseX = full.width/2;
mouseY = full.height/2;
radius=diameter/2;
addKeyListener(this);
game.start();

}
public void paint (Graphics g) {
g.drawRect(10,10,320,195);
g.setColor(rectColor);
g.setColor(circleColor);
g.fillRect((mouseX),(mouseY),diameter1,diameter2);

//Essen:
g.setColor(EssenColor);
g.drawImage(img,160,90,this);
g.setColor(EssenColor);
g.drawImage(img,100,40,this);
g.setColor(EssenColor);
g.drawImage(img,200,170,this);
g.setColor(EssenColor);
g.drawImage(img,280,60,this);
g.setColor(EssenColor);
g.drawImage(img,50,160,this);



}

public void keyPressed(KeyEvent ev) {}

public void keyTyped(KeyEvent ev) {
System.out.println("Fehler-Test");


if ((mouseX == 160 && mouseY == 90) || (mouseX == 100 && mouseY == 40) || (mouseX == 200 && mouseY == 190) || (mouseX == 280 && mouseY == 60) || (mouseX == 50 && mouseY == 180) ){
this.schlangeplus = true;
}

if (mouseX == 20 && ev.getKeyCode() == KeyEvent.VK_LEFT){
System.out.println("Game Over!");
this.gameover = true;
}

if (mouseY==20 && ev.getKeyCode() == KeyEvent.VK_UP){
System.out.println("Game Over!");
this.gameover = true;
}

if (mouseX==300 && ev.getKeyCode()== KeyEvent.VK_RIGHT){
System.out.println("Game Over!");
this.gameover = true;
}

if (mouseY==200 && ev.getKeyCode() == KeyEvent.VK_DOWN){
System.out.println("Game Over!");
this.gameover = true;
}

if (ev.getKeyCode() == KeyEvent.VK_RIGHT && mouseX <300 ) {
mouseX = mouseY+2;
this.rechts = true;
System.out.println("Fehler-Test");
}
if (ev.getKeyCode() == KeyEvent.VK_DOWN && mouseY <200) {
mouseY = mouseY+2;
this.down = true;
System.out.println("Fehler-Test");
}

if (ev.getKeyCode() == KeyEvent.VK_UP && mouseY >20) {
mouseY = mouseY-2;
this.up = true;
System.out.println("Fehler-Test");
}

if (ev.getKeyCode() == KeyEvent.VK_LEFT && mouseX >20) {
mouseX = mouseX-2;
this.links = true;
System.out.println("Fehler-Test");
}

}
public void keyReleased(KeyEvent ev) {}

class GameLoop extends Thread {

public void run(){

while(!gameover){

if (schlangeplus == true){
diameter2=diameter2+5;
System.out.println("Aufgesammelt.");
}


if (rechts == true) {
mouseX = mouseY+2;
repaint();
}

if (down == true) {
mouseY = mouseY+2;
diameter2 = diameter2+20;
diameter1 = diameter1-20;
repaint();
}

if (up == true) {
mouseY = mouseY-2;
diameter2 = diameter2-20;
diameter1 = diameter1-20;
repaint();
}

if (links == true) {
mouseX = mouseX-2;
repaint();
}

try{
Thread.sleep(50);
}

catch (InterruptedException ev){}

}


}
}


}

du musst dann nur noch das bild rausnehmen für das Essen...^^ (Apfel.jpg)
 

hdi

Top Contributor
Ach, ich hasse Applets. Sagen wir mal so: Ich kann Applets nicht, ich weiss nur dass da
immer irgendwas nicht funktioniert. (also so, wie es in Applications geht)

Hier is jetz Schluss für mich, dir muss jmd weiterhelfen der sich mit Applets auskennt.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
W KeyListener auf Applet mit Runnable Java Basics - Anfänger-Themen 4
berserkerdq2 Größter unterschied von extends thread und implements runnable? Java Basics - Anfänger-Themen 2
C Runnable Jar-File erzeugen Java Basics - Anfänger-Themen 14
topi relativer Pfad in einem Runnable JAR file Java Basics - Anfänger-Themen 12
krgewb Runnable JAR File Export Java Basics - Anfänger-Themen 11
javajoshi Problem mit zwei Threads und Arrays (Runnable) Java Basics - Anfänger-Themen 12
5 Welchen Sinn hat ein Runnable Java Basics - Anfänger-Themen 6
F Bild in ein Runnable Jar File packen (eclipse) Java Basics - Anfänger-Themen 2
G Moving Objects with Threads (implements Runnable) Java Basics - Anfänger-Themen 1
R Compiler-Fehler Runnable-Jar != Eclipse Java Basics - Anfänger-Themen 5
U Externe Library im non runnable jar File im eclipse Java Basics - Anfänger-Themen 1
K Runnable oder Keyadapter läuft falsch Java Basics - Anfänger-Themen 4
T Java Projekt als runnable jar file exportieren inklusive csv Dateien Java Basics - Anfänger-Themen 4
Helgon Unterschied runnable und normale jar Java Basics - Anfänger-Themen 6
Helgon Interface Runnable Frage / Schnittstellen allgemein Java Basics - Anfänger-Themen 3
6 JDK installieren Runnable Jar Files ausführen?! Java Basics - Anfänger-Themen 8
O Erste Schritte Runnable Jar <- Ordner Fehlen Java Basics - Anfänger-Themen 6
Y Threads extends Thread oder implements Runnable Java Basics - Anfänger-Themen 10
V Kein neuer Thread trotz Runnable Java Basics - Anfänger-Themen 4
F Icon der runnable jar ändern Java Basics - Anfänger-Themen 3
S Bild-Resource in Runnable Jar Java Basics - Anfänger-Themen 15
T Thread oder Runnable? Java Basics - Anfänger-Themen 3
J new Runnable Java Basics - Anfänger-Themen 4
M FileWriter innerhalb runnable Jar Java Basics - Anfänger-Themen 8
M Jpg und wav datei pfadangabe bei Runnable Jar file Java Basics - Anfänger-Themen 2
? Oracle jpr runnable target Java Basics - Anfänger-Themen 2
R Threads / Interface Runnable Java Basics - Anfänger-Themen 7
A Frage zu Datenzugriff bei new Thread(new Runnable) Java Basics - Anfänger-Themen 8
U Projekt als Runnable Jar exportieren Java Basics - Anfänger-Themen 4
P probleme mir Runnable Jar Java Basics - Anfänger-Themen 5
E Zugriff aus einer Runnable auf die Oberklasse Java Basics - Anfänger-Themen 2
chik Problem mit der Runnable Methode Java Basics - Anfänger-Themen 3
S Runnable jar "Could not find main class" Java Basics - Anfänger-Themen 8
F Alternativen zu runnable JAR? Java Basics - Anfänger-Themen 13
F Classpath: Wichtig für Runnable JAR? Java Basics - Anfänger-Themen 2
F Projektstruktur und runnable JAR! Java Basics - Anfänger-Themen 6
F Runnable JAR Programm kann nur über Konsole gestartet werden Java Basics - Anfänger-Themen 9
S runnable jar datei sql fehler Java Basics - Anfänger-Themen 5
G Innerhalb von Runnable auf super. zugreifen? Java Basics - Anfänger-Themen 3
S Was ist "Runnable"? Java Basics - Anfänger-Themen 25
Daniel_L Unterschied Thread und Runnable? Java Basics - Anfänger-Themen 8
W Aus einem Runnable-thread auf einen JFrame zugreifen Java Basics - Anfänger-Themen 5
frau-u Interface Runnable - wie funktionierts? Java Basics - Anfänger-Themen 3
S sleep ohne runnable? Java Basics - Anfänger-Themen 8
P Wie kann ich meine Keylistener Klasse unterscheiden lassen, von welcher "Quelle" der Input kommt? Java Basics - Anfänger-Themen 2
B Bild per KeyListener drehen Java Basics - Anfänger-Themen 1
javalux123 Keylistener auf andere Fenster Java Basics - Anfänger-Themen 3
F Problem mit KeyListener in kombination mit dem ActionListener Java Basics - Anfänger-Themen 4
M KeyListener reagiert nicht Java Basics - Anfänger-Themen 4
M Mit KeyListener Farbe von Label ändern Java Basics - Anfänger-Themen 13
N Java Keylistener Java Basics - Anfänger-Themen 2
B KeyListener funkioniert nicht Java Basics - Anfänger-Themen 2
F KeyListener Java Basics - Anfänger-Themen 3
S Erste Schritte 2D Grafik Probleme mit KeyListener. Java Basics - Anfänger-Themen 18
G KeyListener und JButton vertragen sich nicht Java Basics - Anfänger-Themen 1
J-Gallus Keylistener verstehen Java Basics - Anfänger-Themen 17
S Keylistener Java Basics - Anfänger-Themen 16
S Keylistener im Grafikfenster Java Basics - Anfänger-Themen 3
H Mouse- und KeyListener Probleme? Java Basics - Anfänger-Themen 5
N KeyListener in Thread Java Basics - Anfänger-Themen 0
LexeB4F for schliefe in KeyListener Java Basics - Anfänger-Themen 3
R KeyListener auslagern Java Basics - Anfänger-Themen 3
J KeyListener aus anderer Klasse bereitet Probleme Java Basics - Anfänger-Themen 1
Z KeyListener funktioniert nicht? Weshalb? Java Basics - Anfänger-Themen 8
T KeyListener Java Basics - Anfänger-Themen 2
Gfreak23 Input/Output KeyListener funktioniert auf Laptop nicht allerdings auf Tower-PC Java Basics - Anfänger-Themen 8
J KeyListener - mal wieder... Java Basics - Anfänger-Themen 2
TheSorm KeyListener Problem Java Basics - Anfänger-Themen 4
M KeyListener Java Basics - Anfänger-Themen 3
S KeyListener/ActionListener/paint()/repaint() Java Basics - Anfänger-Themen 3
D KeyListener nicht mehr aktiv nach ActionPerformed Java Basics - Anfänger-Themen 2
C Mehrere Tasten beim KeyListener gleichzeitig lesen Java Basics - Anfänger-Themen 2
L Input/Output Java 3D mit KeyListener Java Basics - Anfänger-Themen 1
S KeyListener reagiert nicht. Java Basics - Anfänger-Themen 4
L KeyListener ohne textfeld Java Basics - Anfänger-Themen 4
J KeyListener,MouseListener,MouseMotionListener und static Java Basics - Anfänger-Themen 7
P Klassen Bei KeyEvent in KeyListener den Tastendruck abbrechen Java Basics - Anfänger-Themen 5
B KeyListener als allgemeine Methode Java Basics - Anfänger-Themen 5
H KeyListener auf ganzes Fenster setzen Java Basics - Anfänger-Themen 14
0 KeyListener ausserhalb der Applikation Java Basics - Anfänger-Themen 5
G KeyListener Java Basics - Anfänger-Themen 4
D KeyListener und ActionListener Problem Java Basics - Anfänger-Themen 6
J KeyListener funtioniert nicht! Java Basics - Anfänger-Themen 3
J KeyListener Java Basics - Anfänger-Themen 11
P Input/Output KeyListener reagiert nicht Java Basics - Anfänger-Themen 4
G KeyListener, Fokus Java Basics - Anfänger-Themen 8
K Input/Output KeyListener funktioniert nicht Java Basics - Anfänger-Themen 3
A Input/Output Keylistener Aktiv schalten Java Basics - Anfänger-Themen 8
J keyListener - Genau 1 Aktion soll bei 1 Tastenausdruck ausgeführt werden Java Basics - Anfänger-Themen 11
S KeyListener Java Basics - Anfänger-Themen 2
A Erste Schritte Problem mit KeyListener Java Basics - Anfänger-Themen 6
Maxim6394 KeyListener geht nicht Java Basics - Anfänger-Themen 15
A Wie KeyListener adden? Java Basics - Anfänger-Themen 15
Maxim6394 KeyListener funktioniert nicht Java Basics - Anfänger-Themen 20
U KeyListener StackOverflowError Java Basics - Anfänger-Themen 2
M Apfel-Spiel KeyListener Java Basics - Anfänger-Themen 33
J KeyListener (keyTyped) funktioniert nicht Java Basics - Anfänger-Themen 9
Luk10 KeyListener Java Basics - Anfänger-Themen 13
S KeyListener aus anderer Klasse hinzufügen Java Basics - Anfänger-Themen 19
P KeyListener im Applet Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben