Applet -> GameLoop + Listener / Listener funktioniert nicht

Status
Nicht offen für weitere Antworten.

StickToFreak

Aktives Mitglied
Hey Leute,

Zuerst mal der Code für euch:

[HIGHLIGHT="Java"]
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("Apfel.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){}

}


}
}


}
[/HIGHLIGHT]

Okay. Also, wie ihr vllt. schon gesehen habt, wurde mir schon gehlofen (http://www.java-forum.org/anfaengerfragen/80133-runnable-keylistener.html) Nur jetzt hab irgendwie das Problem, dass wenn ich das Applet starte, nichts passiert. D.h. alles ist so wie es sein sollte - nur wenn ich eine Taste drücke sollte sich das Objekt bewegen (Snake-Like) und zwar im GameLoop - keyTyped. Nur irgendwie funktioniert das ganze nicht.
Wo liegt der Fehler 😀 ?

Grüße
StickToFreak

Edit: Ich hab schon mit System.out.println("Fehler-Test"); probiert zu gucken wo der Fehler liegt, im GameLoop funktioniert der System.out.println aber weder in einer if-Abfrage im keyTyped noch ganz am Anfang vom keyTyped:
[HIGHLIGHT="Java"]
public void keyTyped(KeyEvent ev) {
System.out.println("Fehler-Test");


if //[...]
[/HIGHLIGHT]

Ich hab keine Ahnung wo der Fehler liegen könnte^^
 
Zuletzt bearbeitet:
Ich nochmal: Welche Tasten drückst du denn? Die Pfeiltasten?
Versuch's mal mit irgendwelchen anderen Tasten, irgendwelche Buchstaben usw.

Bei mir reagiert er auf "normale" Tasten schon, aber nicht auf zB Pfeiltasten...

Aber keine Ahnung was das soll, is sicher ein Applet-Eigending.
 
Gut jetzt hab ich das ganze mal durch W,A,S,D ersetzt
Up=W
Down=S
Links=A
Rechts=D

Fehler test funktioniert, aber nicht, dass sich das Objekt bewegt...
 
mouseX und mouseY sind anfangs beide 100.
Keine deiner if-Abfragen trifft auf diesen Fall zu.
Ich verstehe eh nich was diese ganzen Abfragen sollen.

Du musst nur das Objekt bewegen, ohne irgendwelche Koordinaten-Abfragen,
und dann musst du überprüfen, ob die neuen Koordinaten im Gameover-Bereich
liegen. Wenn ja, dann setzt du gameover auf true.

Und nochwas: Deine Herangehensweise mit den booleans links,rechts,up,down
ist nicht so gut. Du musst eig. immer alle anderen auf false setzen, sonst sind
nach ein paar Tastendrücke ALLE true, und woher willst du jetz wissen welche
zuletzt gedrückt wurde?

Das is quatsch. Mach es so wie ich es dir gesagt hatte:

EINE int-Variable "currentDirection"und dort speicherst du das VK_whatever rein.
 
Okay, also das mit den Koordinaten in den if - Abfragen soll nur bedeuten dass das Objekt dann nciht mehr weiter kann, wenn ich das weglasse wird bei gameover= true zwar ausgegeben "Game Over" aber das Objekt kann man trotzdem weiter bewegen. oder soll ich dann Thread.stop() machen?
Und wie soll dass dann mit dem CurrentDirection aussehen?


Edit: mouseX und Y sind anfangs beide 150, dh die if abfragen treffen nicht zu aber das objekt kann sich nur solange bewegen währen z.B. kleiner als 300 ist. Was der fall ist. Der Gameover-bereich ist momentan nur dazu da um auszugeben "Game Over" per System.out.println();.
Und das mit dem booleans, soll ich dann immer sagen

i[HIGHLIGHT="Java"]f(/*[...]*/VK_links){
down=false;
up=false;
right=false;
links=true;
} [/HIGHLIGHT]

Und das dann mit allen richtungen?
Dann würde ich doch die CurrentDirection umgehen, weil ich hatte mal so ne Datei wo ich das gemacht habe mit dem int CurrentDirection (bzw so ähnlich) aber find sie nicht mehr, und habe jetzt keine ahnugn wie ich das machen könnte^^.
 
Zuletzt bearbeitet:
als globale Variable definieren:

[HIGHLIGHT="Java"]int currentDirection;[/HIGHLIGHT]

in der keyTyped:

[HIGHLIGHT="Java"]currentDirection = ev.getKeyCode();
[/HIGHLIGHT]
im gameloop:

[HIGHLIGHT="Java"]switch(currentDirection){
case VK_A:
// bewege wurm nach links
break;
case VK_D:
// nach rechts
break;
// usw
}[/HIGHLIGHT]
 
Gucke mal Edit^^:
mouseX und Y sind anfangs beide 150, dh die if abfragen treffen nicht zu aber das objekt kann sich nur solange bewegen währen z.B. kleiner als 300 ist. Was der fall ist. Der Gameover-bereich ist momentan nur dazu da um auszugeben "Game Over" per System.out.println();.
Und das mit dem booleans, soll ich dann immer sagen

i
Java Code:
Link mit Fenster
[HIGHLIGHT="xml"]

f(/*[...]*/VK_links){

down=false;

up=false;

right=false;

links=true;

}[/HIGHLIGHT]


Und das dann mit allen richtungen?
Dann würde ich doch die CurrentDirection umgehen, weil ich hatte mal so ne Datei wo ich das gemacht habe mit dem int CurrentDirection (bzw so ähnlich) aber find sie nicht mehr, und habe jetzt keine ahnugn wie ich das machen könnte^^.
 
Also... deine keyTyped Methode macht nichts! Es geht zwar rein, aber
keine if-Abfrage ist wahr. So, also was soll jetz passieren? NIX!
Die keyTyped soll nur den Wurm bewegen, unabhängig von seiner Position!
Lass das erstmal alles mit Koorindaten-Abfragen und mit Gameover, mein Gott
dann geht er halt irgendwann ausm Fenster, was solls.

Das musst du ändern. Diese booleans für richtungsangabe alle raushauen,
und das so machen, wie ich es grad vorhin dir gezeigt hab mit currentDirection.
Wenn das klappt, kannste die GameOver Abfragen wieder rein tun.
 
So. Jetzt hab ich das ganze so:

[HIGHLIGHT="Java"]
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class Snake3 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;
int currentDirection;
boolean down;
boolean up;
boolean right;
boolean left;
GameLoop game = new GameLoop();

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);
}

