Hi,
Ich habe mal ein PingPong programmiert mit dem AWT und es funktioniert auch.
Nur der Bildschirm flackert, weil ich zu oft repaint(); aufrufe und ich weiß nicht wie ich das reduzieren soll ohne das der Ball komisch rumspringt und da habe ich noch ein Bug das der Ball manchmal durch die Wand des Players durch glitscht und ich habe für die beiden Probleme keine Lösung gefunden .Ich hoffe ihr könnt mir mal helfen den Code zu verbessern.Bitte seit nicht so streng das ist mein erstes Grafikprogramm mit dem AWT und mein erstes Game.Ich poste mal den Code
PingPong.java (Hauptklasse)
WindowClosingAdapter.java
SpielStarten.java (steuert denn Spiel ablauf)
Ich habe mal ein PingPong programmiert mit dem AWT und es funktioniert auch.
Nur der Bildschirm flackert, weil ich zu oft repaint(); aufrufe und ich weiß nicht wie ich das reduzieren soll ohne das der Ball komisch rumspringt und da habe ich noch ein Bug das der Ball manchmal durch die Wand des Players durch glitscht und ich habe für die beiden Probleme keine Lösung gefunden .Ich hoffe ihr könnt mir mal helfen den Code zu verbessern.Bitte seit nicht so streng das ist mein erstes Grafikprogramm mit dem AWT und mein erstes Game.Ich poste mal den Code
PingPong.java (Hauptklasse)
Java:
package de.ostylk.pingpong;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
public class PingPong extends Frame implements KeyListener{
static Random r = new Random(200);
public static int xBall = r.nextInt(200);
public static int yLinks = 200;
public static int yRechts = 200;
public static int yBall = r.nextInt(200);
public static int winner = 0;
static SpielStarten ss = new SpielStarten();
public static void main(String[] args) {
ss.start();
}
public PingPong() {
super("Ping Pong");
addWindowListener(new WindowClosingAdapter(true));
setSize(700,500);
setVisible(true);
setBackground(Color.BLACK);
addKeyListener(this);
}
public void paint(Graphics g)
{
g.setColor(Color.WHITE);
g.fillRect(10, yLinks, 20, 80);
g.fillRect(670, yRechts, 20, 80);
g.fillOval(xBall, yBall, 20, 20);
if(winner == 1) {
g.drawString("Player 1 hat gewonnen", 350,350);
g.drawString("Drücken sie Enter zum Neustart", 350, 360);
}
else if(winner == 2) {
g.drawString("Player 2 hat gewonnen", 350,350);
g.drawString("Drücken sie Enter zum Neustart", 350, 360);
}
}
public void keyPressed(KeyEvent event) {
if(event.getKeyCode() == KeyEvent.VK_S) {
if(yLinks >= 450) {
return;
}
yLinks += 50;
repaint();
}
if(event.getKeyCode() == KeyEvent.VK_W) {
if(yLinks <= 30) {
return;
}
yLinks -= 50;
repaint();
}
if(event.getKeyCode() == KeyEvent.VK_UP) {
if(yRechts <= 30) {
return;
}
yRechts -= 50;
repaint();
}
if(event.getKeyCode() == KeyEvent.VK_DOWN) {
if(yRechts >= 450) {
return;
}
yRechts += 50;
repaint();
}
if(event.getKeyCode() == KeyEvent.VK_ENTER) {
ss.bol1 = false;
ss.bol2 = false;
ss.win = 0;
yLinks = 200;
yRechts = 200;
xBall = r.nextInt(200);
yBall = r.nextInt(200);
winner = 0;
System.out.println(ss.win);
}
}
public void keyReleased(KeyEvent event) {
}
public void keyTyped(KeyEvent event) {
}
}
WindowClosingAdapter.java
Java:
package de.ostylk.pingpong;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class WindowClosingAdapter extends WindowAdapter{
private boolean exitSystem;
public WindowClosingAdapter(boolean exitSystem) {
this.exitSystem = exitSystem;
}
public WindowClosingAdapter() {
this(false);
}
public void windowClosing(WindowEvent event) {
event.getWindow().setVisible(false);
event.getWindow().dispose();
if(exitSystem) {
System.exit(0);
}
}
}
SpielStarten.java (steuert denn Spiel ablauf)
Java:
package de.ostylk.pingpong;
public class SpielStarten extends Thread{
PingPong pp = new PingPong();
boolean bol1 = false;
boolean bol2 = false;
int win = 0;
public SpielStarten() {
Timer t = new Timer();
t.start();
}
class Timer extends Thread{
synchronized public void run() {
while(true) {
pp.repaint();
try {
Thread.sleep(60);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
//Das Spiel
synchronized public void run () {
while(true) {
//Hier wird in den Ball bewegung eingehaucht :D
if(!bol1 && !bol2) {
pp.xBall += 1;
pp.yBall -= 1;
try {
if(gewinner() == 1) {
pp.winner = 1;
}
else if(gewinner() == 2) {
pp.winner = 2;
}
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
else if (!bol1 && bol2) {
pp.xBall += 1;
pp.yBall += 1;
try {
if(gewinner() == 1) {
pp.winner = 1;
}
else if(gewinner() == 2) {
pp.winner = 2;
}
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
else if(bol1 && !bol2) {
pp.xBall -= 1;
pp.yBall -= 1;
try {
if(gewinner() == 1) {
pp.winner = 1;
}
else if(gewinner() == 2) {
pp.winner = 2;
}
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
else if(bol1 && bol2) {
pp.xBall -= 1;
pp.yBall += 1;
try {
if(gewinner() == 1) {
pp.winner = 1;
}
else if(gewinner() == 2) {
pp.winner = 2;
}
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//Hier wird der Ball in die Richtige abgeprallt
if(pp.yBall <= 30 && !bol1) {
bol2 = true;
}
else if(pp.yBall >= 470 && !bol1) {
bol2 = false;
}
else if(pp.yBall <= 30 && bol1) {
bol2 = true;
}
else if(pp.yBall >= 470 && bol1) {
bol2 = false;
}
//Der Spieler
else if(pp.xBall == 650 && pp.yBall >= pp.yRechts && pp.yBall <= (pp.yRechts + 40)) {
bol1 = true;
if(bol2) {
bol2 = true;
}
else if(!bol2) {
bol2 = false;
}
}
else if(pp.xBall == 40 && pp.yBall >= pp.yLinks && pp.yBall <= (pp.yLinks + 40)) {
bol1 = false;
if(bol2) {
bol2 = true;
}
else if(!bol2) {
bol2 = false;
}
}
}
}
public int gewinner() {
if(pp.xBall >= 730) {
win = 1;
}
if(pp.xBall <= 1) {
win = 2;
}
return win;
}
}