Hallo
Ich hab ein Spiel programmiert, wer es kennt Achtung die Kurve, bzw auch als Zatacka bekannt. Es funktioniert eigendlich alles recht einwandfrei, jedoch gibt es Probleme bei der Farberkennung.
Also es ist ein eigener Thread mit einer while Schleife. State ist dazu da, das der Thread nicht abgewürgt wird sondern noch einmal zum Ende durchläuft und dann abbricht. In der While schleife ist eine for Schleife für die Spieler. Wenn ein Spieler nicht null (d.H. nicht mitspielt) oder tot ist, passiert nichts. Ansonsten wird auf dem BufferedImage sf der letzte Punkt gezeichnet. Dannach wird dieser Punkt (getCurPos) erhöht. In der Richtung (getCurDir) steht entweder für x und für y -1, 0 oder 1 drinnen, je nachdem in welche Richtung der aus diesem Algorithmus resultiernde Strich gehen soll. Nun wird überprüft, ob der Spieler am Rand angefahren ist. Wenn ja, verliert dieser Spieler falls ein Spielfaktor (abprallen) nicht aktiviert ist, ansonsten wird seine Richtung umgekehrt. Dies Funktioniert Problemlos. Nun kommen wir zum Teil mit dem Fehler. Die Zeile getRGB soll den Farbwert des als nächstes zu zeichnenden Punktes aus dem BufferedImage auslesen. Wenn dieser Punkt nicht schwarz ist, d.H. der Spieler würde in einen anderen Spieler hineinfahren oder in sich selbst, soll dieser Spieler verlieren. Das Problem ist, dass wie sich beim Testen herausgestellt hat, anscheinend ohne jeglichen Sinn ein Punkt als z.B. Rot angenommen wird und der Spieler einfach mittendrin verliert. In der Konsole erscheint "Color", was heisst das er eben durch diesen Fall gestorben ist. Der Punkt, an dem dies auftritt, ist anscheinend rot, allerdings ist er auf dem Spielfeld schwarz, wie man beim spielen sieht. Kann hier nun ein Fehler bei getRGB vorliegen, oder hat dies andere Ursachen?
Danke im Vorraus für jegliche Hilfe
mfg
Ich hab ein Spiel programmiert, wer es kennt Achtung die Kurve, bzw auch als Zatacka bekannt. Es funktioniert eigendlich alles recht einwandfrei, jedoch gibt es Probleme bei der Farberkennung.
Also es ist ein eigener Thread mit einer while Schleife. State ist dazu da, das der Thread nicht abgewürgt wird sondern noch einmal zum Ende durchläuft und dann abbricht. In der While schleife ist eine for Schleife für die Spieler. Wenn ein Spieler nicht null (d.H. nicht mitspielt) oder tot ist, passiert nichts. Ansonsten wird auf dem BufferedImage sf der letzte Punkt gezeichnet. Dannach wird dieser Punkt (getCurPos) erhöht. In der Richtung (getCurDir) steht entweder für x und für y -1, 0 oder 1 drinnen, je nachdem in welche Richtung der aus diesem Algorithmus resultiernde Strich gehen soll. Nun wird überprüft, ob der Spieler am Rand angefahren ist. Wenn ja, verliert dieser Spieler falls ein Spielfaktor (abprallen) nicht aktiviert ist, ansonsten wird seine Richtung umgekehrt. Dies Funktioniert Problemlos. Nun kommen wir zum Teil mit dem Fehler. Die Zeile getRGB soll den Farbwert des als nächstes zu zeichnenden Punktes aus dem BufferedImage auslesen. Wenn dieser Punkt nicht schwarz ist, d.H. der Spieler würde in einen anderen Spieler hineinfahren oder in sich selbst, soll dieser Spieler verlieren. Das Problem ist, dass wie sich beim Testen herausgestellt hat, anscheinend ohne jeglichen Sinn ein Punkt als z.B. Rot angenommen wird und der Spieler einfach mittendrin verliert. In der Konsole erscheint "Color", was heisst das er eben durch diesen Fall gestorben ist. Der Punkt, an dem dies auftritt, ist anscheinend rot, allerdings ist er auf dem Spielfeld schwarz, wie man beim spielen sieht. Kann hier nun ein Fehler bei getRGB vorliegen, oder hat dies andere Ursachen?
Code:
while (state != 0) {
if (state == 1) {
for (int i = 0; i < sp.length; i++) {
if (sp[i] == null)
continue;
if (sp[i].isDead())
continue;
Graphics2D g = sf.createGraphics();
g.setColor(sp[i].getC());
// if (sp[i].getCurPos().x != 0 && sp[i].getCurPos().y != 0)
// {
// g.setStroke(new BasicStroke(2, BasicStroke.CAP_ROUND,
// BasicStroke.JOIN_ROUND));
// }
g.drawOval(sp[i].getCurPos().x, sp[i].getCurPos().y, 1, 1);
sp[i].getCurPos().x += sp[i].getCurDir().x;
sp[i].getCurPos().y += sp[i].getCurDir().y;
if (sp[i].getCurPos().x <= 0
|| sp[i].getCurPos().x >= sf.getWidth() - 1) {
if (abprallen) {
sp[i].getCurDir().x = -sp[i].getCurDir().x;
} else {
System.out.println("RandX");
loose(i);
}
}
if (sp[i].getCurPos().y <= 0
|| sp[i].getCurPos().y >= sf.getHeight() - 1) {
if (abprallen) {
sp[i].getCurDir().y = -sp[i].getCurDir().y;
} else {
System.out.println("RandY");
loose(i);
}
}
System.out.println("Spieler"
+ i
+ " "
+ sp[i].getCurPos()
+ " "
+ sp[i].getCurDir()
+ " "
+ new Color(sf.getRGB(sp[i].getCurPos().x,
sp[i].getCurPos().y)));
if (!new Color(sf.getRGB(sp[i].getCurPos().x, sp[i]
.getCurPos().y)).equals(Color.black)) {
//Funktioniert noch nicht ganz
System.out.println("Color");
loose(i);
}
}
ALabel[] lab = new ALabel[15];
lab[0] = new ALabel("Spieler", 50, 25);
lab[1] = new ALabel("Punkte", 50, 25);
lab[2] = new ALabel("Lebt?", 50, 25);
for (int i = 0; i < sp.length; i++) {
// nicht immer neu erzeugen, nur temporäre lösung
if (sp[i] == null)
continue;
lab[(i) * 3 + 3] = new ALabel(sp[i].getName(), 50, 25);
lab[(i) * 3 + 4] = new ALabel("" + sp[i].getScore(), 50, 25);
lab[(i) * 3 + 5] = new ALabel(sp[i].isDead() ? "Nein"
: "Ja", 50, 25);
}
f.getSp().refreshScore(lab);
repaint();
try {
Thread.sleep((long) (25 / geschw));
} catch (InterruptedException e) {
e.printStackTrace();
}
} else if (state == 2) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
Danke im Vorraus für jegliche Hilfe
mfg