public void keyPressed(KeyEvent ev) {
}

public void keyTyped(KeyEvent ev) {

currentDirection = ev.getKeyCode();

if (ev.getKeyCode() == KeyEvent.VK_D) {
mouseX = mouseY+2;
this.right = true;

}
if (ev.getKeyCode() == KeyEvent.VK_W) {
mouseY = mouseY-2;
this.up = true;

}

if (ev.getKeyCode() == KeyEvent.VK_A) {
mouseX = mouseX-2;
this.left = true;

}

if (ev.getKeyCode() == KeyEvent.VK_S) {
mouseY = mouseY+2;
this.down = true;

}



}

public void keyReleased(KeyEvent ev) {
}

class GameLoop extends Thread {

public void run(){
switch(currentDirection){

case KeyEvent.VK_D:
if (right == true) {
mouseX = mouseY+2;
repaint();
}

break;
case KeyEvent.VK_S:

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

break;
case KeyEvent.VK_W:

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

break;
case KeyEvent.VK_A:

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

break;
}

try{
Thread.sleep(50);
}

catch (InterruptedException ev){}

}
}
}

[/HIGHLIGHT]

Passiert auch nichts. Hab ich was übersehen?

Edit: Was mir grade auffällt: Brauch ich oben in der Hauptklasse bei Methode keyTyped überhaupt mouseX = mouseX+2; , weil ich hab das ja eigentlich im GameLoop...?!
 
