Hallo Leute,
im folgenden seht ihr die Anfänge eines Pong-Spiels. Aber iwie will der Ball nicht am Schläger abprallen. Seht ihr den Fehler??? ???:L
im folgenden seht ihr die Anfänge eines Pong-Spiels. Aber iwie will der Ball nicht am Schläger abprallen. Seht ihr den Fehler??? ???:L
Java:
import java.awt.*;
/*import java.io.IOException;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.OutputStreamWriter;
import java.io.BufferedWriter;
*/
public class Ball {
private int radius = 10;
private Color color = Color.WHITE;
private int x = 300; //x-koordinate des Balles
private int y = 200; //y-koordinate des Balles
private int dx = -7; //Anzahl der Pixel, um die der Ball in x-Richtung pro Animation verschoben wird
private int dy = 7; //Anzahl der Pixel, um die der Ball in y-Richtung pro Animation verschoben wird
/*
private String str;
private BufferedWriter writer;
private BufferedReader reader;
*/
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((int)(x-radius), (int)(y-radius), radius*2, radius*2);
g.fillOval(x - radius, y - radius, 2 * radius, 2 * radius); //zeichen 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 += dx;
y += dy;
/*
str = "X: " + x + " ,Y: " + y;
try {
writer.write(str + "\n",0,str.length()+1);
writer.flush();
}
catch (IOException e) {
System.err.println("Exception: I/O error trying to talk to server");
}
*/
}
public void rwx(){
dx=-(dx);
}
public void neuerBall()
{
x = 300; //feld.width/2;
y = 200; //feld.height/2;
rwx();
}
}
Java:
import java.awt.*;
import java.awt.Color;
import java.awt.Graphics;
public class Schlaeger extends Dimension{
private static final long serialVersionUID = 1L;
private int width = 10;
private int height = 100;
private Color color = Color.BLACK;
private int x = 6; //x-Koordinate des Balkens
private int y = 300; //y-Koordinate des Balkens
public Schlaeger(int x, int y) {
this.x = x;
this.y = y;
}
public Schlaeger(int x, int y, int width, int height, Color color) {
this.x = x;
this.y = y;
this.width = width;
this.height = height;
this.color = color;
}
public void paint(Graphics g) {
g.setColor(color);
//g.fillRect((int)(x-width/2), (int)(y-height/2), width, height);
g.fillRoundRect(x, y, width, height, 10, 10); //zeichne abgerundeten Balken
}
public void setPosition(int nx, int ny) {
x = nx;
y = ny;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
public void setY(int y){
this.y=y;
}
}
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;
//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;
Spielfeld spielfeld = new Spielfeld (600,400);
Ball b1 = new Ball(300,200,-7,7);
Schlaeger s1 = new Schlaeger(6,300,10,100,Color.WHITE);
//----------------------------------------------------------
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 (s1.getY()+((s1.getHeight())/2)!=y && s1.getY() >= 5){
s1.setY((int)(y-((s1.getHeight())/2)));
}else if (s1.getY()+((s1.getHeight())/2)!=y && s1.getY()+(s1.getHeight())<= spielfeld.getHeight()-5){
s1.setY((int)(y-((s1.getHeight())/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 && s1.getY() >= 5) {
// Ändern des Richtunsvektors so dass sich der Balken nach Oben bewegt (Y - Position wird kleiner)
s1.setY(s1.getY()-10);
}
// Untere Cursortaste gedrückt
else if (key == Event.DOWN && s1.getY()+s1.getHeight()<= spielfeld.getHeight()-5) {
// Ändern des Richtunsvektors so dass sich der Balken nach Unten bewegt (Y - Position wird grösser)
s1.setY(s1.getY()+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, Spielfeld spielfeld, Schlaeger schlaegerLinks){
// Wenn der Ball den rechten Rand berührt, dann prallt er ab
if (ball.getX()+ball.getRadius() >= spielfeld.getWidth())
{
ball.rwx();
}
//oberer Rand und unterer Rand
else if ((ball.getY()+ball.getRadius() >= spielfeld.getHeight()-10) || (ball.getY()-ball.getRadius() <= 10))
{
ball.setDy(-(ball.getDy()));
}
// Ball ist am linken Rand und berührt Balken
else if (ball.getX()-ball.getRadius() <= schlaegerLinks.getX()+schlaegerLinks.getWidth()&& ball.getY() >= schlaegerLinks.getY() && ball.getY() <= schlaegerLinks.getY()+schlaegerLinks.getHeight())
{
ball.rwx();
}
else if ((ball.getX()-ball.getRadius() <= schlaegerLinks.getX()+schlaegerLinks.getWidth()) && (ball.getY()< schlaegerLinks.getY() || ball.getY()>schlaegerLinks.getY()+schlaegerLinks.getHeight())){ //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) {
//System.out.println("Ball X: " +b1.getX()+" Y: "+b1.getY()+ " Balken X: " +s1.getX()+" Y: "+s1.getY());
ballverhalten(b1,spielfeld,s1);
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) {
spielfeld.paint(g);
g.setColor(Color.WHITE); //Füllfarbe der zu zeichnenden Objekte (hier: Balken und Ball)
//g.fillOval(x - radius, y - radius, 2 * radius, 2 * radius); //zeichen Ball
s1.paint(g);
b1.paint(g);
}
}