Hallo Leute, habe folgendes Problem und komm irgendwie nicht weiter. Hab nen Programm, welches über nen EchoServer läuft. Die Methode fliegen() aus der Klasse Ball, die den Ball auf der x-Achse bei jedem Durchlauf um eins verschiebt, wird nur einmal ausgeführt.
Ich find den Fehler nicht.
Seht ihr ihn?
Nun das Applet:
Ich find den Fehler nicht.
Seht ihr ihn?
Java:
import java.awt.*;
public class Ball {
private int radius = 10;
private Color color = Color.BLACK;
private int x = 300; //x-koordinate des Balles
private int y = 200; //y-koordinate des Balles
public Ball(int x, int y, int dx, int dy) {
this.x = x;
this.y = y;
this.dx = dx;
this.dy = dy;
}
public Ball(int x, int y, int dx, int dy, int radius, Color color) {
this.x = x;
this.y = y;
this.dx = dx;
this.dy = dy;
this.radius = radius;
this.color = color;
}
public void paint(Graphics g) {
g.setColor(color);
g.fillOval(x - radius, y - radius, 2 * radius, 2 * radius); //zeichne Ball
}
public void setPosition(int nx, int ny) {
x = nx;
y = ny;
}
public void setSpeed(int nvx, int nvy) {
dx = nvx;
dy = nvy;
}
public void setDy(int dy){
this.dy = dy;
}
public void setX(int x){
this.x = x;
}
public int getDx() {
return dx;
}
public int getDy() {
return dy;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public int getRadius() {
return radius;
}
public void fliegen(){
// Verändern der x-y- Koordinaten
x++;
//x += dx;
//y += dy;
}
public void rwx(){
dx=-(dx);
}
public void neuerBall()
{
x = 300; //feld.width/2;
y = 200; //feld.height/2;
rwx();
}
}
Nun das Applet:
Java:
import java.applet.*;
import java.awt.*;
import java.io.IOException;
import java.net.Socket;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.OutputStreamWriter;
import java.io.BufferedWriter;
public class PongAppletEcho extends Applet implements Runnable
{
// Initialisierung der Variablen
private static final long serialVersionUID = 1L;
Dimension feld = new Dimension(600, 400);
Dimension balken = new Dimension(10,100);
int balkenX=6; //x-Koordinate des Balkens
int balkenY=300; //y-Koordinate des Balkens
int speed_xtemp; //temperärer Speicher, wenn man mit der Leertaste den Ball anhalten will (x-koordinate)
int speed_ytemp; //temperärer Speicher, wenn man mit der Leertaste den Ball anhalten will (y-koordinate)
// Variablen für die Doppelpufferung zum Verhindern, dass der Ball nicht während des Fluges ruckelt
private Image dbImage;
private Graphics dbg;
private Socket socket=null;
private String address = "127.0.0.1";
private TextField tx;
private BufferedWriter writer;
private BufferedReader reader;
private String answer;
private Thread th;
Ball b1 = new Ball(300,200,-7,7);
public void init()
{
setBackground(Color.WHITE); //weisse Hintergrundfarbe
try {
socket = new Socket(address, 9000);
writer= new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
}
catch (IOException e) {
System.err.println("Exception: couldn't create stream socket");
System.exit(1);
}
tx = new TextField(20);
tx.setLocation(20, 120);
add(tx);
this.setSize(600, 400);
setFocusable(true);
}
public void start(){
// Schaffen eines neuen Threads, in dem das Spiel läuft
th = new Thread(this);
// Starten des Threads
th.start();
}
public void stop(){
th.stop();
try {
writer.close();
reader.close();
socket.close();
}
catch (IOException e) {
System.err.println("Exception: I/O error trying to talk to server");
}
}
public void destroy(){}
public boolean mouseMove(Event evt, int x, int y){
if (balkenY+(balken.height/2)!=y && balkenY >= 5){
balkenY=y-(balken.height/2);
}else if (balkenY+(balken.height/2)!=y && balkenY+balken.height<= feld.height-5){
balkenY=y-(balken.height/2);
}
System.out.println("x-wert: " +x+ ", und y= "+y);
return true;
}
//Tastatur-Listener
public boolean keyDown(Event e, int key)
{
// Obere Cursortaste gedrückt
if (key == Event.UP && balkenY >= 5) {
// Ändern des Richtunsvektors so dass sich der Balken nach Oben bewegt (Y - Position wird kleiner)
balkenY = balkenY -10;
}
// Untere Cursortaste gedrückt
else if (key == Event.DOWN && balkenY+balken.height<= feld.height-5) {
// Ändern des Richtunsvektors so dass sich der Balken nach Unten bewegt (Y - Position wird grösser)
balkenY = balkenY + 10;
}
/*
// PAUSE -> Space Taste gedrückt (hat den Wert 32!)
else if (key == 32 && dx != 0) {
// Stoppen des Balles (x_speed = 0)
speed_xtemp = dx;
speed_ytemp = dy;
dx = 0;
dy = 0;
} else if (key == 32 && dx == 0) {
// Ball fliegt mit vorheriger Geschwindigkeit weiter
dx = speed_xtemp;
dy = speed_ytemp;
} else {
// Zusätzlich Ausgeben eines nicht behandelten Wertes auf die Standardausgabe (damit bekommt man die Werte der Tasten ausgegeben)
System.out.println("Charakter: " + (char) key + " Integer Value: "+ key);
}
*/
// NICHT VERGESSEN, immer:
return true;
}
public void ballverhalten(Ball ball){
// Wenn der Ball den rechten Rand berührt, dann prallt er ab
if (ball.getX()+ball.getRadius() >= feld.width)
{
ball.rwx();
}
//oberer Rand und unterer Rand
else if ((ball.getY()+ball.getRadius() >= feld.height-2) || (ball.getY()-ball.getRadius() <= 2))
{
ball.setDy(-(ball.getDy()));
}
// Ball ist am linken Rand und berührt Balken
else if (ball.getY()-ball.getRadius() <= balkenX+balken.width&& ball.getY() >= balkenY && ball.getY() <= balkenY+balken.height)
{
ball.rwx();
}
else if ((ball.getX()-ball.getRadius() <= balkenX+balken.width) && (ball.getY()< balkenY || ball.getY()>balkenY+balken.height)){ //wenn der Ball im linken Aus ist
ball.neuerBall();
}
}
public void run() {
// Erniedrigen der ThreadPriority um zeichnen zu erleichtern
Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
// Solange true ist läuft der Thread weiter
while (true) {
//ballverhalten();
b1.fliegen();
repaint(); // Neuzeichnen des Applets
try{
answer=reader.readLine();
tx.setText(answer);
}
catch (IOException e) {
System.err.println("Exception: I/O error trying to talk to server");
}
try {
// Stoppen des Threads für in Klammern angegebene Millisekunden
Thread.sleep(20);
} catch (InterruptedException ex) {
// braucht nix zu machen
}
// Zurücksetzen der ThreadPriority auf Maximalwert
Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
}
}
/*
//Update - Methode, Realisierung der Doppelpufferung zur Reduzierung des Bildschirmflackerns
public void update(Graphics g) {
// Initialisierung des DoubleBuffers
if (dbImage == null) {
dbImage = createImage(this.getSize().width, this.getSize().height);
dbg = dbImage.getGraphics();
}
// Bildschirm im Hintergrund löschen
dbg.setColor(getBackground());
dbg.fillRect(0, 0, this.getSize().width, this.getSize().height);
// Auf gelöschten Hintergrund Vordergrund zeichnen
dbg.setColor(getForeground());
paint(dbg);
// Nun fertig gezeichnetes Bild Offscreen auf dem richtigen Bildschirm anzeigen
g.drawImage(dbImage, 0, 0, this);
}
*/
public void paint(Graphics g) {
b1.paint(g);
g.setColor(Color.BLACK); //Füllfarbe der zu zeichnenden Objekte (hier: Balken und Ball)
//g.fillOval(x - radius, y - radius, 2 * radius, 2 * radius); //zeichen Ball
g.fillRoundRect(balkenX, balkenY, balken.width, balken.height, 10, 10); //zeichne abgerundeten Balken
}
}