Zuletzt bearbeitet:
och junge 😉

Ich sag jetzt zum dritten mal: LÖSCH diese up,down,left,right booleans...

dafür hast du ja jetzt currentDirection, wenn der case VK_A, dann WEISST du,
dass du ihn nach links bewegen sollst. Da brauchst du keine Abfrage mehr machen.

Du musst nur schauen dass du in der KeyTyped das Event in diese
currentdirection Variable reinspeicherst, und dann klappt das auch.
 
Gut und wie mach ich dem keyTyped das klar das der den KeyEvent da gefälligst reinspeichern soll 😀 ? Soll ich ihn anschreien 😀? 😀
 
Wie machst du dem keyTyped denn klar, dass gameover true sein soll?
Was ist eine Zuweisung? Also das weisst du ja wohl oder?

[HIGHLIGHT="Java"]currentDirection = ev.getKeyCode();[/HIGHLIGHT]

fertisch.
 
Wie du oben sehen kannst, hatte ich das schon drinne >.<

So wie ich es jetzt habe:

[HIGHLIGHT="Java"]import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class Snake3 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;
int currentDirection;
GameLoop game = new GameLoop();

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);
}

public void keyPressed(KeyEvent ev) {
}

public void keyTyped(KeyEvent ev) {


if (ev.getKeyCode() == KeyEvent.VK_D) {
currentDirection = ev.getKeyCode();}

if (ev.getKeyCode() == KeyEvent.VK_W) {
currentDirection = ev.getKeyCode();}

if (ev.getKeyCode() == KeyEvent.VK_A) {
currentDirection = ev.getKeyCode();}

if (ev.getKeyCode() == KeyEvent.VK_S) {
currentDirection = ev.getKeyCode();}
}

public void keyReleased(KeyEvent ev) {
}

class GameLoop extends Thread {

public void run(){
switch(currentDirection){

case KeyEvent.VK_D:
mouseX = mouseY+2;
repaint();


break;
case KeyEvent.VK_S:


mouseY = mouseY+2;
diameter2 = diameter2+20;
diameter1 = diameter1-20;
repaint();
break;

case KeyEvent.VK_W:
mouseY = mouseY-2;
diameter2 = diameter2-20;
diameter1 = diameter1-20;
repaint();
break;

case KeyEvent.VK_A:
mouseX = mouseX-2;
repaint();
break;
}

try{
Thread.sleep(50);
}

catch (InterruptedException ev){}

}
}
}[/HIGHLIGHT]

Edit: Merkst du ausserdem was nebenbei 😀 Es sind schon wieder nur wir beide 😀
 
Naja das ist jetzt halb richtig.
Zumindest bewegt sich dein Wurm jetzt schon oder?
Und er ändert auch die Richtung wenn du was drückst (wenn auch verspätet).

Ich kanns leider nicht testen weil hier gibts noch den Bug dass er die Zeilennummern
mitkopiert, und ich werd jetz nich 100 Zeilennummern per Hand aus dem Code
löschen.
 
😀 😀 Okay, dass verstehe ich^^.

Nein er tut sich nicht bewegen.
Auch nicht verspätet.

Code:
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class Snake3 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;
int currentDirection;
GameLoop game = new GameLoop();

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);
}

public void keyPressed(KeyEvent ev) {
}

public void keyTyped(KeyEvent ev) {


if (ev.getKeyCode() == KeyEvent.VK_D) {
currentDirection = ev.getKeyCode();}

if (ev.getKeyCode() == KeyEvent.VK_W) {
currentDirection = ev.getKeyCode();}

if (ev.getKeyCode() == KeyEvent.VK_A) {
currentDirection = ev.getKeyCode();}

if (ev.getKeyCode() == KeyEvent.VK_S) {
currentDirection = ev.getKeyCode();}
}

