Impressum · Kontakt · Hilfe
Besucher online · Mitglieder



Portal > Foren > Java > Desktop-Applikationen und Grafik > Kugelbewegung - wie den Streifen vermeiden?
Antwort
 
Themen-Optionen
Alt 26.10.2005, 19:11   Nach oben    #1
Ben
Erfahrener Benutzer
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.619
Standard Kugelbewegung - wie den Streifen vermeiden?

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:
public void paint(Graphics g) {
    
g.fillOval(...);

und Konsorten, sondern nutze die Klassen Line2D.Double für Balken und Ellipse2D.Double für Kreise/Ellipsen.

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:
    public void move() {
        
        
double x this.getX() + 1;
        
double y this.getY() + 1;
        
        
this.setFrame(x,y,this.radius 2this.radius 2);
        
    } 
Jut. Diese Methode rufe ich in der Methode run() der Klasse Flipper extends JApplet implements Runnable auf.

PHP-Code:
    public void run() {

        while(
true) {
            
            
// Flipperkugel bewegen
            
this.flipperkugel.move();
            
            
// Applet neu zeichnen
            
this.repaint();
            
            try {
                
Thread.sleep(30);
            }
            catch(
InterruptedException exc) {
            }
            
        }
    } 
Soderle. Als letztes dann noch die Methode paint(), die die entsprechende Methode von JApplet überschreibt.

PHP-Code:
    public void paint(Graphics g) {
        
Graphics2D g2 = (Graphics2Dg;
        
        
Iterator iter this.hindernisse.iterator();
        
        while(
iter.hasNext()) {
            
Shape h = (Shape)iter.next();
            
g2.draw(h);
        }

        
g2.draw(this.flipperkugel);
    } 
Ich habe mir bisher noch keine Gedanken über Ausgabepufferung gemacht, wenn da jemand noch Ideen hat .. gerne

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.
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 26.10.2005, 20:23   Nach oben    #2
Benutzer
 
Registriert seit: 11.06.2005
Beiträge: 36
Standard

Hallo,
ich sehe da nur folgende Möglichkeiten:
  • Doppelte Pufferung der Ausgabekomponente
  • Erhöhung der Zeit bei Thread.sleep(...)
  • Leistungsfähigeres Grafiksystem (z.B. OpenGL)
mfG
rath ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 26.10.2005, 20:26   Nach oben    #3
Ben
Erfahrener Benutzer
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.619
Standard

Hi,
Zitat:
Zitat von rath
Doppelte Pufferung der Ausgabekomponente
Könntest du mir bitte erklären, wie du das realisieren würdest.

Zitat:
Zitat von rath
Erhöhung der Zeit bei Thread.sleep(...)
Äh .. und das bringt? :confused:

Danke
Grüße Ben.
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 26.10.2005, 20:36   Nach oben    #4
Benutzer
 
Registriert seit: 11.06.2005
Beiträge: 36
Standard

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);
oder du verzichtest auf die doppelte Pufferung.

Code:
Thread.sleep(30);
bedeutet in deinem Fall, dass er 30 Millisekunden wartet bis er die
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.
rath ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 26.10.2005, 21:04   Nach oben    #5
Ben
Erfahrener Benutzer
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.619
Standard

Zitat:
Zitat von rath
Code:
Thread.sleep(30);
bedeutet in deinem Fall, dass er 30 Millisekunden wartet bis er die
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.
Das ist mir alles bewusst, aber im Endeffekt wird dann einfach nur der Streifen langsamer gezeichnet. Mehr nicht

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
Angehängte Dateien
Dateityp: rar flipper.rar (3,1 KB, 7x aufgerufen)
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 27.10.2005, 07:52   Nach oben    #6
Benutzer
 
Registriert seit: 11.06.2005
Beiträge: 36
Standard

Hi,
reißt einen zwar auch nicht vom Hocker aber
ist eben Swing.

mfG
Angehängte Dateien
Dateityp: rar Flipper.rar (1,5 KB, 6x aufgerufen)
rath ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 03.11.2005, 14:25   Nach oben    #7
Ben
Erfahrener Benutzer
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.619
Standard

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.
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 03.11.2005, 15:45   Nach oben    #8
Benutzer
 
Registriert seit: 11.06.2005
Beiträge: 36
Standard

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) {
	  }
	 }
	}
Viel Spaß....
rath ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 03.11.2005, 15:54   Nach oben    #9
Ben
Erfahrener Benutzer
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.619
Standard

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.
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 03.11.2005, 15:59   Nach oben    #10
Benutzer
 
Registriert seit: 11.06.2005
Beiträge: 36
Standard

Ja,
Deklaration, Init,Paint und Run.
rath ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 03.11.2005, 16:13   Nach oben    #11
Ben
Erfahrener Benutzer
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.619
Standard

Zitat:
Zitat von rath
Ja,
Deklaration, Init,Paint und Run.
Meine Fresse ... ich werde blind

So. Also die Kugel hat nun auf jeden Fall mal keinen Streifen mehr. Das ist fein. .. allerdings falckert nun der Bildschirm.

[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.
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 03.11.2005, 20:25   Nach oben    #12
Benutzer
 
Registriert seit: 11.06.2005
Beiträge: 36
Standard

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.
rath ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 03.11.2005, 22:22   Nach oben    #13
Ben
Erfahrener Benutzer
 
Benutzerbild von Ben
 
Registriert seit: 02.12.2004
Ort: Remagen
Beiträge: 4.619
Standard

Zitat:
Zitat von rath
Also wie gesagt,swing ist nicht besonders schnell.
Das ist erstmal recht egal.

Zitat:
Zitat von rath
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?!).
Soll alles nicht verwendet werden.
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.
Ben ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist Aus.
Trackbacks are An
Pingbacks are An
Refbacks are Aus

Ä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


Alle Zeitangaben in WEZ +2. Es ist jetzt 20:47 Uhr.

Nach oben
Wir nutzen das Zend Framework, vBulletin (vBulletin v3.7.3, Copyright ©2000-2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0) und vBSEO.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44