Hallo,
ich habe angefangen mich mit Threads zu beschäftigen und im Zuge dessen wollte ich ein kleines Pong Spiel programmieren.
Dieses besteht aus 3 Klassen:
schlaeger.java:
ball.java:
und Fenster.java:
Zum einen fehlt natürlich noch jegliche Spiellogik (Abprallen, Punkte zählen etc.), doch mein Problem liegt woanders. Der Ball läuft nun in einem eigenen Thread und man kann während der Ball läuft die Schläger bewegen. Bewege ich jedoch einen Schläger und kurz danach den 2. dann bricht die Bewegung des ersten Schlägers ab, obwohl ich die Taste weiterhin gedrückt halte. Braucht jeder Schläger einen eigenen Thread? Ich habe hier im Forum mal gesucht, aber keine richtigen Beispiele gefunden. Bin ich denn mit "1 Thread für Ball, einer pro Schläger" auf dem richtigen Weg?
Mfg Florian
ich habe angefangen mich mit Threads zu beschäftigen und im Zuge dessen wollte ich ein kleines Pong Spiel programmieren.
Dieses besteht aus 3 Klassen:
schlaeger.java:
Code:
import java.awt.*;
/*
Florian Quinkert, 16.01.06
Klasse schlaeger.java:
In dieser Klasse wird ein Schlaeger für ein Pong Spiel implementiert.
Dem Konstruktor wird durch die Variablen a und b die Position des Schlaegers
mitgeteilt.
*/
class schlaeger
{
public int x = 10;
public int y = 100;
public int y_alt = 100;
final int breite = 10;
final int hoehe = 75;
schlaeger(int a, int b)
{
x = a;
y = b;
y_alt = y;
}
void getUp()
{
if (y > 40)
{
y_alt = y;
y -= 10;
}
}
void getDown()
{
if (y < 673)
{
y_alt = y;
y += 10;
}
}
public void paint(Graphics g)
{
g.clearRect(x, y_alt, breite, hoehe);
g.fillRect(x, y, breite, hoehe);
}
}
ball.java:
Code:
import java.awt.*;
/*
Florian Quinkert, 17.01.07
Klasse ball.java:
Diese Klasse definiert einen Ball fuer ein Pong Spiel. Außerdem wird durch eine
Methode die veraenderte Flugrichtung des Balls bei einer Wandberuehrung bestimmt.
*/
class ball extends Thread
{
private int x = 510;
private int x_alt = 512;
private int y = 385;
private int y_alt = 384;
private int breite = 10;
private int hoehe = 10;
private int aender_x = 5;
private int aender_y = 5;
private Fenster f;
ball()
{
}
public void run()
{
for (int i = 0; i < 10000; i++)
{
x_alt = x;
y_alt = y;
aenderungBestimmen();
x += aender_x;
y += aender_y;
try
{
sleep(40);
}
catch (InterruptedException IE)
{
}
}
}
private void aenderungBestimmen()
{
if (y == 745)
{
aender_y = -5;
}
if (x == 1000)
{
aender_x = -5;
}
if (y == 85)
{
aender_y = 5;
}
if (x == 10)
{
aender_x = 5;
}
}
public void paint(Graphics g)
{
g.clearRect(x_alt, y_alt, breite, hoehe);
g.fillRect(x, y, breite, hoehe);
}
}
und Fenster.java:
Code:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
/*
Florian Quinkert, 16.01.07
Klasse Fenster.java:
Diese Klasse erstellt das Fenster mit einer Größe von 1024 * 768 Pixeln.
Außerdem werden in dieser Klasse die Schlaeger gezeichnet und auf Bewegungen
reagiert.
*/
class Fenster extends JFrame
implements Runnable
{
schlaeger sl;
schlaeger sr;
ball b;
int i = 1;
Fenster()
{
super("Pong");
new Thread(this).start();
sl = new schlaeger(10, 100);
sr = new schlaeger(1000, 100);
b = new ball();
b.start();
setSize(1024,768);
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent we)
{
System.exit(0);
}
});
addKeyListener(new KeyAdapter()
{
public synchronized void keyPressed(KeyEvent ke)
{
// 1. Schlaeger
if (ke.getKeyCode() == KeyEvent.VK_W)
{
sl.getUp();
}
if (ke.getKeyCode() == KeyEvent.VK_S)
{
sl.getDown();
}
// 2. Schlaeger
if (ke.getKeyCode() == KeyEvent.VK_UP)
{
sr.getUp();
}
if (ke.getKeyCode() == KeyEvent.VK_DOWN)
{
sr.getDown();
}
}
});
setVisible(true);
}
public void run()
{
while (i == 1)
{
repaint();
try
{
Thread.sleep(10);
}
catch (InterruptedException ie)
{
}
}
}
public void paint(Graphics g)
{
sl.paint(g);
sr.paint(g);
b.paint(g);
}
public static void main(String[] args)
{
Fenster f = new Fenster();
}
}
Zum einen fehlt natürlich noch jegliche Spiellogik (Abprallen, Punkte zählen etc.), doch mein Problem liegt woanders. Der Ball läuft nun in einem eigenen Thread und man kann während der Ball läuft die Schläger bewegen. Bewege ich jedoch einen Schläger und kurz danach den 2. dann bricht die Bewegung des ersten Schlägers ab, obwohl ich die Taste weiterhin gedrückt halte. Braucht jeder Schläger einen eigenen Thread? Ich habe hier im Forum mal gesucht, aber keine richtigen Beispiele gefunden. Bin ich denn mit "1 Thread für Ball, einer pro Schläger" auf dem richtigen Weg?
Mfg Florian