public void keyReleased(KeyEvent ev) {
}

class GameLoop extends Thread {

public void run(){
switch(currentDirection){

case KeyEvent.VK_D:
mouseX = mouseY+2;
repaint();

                    
break;
case KeyEvent.VK_S:


mouseY = mouseY+2;
diameter2 = diameter2+20;
diameter1 = diameter1-20;
repaint();
break;

case KeyEvent.VK_W:
mouseY = mouseY-2;
diameter2 = diameter2-20;
diameter1 = diameter1-20;
repaint();
break;

case KeyEvent.VK_A:
mouseX = mouseX-2;
repaint();
break;
}

try{
Thread.sleep(50);
}

catch (InterruptedException ev){}

                                  }
                                    }
                                      }

Einmal zum kopieren.^^
 
Zuletzt bearbeitet von einem Moderator:
Ja und wo ist jetzt deine while-Schleife?
Die muss natürlich schon noch rein.
Das switch komm da rein, und ein sleep nich vergessen (mach mal sleep(250))
 
[HIGHLIGHT="Java"]import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class Snake3 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;
int currentDirection;
boolean gameover;
GameLoop game = new GameLoop();

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);
}

public void keyPressed(KeyEvent ev) {
}

public void keyTyped(KeyEvent ev) {

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

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

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

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


if (ev.getKeyCode() == KeyEvent.VK_D) {
currentDirection = ev.getKeyCode();}

if (ev.getKeyCode() == KeyEvent.VK_W) {
currentDirection = ev.getKeyCode();}

if (ev.getKeyCode() == KeyEvent.VK_A) {
currentDirection = ev.getKeyCode();}

if (ev.getKeyCode() == KeyEvent.VK_S) {
currentDirection = ev.getKeyCode();}
}

public void keyReleased(KeyEvent ev) {
}

class GameLoop extends Thread {

public void run(){

while(!gameover){


switch(currentDirection){

case KeyEvent.VK_D:
mouseX = mouseY+2;
repaint();


break;
case KeyEvent.VK_S:


mouseY = mouseY+2;
diameter2 = diameter2+20;
diameter1 = diameter1-20;
repaint();
break;

case KeyEvent.VK_W:
mouseY = mouseY-2;
diameter2 = diameter2-20;
diameter1 = diameter1-20;
repaint();
break;

case KeyEvent.VK_A:
mouseX = mouseX-2;
repaint();
break;
}

try{
Thread.sleep(250);
}

catch (InterruptedException ev){}
}
}
}
}[/HIGHLIGHT]
Auch mit, funktionierts nich...
 
Ja die keyTyped matcht komischerweise mit keiner if-Abfrage.
Die methode selbst wird aufgerufen, aber er reagiert nicht auf diese Tasten
irgendwie.

Hm... grad keine Ahnung, ich muss mal was essen hier, google mal nach
dem Problem:

Applet keylistener keycode keyevent
oder so
 
Naja nicht wirklich was gefunden ~.~. Aber ich hab das ganze mal in die keyPressed methode reingesteckt, und mal eine Taste gedrückt.. Funktioniert. Es muss irgendwie an der keyTyped liegen -.- 😀

(Hat's geschmeckt 😀 )
 
Naja eine Taste drücken funzt auch in der keyTyped.

Aber er mathct nicht auf VK_A/W/S/D.

Lass dir mal per System.out.println den keyCode anzeigen, dann siehste ja
was er da interpretiert wenn du diese Tasten drückst.
 
Gut ich hab einfahc mal aus Jucks und Dollerrei in keyPressed, keyTyped und keyReleased die Abfragen reinkopiert. Siehe da, es funktioniert.. 😀
 
Ja in keyPressed funzt es, in keyTyped nicht. Strange, aber lösch es aus keyReleased
raus sonst wird jede Aktion beim Tastendruck 2x ausgeführt.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben