![]() |
|
|
Themen-Optionen |
|
|
Nach oben #1 |
|
Erfahrener Benutzer
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.800
|
Hi,
ich habe ein Applet, welches ein paar Hindernisse/Wände enthält und dazu eine Kugel, die sich bewegt. Noch alles sehr rudimentär, aber irgendwann muss man ja mal anfangen. Ich erstelle die angezeigten "Grafiken" nicht mittels PHP-Code:
Jut. Die Kugel läuft auch, alles kein Problem, allerdings habe ich jetzt natürlich nicht den Effekt, dass ich einfach ein z.B. weißes Feld da hinmalen kann, wo der "alte" Ort der Kugel war. (schlecht beschrieben ... :rolleyes: ) Ich habe eine Methode move() aus der Klasse Kugel extends Ellipse2D.Double PHP-Code:
PHP-Code:
PHP-Code:
Das hier gezeigte Beispiel: --> http://java-tutorial.net/Bildschirmflackern.html ist glaube ich mit meinem Ansatz nicht so ganz machbar. Natürlich lass ich mic da gerne belehren Viel geschwafelt .. meine Frage ist eben, wie ich es schaffe, dass am Ende auch eine Kugelbewegung zu sehen ist und nicht ein "schwarzer" Streifen, der wie ein Schweif hinter der Kugel hängt .. Danke für eure Hilfe. Grüße Ben. |
|
|
|
|
|
Nach oben #3 | ||
|
Erfahrener Benutzer
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.800
|
Hi,
Zitat:
Zitat:
Danke Grüße Ben. |
||
|
|
|
|
|
Nach oben #4 |
|
Benutzer
Registriert seit: 11.06.2005
Beiträge: 33
|
Hi,
ok wie ich sehe ist doppelte Pufferung nur in Component-Objekten möglich. Also entweder du fügst eine Swing- oder AWT-Komponente zu deinem Applet hinzu auf der du zeichnest. Dann wäre der Code Code:
komponente.setDoubleBuffered(true); Code:
Thread.sleep(30); Grafik neu zeichnet. Das ist natürlich ne sehr kurze Zeit und er muss sehr sehr viel Bilder in der Sekunde zeichnen. Setzt du diese Zeit also hoch, zeichnet er nicht so viel was durchaus zu Performance-Verbesserungen führen wird. Da musst du nun versuchen, je nach deiner Rechnerleistung, ein gutes Maß an Geschwindigkeit zu finden unter dem die Optik nicht leidet. |
|
|
|
|
|
Nach oben #5 | |
|
Erfahrener Benutzer
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.800
|
Zitat:
Ich habe mal die bisherigen Quelltexte .rar-Archiv angehängt. Vielleicht habe ich mich auch einfach nur schlecht ausgedrückt? Danke, dass du/ihr reinschaust/reinschaut. Grüße Ben |
|
|
|
|
|
|
Nach oben #7 |
|
Erfahrener Benutzer
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.800
|
Hallo,
sorry, dass ich mich so lange nicht mehr gemeldet habe ... kleinere organisatorische Schwierigkeiten. Jut, ich habe mir deine Datei jetzt mal zu Gemüte geführt und .. äh .. vielleicht habe ich auch Tomaten auf den Augen .. aber wo genau liegt der Unterschied zwischen deiner Datei und meiner? Danke. Grüße Ben. |
|
|
|
|
|
Nach oben #8 |
|
Benutzer
Registriert seit: 11.06.2005
Beiträge: 33
|
Hi,
Tomaten auf den Augen hast du nicht. Ich hätte nur die richtige Datei hochladen sollen :rolleyes: Code:
import javax.swing.*;
public final class Flipper extends JApplet implements Runnable {
/**
* diesmal wird auf einem JPanel gezeichnet
* (Swing-Komponenten haben schon in der Voreinstellung
* doppelte Pufferung)
*/
JPanel zeichenflaeche;
/**
*
* List hindernisse
*
* In dieser Klassenvariable werden wir die Hindernis-Objekte abspeichern.
* Wir nutzen das Interface 'List'.
* Als Implementation nutzen wir die Klasse 'ArrayList'.
*
* @see http://java.sun.com/docs/books/tutor...aces/list.html
* @see http://java.sun.com/docs/books/tutor...ions/list.html
*/
private List hindernisse = new ArrayList();
/**
*
* Kugel kugel
*
* Die Instanzvariable speichert eine Referenz auf ein Kugel-Objekt.
*/
private Kugel flipperkugel;
/**
*
* init()
*
* Wir überschreiben die init()-Methode der Klasse JApplet.
* Es werden einige Grundeinstellungen gesetzt.
*/
public void init() {
this.initSpielfeld();
this.initHindernisse();
this.initKugel();
this.setSize(500,500);
// Farbe brauchen wir hier nicht mehr
//this.setBackground(Color.WHITE);
// jetzt instantiieren wir mal die Zeichenfläche und fügen
// sie dem Applet hinzu
zeichenflaeche = new JPanel();
zeichenflaeche.setBackground(Color.WHITE);
getContentPane().add(zeichenflaeche);
}
/**
*
* start()
*
* Die Methode überschreibt die Methode start() der Klasse JApplet.
* Hier wird der benötigte Thread erstellt und gestartet.
*/
public void start() {
Thread thread = new Thread(this);
thread.start();
}
/**
*
* paint(Graphics)
*
* Überschreibt die paint()-Methode der Klasse JApplet.
* Wir iterieren die Liste der Hindernisse und zeigen sie an.
*
* Am Ende zeichnen wir noch die Flipperkugel an die aktuelle Position.
*/
public void paint(Graphics g) {
// Jetzt nehmen wir nat. die Grafik der Zeichenfläche
Graphics2D g2 = (Graphics2D) zeichenflaeche.getGraphics();
Iterator iter = this.hindernisse.iterator();
while(iter.hasNext()) {
Shape h = (Shape)iter.next();
g2.draw(h);
}
g2.draw(this.flipperkugel);
}
/**
*
* run()
*
* Die run()-Methode des Interfaces Runnable wird implementiert.
* Die Kugel wird bewegt und das Applet neu gezeichnet (repaint()).
*/
public void run() {
while(true) {
// Flipperkugel bewegen
this.flipperkugel.move();
// Applet neu zeichnen
this.repaint();
// Zeichenfläche neu zeichnen
zeichenflaeche.paint(zeichenflaeche.getGraphics());
try {
Thread.sleep(30);
}
catch(InterruptedException exc) {
}
}
}
|
|
|
|
|
|
Nach oben #9 |
|
Erfahrener Benutzer
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.800
|
Danke dir, aber der Streifen ist und bleibt existent. :confused:
Nur um sicher zu gehen, du hast doch nur etwas in der init()-Methode geändert und eine Klassenvariable hinzugefügt, oder? Grüße Ben. |
|
|
|
|
|
Nach oben #11 | |
|
Erfahrener Benutzer
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.800
|
Zitat:
So. Also die Kugel hat nun auf jeden Fall mal keinen Streifen mehr. Das ist fein. [Fehlermeldung gelöscht .. ich bin etwas von der Rolle] Du sprachst gerade davon, dass Swing-Komponenten eine interne Ausgabepufferung besitzen. Was heißt das jetzt genau für mein weiteres Vorgehen diesbezüglich? Danke nochmals, Grüße Ben. |
|
|
|
|
|
|
Nach oben #12 |
|
Benutzer
Registriert seit: 11.06.2005
Beiträge: 33
|
Also wie gesagt,swing ist nicht besonders schnell.
Es gibt versch. Engines für Spieleentwicklung unter java, da kannste mal googlen oder vieleicht hier im Forum danach schauen. Des weiteren gibt es noch OpenGL als Grafiksystem (JOGL). Das ist dann allerdings nicht mehr plattformunabhängig (wenn das für dich wichtig ist?!). Zwecks doppelte Pufferung: Diese ist bei Swing-Komponenten automatisch aktiv, also wenns jetzt keine grafische Verbesserung gibt, gibts die nach setDoubleBuffered(true) auch nicht. |
|
|
|
|
|
Nach oben #13 | ||
|
Erfahrener Benutzer
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.800
|
Zitat:
Zitat:
Siehe dazu: -->http://jforum.de/showthread.php?t=1726 Was ist denn hiermit? --> http://java-tutorial.net/Bildschirmflackern.html Wenn ich das genauso wie es da steht mit einbaue .. also die update()-Methode einfüge .. dann ändert sich nix. Kann ich das Flackern denn gar nicht verhindern? Muss ich im Endeffekt doch wieder mit drawRect() und Co. arbeiten? Grüße Ben. |
||
|
|
|
![]() |
| Lesezeichen |
| Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
| Themen-Optionen | |
|
|
Ähnliche Themen
|
||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| Frames vermeiden - aber wie...? | Homepagespeicher | PHP-Programmierung | 19 | 19.08.2006 19:54 |
| Absätze in CSS vermeiden | Bookworm | HTML, XML und CSS | 16 | 29.12.2005 13:12 |