Hallo,
ich habe ein kleines Konzentrationsspiel in Form eines Applets programmiert, welches online gespielt werden kann. Eine Anbindung an eine Datenbank ist vorhanden. Hier werden User spezifische Parameter gespeichert und zudem ist eine Highscoreaufstellung möglich. Aufgabe des Spiels ist es, die Zahlen von 1 bis n anzuklicken. Es wird also eine Matrix gezeigt mit n Label Feldern. In jedem Label steht eine Zahl. Drückt man auf einen Start Button, so wird nach einem Zufallsprinzip gemischt, eine Stopuhr gestartet und anschließend sollen die Zahlen so schnell wie möglich in der richtigen Reihenfolge angeklickt werden. Klickt man die richtige Zahl an, so färbt sich die Hintergrundfarbe des Labels kurz grün und ein angenehmer Sound (im .wav Format) von ca. 0,3 Sekunden wird abgespielt. Bei einer falschen Zahl: Farbe rot und ein entsprechend unangenehmer Sound.
Problem der ganzen Geschichte ist jedoch, dass gelegentlich der Sound bei jedem Klick zweimal hintereinander abgespielt wird. Dieser Fehler zieht sich dann die gesamte Spielzeit durch, zur Abschaffung muss das Spiel also noch einmal neu gestartet werden. Zudem passiert es gelegentlich, dass bei Klick auf ein Label keine Färbung erfolgt, weil der PC rechen- oder speichertechnisch scheinbar nicht hinterherkommt. Man klickt also schon das nächste und übernächste Label an, aber es passiert nichts. Erst nach wenigen Sekunden färben sich dann die entsprechenden Labels kurz.
Hier der relevante Code:
Bei jedem Klick wird also ein neuer Thread erstellt, da man durchaus Geschwindigkeiten erreichen kann, bei der man pro Sekunde 3 - 4 Labels anklickt. Selbst wenn ich das Spiel komplett ohne Ton laufen lasse, habe ich noch immer das Problem mit der Färbung. Wer kann mir hier weiterhelfen?
Zuvor lies ich übrigens alles vom Hauptthread abarbeiten, (neben MausPressed war auch MouseReleased mit eingebunden). Hierbei zeigte sich das Phänomen auch schon.
Ich spekuliere ja darauf, dass man das irgendwie puffern muss. Im Übrigen zeigt sich das Phänomen bei Firefox und Google Chrom, egal ob ich das Spiel auf meinem alten Laptop oder auf meinem leistungsfähigen Desktop-PC laufen lasse.
ich habe ein kleines Konzentrationsspiel in Form eines Applets programmiert, welches online gespielt werden kann. Eine Anbindung an eine Datenbank ist vorhanden. Hier werden User spezifische Parameter gespeichert und zudem ist eine Highscoreaufstellung möglich. Aufgabe des Spiels ist es, die Zahlen von 1 bis n anzuklicken. Es wird also eine Matrix gezeigt mit n Label Feldern. In jedem Label steht eine Zahl. Drückt man auf einen Start Button, so wird nach einem Zufallsprinzip gemischt, eine Stopuhr gestartet und anschließend sollen die Zahlen so schnell wie möglich in der richtigen Reihenfolge angeklickt werden. Klickt man die richtige Zahl an, so färbt sich die Hintergrundfarbe des Labels kurz grün und ein angenehmer Sound (im .wav Format) von ca. 0,3 Sekunden wird abgespielt. Bei einer falschen Zahl: Farbe rot und ein entsprechend unangenehmer Sound.
Problem der ganzen Geschichte ist jedoch, dass gelegentlich der Sound bei jedem Klick zweimal hintereinander abgespielt wird. Dieser Fehler zieht sich dann die gesamte Spielzeit durch, zur Abschaffung muss das Spiel also noch einmal neu gestartet werden. Zudem passiert es gelegentlich, dass bei Klick auf ein Label keine Färbung erfolgt, weil der PC rechen- oder speichertechnisch scheinbar nicht hinterherkommt. Man klickt also schon das nächste und übernächste Label an, aber es passiert nichts. Erst nach wenigen Sekunden färben sich dann die entsprechenden Labels kurz.
Hier der relevante Code:
Java:
private class zjbtMouseListener extends MouseAdapter {
public void mousePressed(MouseEvent e) {
labeldummy = (JLabel)(e.getSource());
if (labeldummy.isEnabled()) {
if (Integer.valueOf(labeldummy.getText()) == (NumbertoFind)) {
NumbertoFind++;
new Thread(new TaskPressedRight(a[1][Integer.valueOf(labeldummy.getText())])).start();
}
else {
new Thread(new TaskPressedWrong(a[1][Integer.valueOf(labeldummy.getText())])).start();
}
}
}
}
private class TaskPressedWrong implements Runnable {
private int indexlabeldummy2;
private TaskPressedWrong(int indexlabeldummy2){
this.indexlabeldummy2 = indexlabeldummy2;
}
public void run() {
audioWrong[nfieldsoundw].play();
try {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
jlblnumberField[indexlabeldummy2].setForeground(nfieldfcp);
jlblnumberField[indexlabeldummy2].setBackground(nfieldbgcpw);
}
});
Thread.sleep(250);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
jlblnumberField[indexlabeldummy2].setForeground(nfieldfc);
jlblnumberField[indexlabeldummy2].setBackground(nfieldbgc);
}
});
}
catch (InterruptedException ex) {
}
}
}
private class TaskPressedRight implements Runnable {
private int indexlabeldummy2;
public TaskPressedRight(int indexlabeldummy2){
this.indexlabeldummy2 = indexlabeldummy2;
}
public void run() {
audioRight[nfieldsoundr].play();
try {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
jlblnumberField[indexlabeldummy2].setForeground(nfieldfcp);
jlblnumberField[indexlabeldummy2].setBackground(nfieldbgcpr);
}
});
Thread.sleep(250);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
jlblnumberField[indexlabeldummy2].setForeground(nfieldfc);
jlblnumberField[indexlabeldummy2].setBackground(nfieldbgc);
}
});
}
catch (InterruptedException ex) {
}
}
}
Bei jedem Klick wird also ein neuer Thread erstellt, da man durchaus Geschwindigkeiten erreichen kann, bei der man pro Sekunde 3 - 4 Labels anklickt. Selbst wenn ich das Spiel komplett ohne Ton laufen lasse, habe ich noch immer das Problem mit der Färbung. Wer kann mir hier weiterhelfen?
Zuvor lies ich übrigens alles vom Hauptthread abarbeiten, (neben MausPressed war auch MouseReleased mit eingebunden). Hierbei zeigte sich das Phänomen auch schon.
Ich spekuliere ja darauf, dass man das irgendwie puffern muss. Im Übrigen zeigt sich das Phänomen bei Firefox und Google Chrom, egal ob ich das Spiel auf meinem alten Laptop oder auf meinem leistungsfähigen Desktop-PC laufen lasse.
Zuletzt bearbeitet: