Wie kann ich das Zeichnen der Grafik feiner machen?

Status
Nicht offen für weitere Antworten.

Stefan1200

Top Contributor
Ich habe vor kurzem ein weiteres Spiel angefangen zu programmieren.
Es ist ein Lander Clone, also man bewegt in 2D Grafik ein kleines Raumschiff vom Landepad zum Ziel.
Ansich läuft es so, wie ich das gerne hätte. Aber eine Sache ist etwas unschön und unperformant.
Was Grafiken Zeichnen angeht, bin ich doch eher Anfänger, programmiere ja sonst nur Anwendungen oder Spiele, die auch mit normalen Swing Komponenten schick aussehen.

Folgendes Problem: Wenn sich das Schiff langsam bewegt, dann bewegt es sich alle 200 ms einen Pixel in die gewünschte Richtung. Je schneller, je mehr Pixel alle 200 ms. Nun könnt Ihr euch bestimmt vorstellen, das es ziemlich ruckelt, wenn man eine höhere Geschwindigkeit drauf hat. Gleichzeitig ist die CPU Belastung recht hoch. Auf meiner 2600er CPU bei Java 1.4.2 mal eben 80%, unter Java 1.5 immerhin noch 50%. Wie könnte ich die "Grafik Engine" (ich weiß, klingt besser als sie wirklich ist...) verbessern, das die Bewegungen wesentlich feiner aussehen, ohne das die CPU Belastung noch mehr steigt?

Mein jetziger Source (nur das, was mit Zeichnen zu tun hat).
Hinweis: bufferedImage ist das Bild vom Level.
Das TheDrawPanel wird alle 200ms neu gezeichnet.

Für jeden Hinweis bin ich dankbar.

Code:
	private void refreshStatusBar(Graphics2D g2D)
	{
		g2D.setColor(Color.BLACK);
		g2D.setComposite(acHalf);
		g2D.fillRect(0,0,SCREEN_WIDTH, 30);
		g2D.setComposite(acFull);
		g2D.setFont(fontSmall);
		g2D.setColor(Color.LIGHT_GRAY);
		g2D.drawString("Pathfinder Engine Test", 1,20);
		g2D.setFont(fontStatus);
		g2D.setColor(Color.blue);

		g2D.drawString("Speed X: " + getSpeed(speedX) + "  Speed Y: " + getSpeed(speedY), 500, 22);
		if (fuel <= 10)
		{
			g2D.setColor(Color.RED);
		}
		g2D.drawString("Fuel: " + Integer.toString(fuel), 900, 22);

		g2D.setFont(fontSmall);
		g2D.setColor(Color.RED);
	}

	class TheDrawPanel extends JPanel
	{
		public void paintComponent(Graphics gNormal)
		{
			Graphics2D g = (Graphics2D)gNormal;
			//g.clearRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
			g.drawImage(bufferedImage, 0, 0, null);

			if (timer.isRunning())
			{
				calcNewPos();
			}

			if (timer.isRunning())
			{
				if (checkCollision())
				{
					setCrashed(g);
				}
				else if (won)
				{
					drawShip(g);
					setWon(g);
				}
				else if (!crashed && (fuel > 0))
				{
					drawShip(g);

					if (left && !landed)
					{
						g.drawImage(biFlameRight, posx + SHIP_SIZE_X, posy, null);
					}
					if (right && !landed)
					{
						g.drawImage(biFlameLeft, posx - flameLeftSizeX, posy, null);
					}
					if (up)
					{
						g.drawImage(biFlameBottom, posx + (SHIP_SIZE_X / 2) - (flameBottomSizeX / 2), posy + SHIP_SIZE_Y, null);
					}
					if (down && !landed)
					{
						g.drawImage(biFlameTop, posx + (SHIP_SIZE_X / 2) - (flameTopSizeX / 2), posy - flameTopSizeY, null);
					}
				}
				else
				{
					drawShip(g);
				}
			}
			else if (won)
			{
				drawShip(g);
				setWon(g);
			}
			else if (crashed)
			{
				drawShip(g);
				g.setColor(Color.BLACK);
				g.setComposite(acHalf);
				g.fillRect(190,350,SCREEN_WIDTH-190-255, 100);
				g.setComposite(acFull);
				g.setColor(Color.red);
				g.drawImage(biShipCrashed, posx, posy, null);
				g.setFont(fontBig);
				g.drawString("Crashed", 420, 380);
				g.drawString("Would you like to restart level? (y/n)", 220, 410);
				g.drawString("ESC to quit game!", 355, 440);
				g.setFont(fontSmall);
			}
			else
			{
				drawShip(g);
			}

			refreshStatusBar(g);
		}
	}

	private void drawShip(Graphics2D g)
	{
		if (leftShip)
		{
			g.drawImage(biShipLeft, posx, posy, null);
		}
		else
		{
			g.drawImage(biShipRight, posx, posy, null);
		}
	}

	private void calcNewPos()
	{
		if (left)
		{
			if (fuel >= 1)
			{
				++speedX;
				--fuel;
			}
		}
		else if (!right)
		{
			if (speedX > 0)
			{
				if (fuel >= 1)
				{
					--speedX;
					--fuel;
				}
			}
		}
		if (right)
		{
			if (fuel >= 1)
			{
				--speedX;
				--fuel;
			}
		}
		else if (!left)
		{
			if (speedX < 0)
			{
				if (fuel >= 1)
				{
					++speedX;
					--fuel;
				}
			}
		}
		posx -=speedX;

		if (up)
		{
			if (fuel >= 2)
			{
				--fuel;
				--fuel;
				++speedY;
				++speedY;
				++speedY;
			}
			else if (fuel >= 1)
			{
				--fuel;
				++speedY;
				++speedY;
			}
		}
		else
		{
			--speedY;
		}
		if (down)
		{
			if (fuel >= 1)
			{
				--speedY;
				--fuel;
			}
		}
		else if (!up)
		{
			if (speedY < 0)
			{
				++speedY;
			}
		}

		if (!landed)
		{
			--speedY;
		}
		posy -=speedY;
	}
 
K

klom

Gast
Wenn du nur alle 200 ms einen Update und Render-Vorgang auslöst muss es ja ruckeln, das sind doch nur 5 Frames die Sekunde. Ich kann mich bislang nicht beklagen, was die Geschwindigkeit von Java angeht, sogar auf meinem Laptop ein P2/166 laufen die Animationen halbwegs flüssig. Vielleicht hilft es ja auch wenn du einen Thread startest. Ich habe mich bislang immer an das Grundschema von Davison (http://fivedots.coe.psu.ac.th/~ad/jg/) gehalten. Damit kann man auf den Rechner sogar Jump & Run Games vernünftig darstellen, auch wenn bedingt durch Win98 nur ca. 50 Frames erreicht werden.
 

Stefan1200

Top Contributor
@klom: Das Problem ist nur, wenn ich die Zeit auf unter 100ms senke, crasht mein Spiel sogar auf einem 2600+, wegen zu hoher Last (?!?).

Und mit den 200ms wird mein Spiel sogar auf 400MHz Rechnern sehr langsam.
 

DarKestSun

Mitglied
versuch mal das ganze ohne paint auszuführen, also nur testen ob auch ohne zeichnen alles ruckelt

dann hast du irgendwo zu viel aufwand

liegst am zeichnen, dann musst du double buffering verwenden, ich hatte ohne auch schon flimmer - probleme.
findest überall mit stichwort double buffering.

unter swing einfach object.setDoubleBuffered(true);
 

Wildcard

Top Contributor
DarKestSun hat gesagt.:
liegst am zeichnen, dann musst du double buffering verwenden, ich hatte ohne auch schon flimmer - probleme.
findest überall mit stichwort double buffering.

unter swing einfach object.setDoubleBuffered(true);
Swing ist standartmäßig doppelt gepuffert. Solange man das nicht willentlich ändert ist das völlig unnötig!
 

DarKestSun

Mitglied
achso

generell würd ich sowas sowieso nich unter swing machen, das gute alte awt ist (hab ich jedenfalls gelernt) schneller als swing, es sei denn es geht um buttons, menüs...

und awt muss erst gepuffert werden, aber dann darf da nix mehr flimmern
 

Stefan1200

Top Contributor
DarKestSun hat gesagt.:
versuch mal das ganze ohne paint auszuführen, also nur testen ob auch ohne zeichnen alles ruckelt

Das ist mir jetzt erst aufgefallen. Habe ich das falsch verstanden, oder ist dein Satz wirklich witzig? ;-)
Wie soll ich denn sehen, obs ruckelt, wenn ich nichts zeichne?
 
K

klom

Gast
Wir hatten doch schon mal gesprochen das du selber bestimmen solltest, wann gezeichnet wird da Java ansonsten die Eigenart hat das paint() zu übergehen wenn es zu oft hintereinander ausgeführt wird.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
E relevanter bereich einer isometrischen karte zeichnen (AffineTransform) Spiele- und Multimedia-Programmierung 0
SaftigMelo Kreissegment zeichnen Spiele- und Multimedia-Programmierung 2
E Buttons neu zeichnen im GridLayout Spiele- und Multimedia-Programmierung 2
A Zeichnen außerhalb der paint-Methode Spiele- und Multimedia-Programmierung 6
E Isometrische Tiles mit unterschiedlicher Größe an korrekter Position zeichnen Spiele- und Multimedia-Programmierung 1
Androbin Mein Spiel will sich nicht zeichnen lassen !!! Spiele- und Multimedia-Programmierung 7
J Int Wert auf JFrame zeichnen Spiele- und Multimedia-Programmierung 3
H [ANIMATION] Hintergrundbild nur einmal zeichnen Spiele- und Multimedia-Programmierung 3
R [lwjgl] Cursor -> versetzt Zeichnen / Bild ist umgedreht Spiele- und Multimedia-Programmierung 2
M Methoden eine Map zu zeichnen Spiele- und Multimedia-Programmierung 5
aze Nicht rechteckiges Bild zeichnen Spiele- und Multimedia-Programmierung 5
F nur Ausschnitt eines Image zeichnen Spiele- und Multimedia-Programmierung 9
T 3D Graphen Zeichnen Spiele- und Multimedia-Programmierung 19
F Kurven zeichnen Spiele- und Multimedia-Programmierung 2
E Keine Werte zum Zeichnen werden Übergeben Spiele- und Multimedia-Programmierung 3
A Halbkreise zeichnen lassen? Spiele- und Multimedia-Programmierung 2
F Lineal mit Zahlen zeichnen Spiele- und Multimedia-Programmierung 7
N Linie mit Rand zeichnen Spiele- und Multimedia-Programmierung 10
A Mehrere geometrische Objekte in JPanel zeichnen Spiele- und Multimedia-Programmierung 4
A Optimiertes Zeichnen - wie? Spiele- und Multimedia-Programmierung 8
data89 Koordinaten in Koordinatensystem zeichnen Spiele- und Multimedia-Programmierung 11
M Binärbaum ohne Überlappung zeichnen Spiele- und Multimedia-Programmierung 3
H Decke zeichnen mit Hilfe eines Polygons Spiele- und Multimedia-Programmierung 2
B 1)JButtons zeichnen 2)Kolisionsabfrage von zwei Objekten Spiele- und Multimedia-Programmierung 9
G Linie im Applet zeichnen Spiele- und Multimedia-Programmierung 5
G Schüsse zeichnen, Fehler? Spiele- und Multimedia-Programmierung 3
S Dreieck zeichnen Spiele- und Multimedia-Programmierung 9
G Überlagern von Strings beim zeichnen verhindern Spiele- und Multimedia-Programmierung 3
C Objekt bei Buttonklick zeichnen Spiele- und Multimedia-Programmierung 16
G Geschwungene Klammer zeichnen Spiele- und Multimedia-Programmierung 5
F Neu zeichnen verhindern Spiele- und Multimedia-Programmierung 25
J Zeichnen in BufferedImage und dieses in Datei speichern Spiele- und Multimedia-Programmierung 2
O Funktion zeichnen Spiele- und Multimedia-Programmierung 11
A Lissajous Figuren zeichnen Spiele- und Multimedia-Programmierung 1
G Maus springt --> Free-Hand-Zeichnen Spiele- und Multimedia-Programmierung 2
L Schüsse zeichnen Spiele- und Multimedia-Programmierung 13
M Eigene Strings zeichnen Spiele- und Multimedia-Programmierung 4
T Blitz berechnen und zeichnen Spiele- und Multimedia-Programmierung 13
M auswahlkreis zeichnen (schräg) Spiele- und Multimedia-Programmierung 4
N Logik: Grenz-/Frontlinie zeichnen Spiele- und Multimedia-Programmierung 4
M Grafikprogramm, zeichnen mit Maus Spiele- und Multimedia-Programmierung 7
G Problem beim Zeichnen von LineArrays Spiele- und Multimedia-Programmierung 9
P linie in bild zeichnen Spiele- und Multimedia-Programmierung 2
G Auf 3D Box zeichnen Spiele- und Multimedia-Programmierung 4
K mit Canvas übereinander zeichnen Spiele- und Multimedia-Programmierung 4
G 3D Raum zeichnen Spiele- und Multimedia-Programmierung 7
H Kreis zeichnen mittels Schleife & drawLine Spiele- und Multimedia-Programmierung 4
B Probleme beim zeichnen Spiele- und Multimedia-Programmierung 15
N Bild zu zeichnen (drawImage) klappt nur manchmal?? Spiele- und Multimedia-Programmierung 8
T Effizient zeichnen Spiele- und Multimedia-Programmierung 12
H mit Java2D Markierung über JTable zeichnen und diese bewegen Spiele- und Multimedia-Programmierung 2
C Graphische Benutzerschnittstelle, Problem beim Zeichnen Spiele- und Multimedia-Programmierung 4
J schnellste alternative um in java zu "zeichnen" Spiele- und Multimedia-Programmierung 17
conan2 Objekte in richtiger Z-Reihenfolge zeichnen Spiele- und Multimedia-Programmierung 2
G Punkte in Java3D zeichnen Spiele- und Multimedia-Programmierung 2
S Pixel zeichnen Spiele- und Multimedia-Programmierung 3
S Bild in Speicherbild zeichnen = Nichts? Spiele- und Multimedia-Programmierung 3
G Farbig zeichnen ohne java.awt.Color? Spiele- und Multimedia-Programmierung 5
M Wie kann man Kreisringe zeichnen ? Spiele- und Multimedia-Programmierung 12
C Graphics 2D Zeichnen Spiele- und Multimedia-Programmierung 4
R Kreuz lässt sich nicht zeichnen Spiele- und Multimedia-Programmierung 11
F einzelne Polygone(Graphics) schneller als and. Fig. zeichnen Spiele- und Multimedia-Programmierung 3
K Kugeln und Zylinder zeichnen Spiele- und Multimedia-Programmierung 4
L ein Rechteck zeichnen Spiele- und Multimedia-Programmierung 6
M Feste Blöcke mit Grafik Spiele- und Multimedia-Programmierung 9
Anfänger2011 Wichtig: Grafik und Sprites erstellen Spiele- und Multimedia-Programmierung 1
T grafik in bereiche einteilen (dartboard) Spiele- und Multimedia-Programmierung 14
T LWJGL Grafik meines Projektes läuft nicht korrekt auf meinem iMac Spiele- und Multimedia-Programmierung 19
S Wolken Bild/Grafik vom Programm erstellen lassen Spiele- und Multimedia-Programmierung 11
Luk10 Tipps für bessere Animationen / Grafik Engine Spiele- und Multimedia-Programmierung 2
M Einen Hobby Game - / Grafik Designer zu finden (Screenshot vom Spiel) Spiele- und Multimedia-Programmierung 7
D einfache 2D Grafik in JAVA. absoluter Anfänger Spiele- und Multimedia-Programmierung 5
R 2D Grafik JOGL Spiele- und Multimedia-Programmierung 18
Developer_X 3D Grafik Formeln Spiele- und Multimedia-Programmierung 35
S Grafik erstellen für Java Spiel Spiele- und Multimedia-Programmierung 8
Developer_X Java3D Grafik Boni Spiele- und Multimedia-Programmierung 8
H Grafik verschwindet durch Größenveränderung von GridBag Spiele- und Multimedia-Programmierung 5
N Felder auf Grafik Spiele- und Multimedia-Programmierung 2
R Grafik-Engine? MemoryImageSource? Spiele- und Multimedia-Programmierung 10
E Tester mit Intels Onboard-Grafik (o.ä.) gesucht! Spiele- und Multimedia-Programmierung 28
N Grafik als Hintergrund eines Rechtecks verwenden? Spiele- und Multimedia-Programmierung 4
G Entscheidungshilfe: Grafik-API Spiele- und Multimedia-Programmierung 5
T Spiel mit schöner Grafik, bitte testen Spiele- und Multimedia-Programmierung 10
V Wie bewege ich eine eingefügte Grafik (img) ? Spiele- und Multimedia-Programmierung 2

Ähnliche Java Themen

Neue Themen


Oben