Action-Spiel in Java?

Status
Nicht offen für weitere Antworten.

Javaner 0815

Neues Mitglied
Hi,
---(genaues Problem unten, hier nur Einleitung)---
ich wollte mal ein einfaches Spiel in Java machen. Und wollt euch fragen, ob ich da grundlegend was falsch mache oder ob das nicht geht.

Und zwar wollte ich das erst in einem Frame (extends Frame) machen. Da trat aber ein Problem auf (gleiche wie unten), also suchte ich mal nach nem Tut und bin in dem Forum hier auf Quaxli's ausführliches 2D-Spieleprogrammierung-Tut gestoßen hier. Habe also JPannel und JFrame statt Frame genommen und die Bewegung anhand der vergangenen Zeit statt mit Einheiten je Zeit gemacht. Habe nicht das ganze Tut-Programm gemacht sondern nur in etwa die beschriebene Bewegung. Hatte da gleich die Dateien von meinem Frame-Spiel-Versuch genommen und abgeändert.

Problem: Bewegungen von Bild nicht flüssig.

Obwohl ich paintComponent vom JPanel aller 10ms (100fps) aufrufe ruckelt das bildvor sich hin. Auch 100ns bringen nix. Das Bild hat eine Geschwindigkeit von ca. 200px/sec.

hier relevanter code: (steuerung mit wasd)
Java:
  @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        setMovement();   
        time = System.nanoTime();
        g.drawImage(thePlayer, (int) player.x_pos, (int) player.y_pos, this);
    }

    public void run() {
        while (running) {
            paintComponent(data.getGraphics());
            try {
                Thread.sleep(10);
            } catch (InterruptedException ex) {
            }
        }
    }


//------------------
  public void setMovement() {
        if (data.getKeyboard().d_isD) {
            player.x_pos += 400*((double) (System.nanoTime() - time)) / div;
        }
        if (data.getKeyboard().a_isD) {
            player.x_pos -= 400*((double) (System.nanoTime() - time)) / div;
        }
        if (data.getKeyboard().s_isD) {
            player.y_pos += 400*((double) (System.nanoTime() - time)) / div;
        }
        if (data.getKeyboard().w_isD) {
            player.y_pos -= 400*((double) (System.nanoTime() - time)) / div;
        }
    }

oder ist das bild noch nicht geladen und muss immer wieder neu geladen werden?
Java:
 Image thePlayer = Toolkit.getDefaultToolkit().getImage("data\\player.jpg");

Dies ist zwar nicht 100% wie im Tut aber müsste doch auch klappen, oder?

Oder liegts daran, dass erst das alte bild gelöscht wird und dann das neue hinzu kommt und das so lange dauert, dass man denk es ist nich flüssig? Da Lieber noch ein 2. Bild reinmachen, dass dem ersten in der Bewegung folgt?
 

dayaftereh

Top Contributor
Hey, ich glaube das problem liegt daran das du die paintComponent Methode direckt aus der Schleife aufruft, normaler weiß ruf man die [java=11] public void repaint() [/code] auf, ich habe ein kleines Code beispiel am mit gepostet, ich hoffe das es dir Hilft, Also Ich erzuge eine JFame und füghe da ein JPanel hinzu, und überschiebe dan die [java=109] protected void paintComponent(Graphics g) [/code]. Auserdem füghe ich dan ein KeyListener auf das JPanel hinzu. um das Viereck auf dem jpanel zu bewegen, schau dir einfach mal den code an, bei fragen Scheib mir ne PN:

GameLoop.java
Java:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class GameLoop extends JPanel implements Runnable {
	
	private static final long serialVersionUID = -5173186462217554467L;
	
	/** Ob der Loop gestarted ist */
	private boolean started = true;
	/** Welche Pfeil taste gedrückt ist */
	private boolean up, down, left, right = false;

	/** Die Fps als int */
	private int fps = 0;
	/** der bewegungs speed ist 100px pro Sekunde */
	private int speed = 100;

	/** Letzte berechnugn von den fps */
	private long last = 0;
	/** das Delay */
	private long delay = 0;

	/** Der JFrame */
	private JFrame f = null;

	/** Die X und Y position vom Rechteck */
	private double x, y = 0;

	public GameLoop() {
		initComponents();
	}

	/**
	 * Erzeugt den {@link JFrame} und füght das {@link JPanel} hinzu
	 */
	private void initComponents() {
		f = new JFrame();
		f.setTitle("Game");
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		f.setLayout(new BorderLayout());

		this.setPreferredSize(new Dimension(800, 600));
		// Der KeyListener
		this.addKeyListener(new MoveAdapter());
		f.add(this, BorderLayout.CENTER);

		f.pack();
		f.setLocationRelativeTo(null);
		f.setVisible(true);

		this.requestFocus();
	}

	public void run() {
		last = System.nanoTime();

		// Setzt Start Position
		x = this.getWidth() / 2;
		y = this.getHeight() / 2;

		// Die render Schleife
		while (started) {

			// Berechnet das Delay und FPS
			culFPS();

			// Prüft die Tasten
			isKey();

			// Zeichnet neu
			this.repaint();

			// Schläft
			try {
				Thread.sleep(20);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * Prüft welche Taste gedrück worden ist und berechnet den Speed und addiert
	 * ihn zu der Position.
	 */
	private void isKey() {
		if (down) {
			y += (delay / 1e9) * speed;
		}
		if (up) {
			y -= (delay / 1e9) * speed;
		}
		if (right) {
			x += (delay / 1e9) * speed;
		}
		if (left) {
			x -= (delay / 1e9) * speed;
		}
	}

	@Override
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		g.drawString("Fps:" + fps, 10, 20);
		g.drawRect((int) x, (int) y, 50, 50);
	}

	/**
	 * Berechnung der FPS
	 */
	private void culFPS() {
		delay = System.nanoTime() - last;
		fps = (int) (1e9 / delay);
		last = System.nanoTime();
	}

	public static void main(String[] args) {
		GameLoop gameLoop = new GameLoop();
		Thread t = new Thread(gameLoop);
		t.start();
	}

	/**
	 * Der Key Listener
	 * 
	 * @author LoefflerL
	 * 
	 */
	private class MoveAdapter implements KeyListener {

		public void keyPressed(KeyEvent e) {
			if (e.getKeyCode() == KeyEvent.VK_UP) {
				up = true;
			} else if (e.getKeyCode() == KeyEvent.VK_DOWN) {
				down = true;
			} else if (e.getKeyCode() == KeyEvent.VK_LEFT) {
				left = true;
			} else if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
				right = true;
			}
		}

		public void keyReleased(KeyEvent e) {
			if (e.getKeyCode() == KeyEvent.VK_UP) {
				up = false;
			} else if (e.getKeyCode() == KeyEvent.VK_DOWN) {
				down = false;
			} else if (e.getKeyCode() == KeyEvent.VK_LEFT) {
				left = false;
			} else if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
				right = false;
			}
		}

		public void keyTyped(KeyEvent e) {

		}

	}

}
 

Javaner 0815

Neues Mitglied
Poste doch mal die Klasse von thePlayer oder gleich das ganze Game als ZIP
thePlayer ist nur das Bild (erster Post ganz unten)

aber ich denke du meintest player (hab nicht so tolle namen gemacht^^)

Java:
public class player {
double x_pos=100;
double y_pos=100;
}
sollte man nicht so machen! (Für die die das lesen, lieber get/set).
und btw thx für das schöne tut.


Hey, ich glaube das problem liegt daran das du die paintComponent Methode direckt aus der Schleife aufruft, normaler weiß ruf man die [java=11] public void repaint() [/code] auf
ja thx so klappts.
Ich weiß zwar nich warum aber es geht :)
Ist Java so schlau, dass es sich alles Componenten merkt und diese dann aktualisiert?
 

dayaftereh

Top Contributor
Hey

Also, die repaint methode kommt aus der Klasse Component, wie du weißt hat jedes Swing Componete die Klasse Component als Vater. So wenn du jetzt auf eine JFrame ein JPanel addes wird das JFrame zu dem obenliegendem Container, wird das JFrame neu gezeichentet (z.B. wenn es den Focus verliert und wieder bekommt) dan wird bei alle Component die auf dem JFrame liegt die paintComponent methode aufgerufen. dieses neu zeichnen geschiet duch die Methode repaint, also wenn der JFrame sein Focus wieder bekommt wird die Method repaint() aufgerufen und ruft bei allen Component die auf dem JFrame liegen die paintComponent methode auf. Vieleicht liesst du dir das noch mal nach und denke dran das du mit 2 Threads abeites, die paintComponent wird vom EventDispatcher-Thread aufgerufen, also muss du synchronize nutzen, wenn du objekte veränderst.

Ich weiß nur nich ob man in der paintComponent Methode auch die super.paintComponent aufrufen soll?

Wenn ich was falsch erklärt habe? pls Posten!
 

andre111

Bekanntes Mitglied
Auch wenn in paintComponent() kein super.paintComponent()-Aufruf drin ist, wird mit repaint() trotzdem neu gezeichnet.
 

dayaftereh

Top Contributor
Ja, das ist mir klar, nur als ich das mal ausprobiert habe , war das panel weiß als ich die super.paintComponent weg gelassen habe. und als ich sie wieder genutzt habe war das JPanel wieder Grau!
 

andre111

Bekanntes Mitglied
Der Aufruf von super.paintComponent() sorgt dafür, dass die Hintergrundfarbe gezeichnet wird --> grauer Hintergrund, ansonsten weiß. Sonst macht er bei einem JPanel nichts weiter (denke ich, bin mir aber nicht genau sicher).
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Black_ixx ManaWar Action Game Spiele- und Multimedia-Programmierung 5
xFearofdarkness Feinde überlappen sich in Java Spiel Spiele- und Multimedia-Programmierung 3
ItundMathe1994 TicTacToe Spiel programmieren Spiele- und Multimedia-Programmierung 2
JEP1 Hilfe bei Spiel Spiele- und Multimedia-Programmierung 1
P Pokemon Spiel Funktioniert nicht ? Spiele- und Multimedia-Programmierung 3
Leon.tr3x Mein erstes Programm/Spiel Spiele- und Multimedia-Programmierung 10
O Texas Hold'em Poker als Online-Spiel mit Freunden Spiele- und Multimedia-Programmierung 5
Drachenbauer Speicher-Tool für ein Spiel schreiben Spiele- und Multimedia-Programmierung 13
M Spiel Mühle-Programmierung Java Spiele- und Multimedia-Programmierung 9
Excess Spiel abzugeben Spiele- und Multimedia-Programmierung 1
I Superhelden - Spiel Spiele- und Multimedia-Programmierung 14
E Hauptmenü und Spiel ???? Spiele- und Multimedia-Programmierung 2
L Sound in Java Spiel Spiele- und Multimedia-Programmierung 5
R Interaktives Spiel Spiele- und Multimedia-Programmierung 5
L Spiel im Editor testen Spiele- und Multimedia-Programmierung 4
Jackii dispatchUncaughtException in Quiz Spiel mit GUI Layout Spiele- und Multimedia-Programmierung 6
D Textbasiertes Spiel Spiele- und Multimedia-Programmierung 8
K Android Spiel Programmieren Spiele- und Multimedia-Programmierung 6
L BrickBreaker Spiel Spiele- und Multimedia-Programmierung 3
A Spiel Figur ansprechen und bewegen Spiele- und Multimedia-Programmierung 3
it_is_all Dialogbox im Spiel - Text in Blöcke aufteilen Spiele- und Multimedia-Programmierung 4
F Koordinieren und Essen von Snake - Spiel Spiele- und Multimedia-Programmierung 14
G Entity Verwaltung in einem 2D Spiel Spiele- und Multimedia-Programmierung 1
E Möchte Spiel Programmieren Spiele- und Multimedia-Programmierung 7
S Connect6 Spiel - Code in ei Spiele- und Multimedia-Programmierung 2
A Spiel nach Abfrage beenden oder neustarten Spiele- und Multimedia-Programmierung 1
G Welten Generierung 2D Spiel Spiele- und Multimedia-Programmierung 4
G Java 2D Spiel mit LWJGL verbinden Spiele- und Multimedia-Programmierung 1
N Problem mit 2D Spiel Spiele- und Multimedia-Programmierung 17
T Probleme bei "Pixel-Fighting"-Spiel: Unausgewogene Mannschaften??? Spiele- und Multimedia-Programmierung 4
R Pong Spiel Problem Spiele- und Multimedia-Programmierung 1
L Coordinate Space JavaFX 2d Spiel Spiele- und Multimedia-Programmierung 0
C Vier Gewinnt Spiel Programmiertipp Spiele- und Multimedia-Programmierung 11
N Jump and run Spiel - wo anfangen / weitermachen? Spiele- und Multimedia-Programmierung 11
K Spiel zum zuordnen von Dienstgraden und Dienstgradabzeichen Spiele- und Multimedia-Programmierung 5
M Textbasiertes Spiel programmieren Spiele- und Multimedia-Programmierung 4
T 2d-Spiel Licht Spiele- und Multimedia-Programmierung 5
S Jump 'n' Run-Spiel Kollisionserkennung Spiele- und Multimedia-Programmierung 3
T Spiel rendern Spiele- und Multimedia-Programmierung 2
Grevak Sounds im Spiel Spiele- und Multimedia-Programmierung 5
B Fehlerhafte Mob Bewegungen in Tower Defense Spiel Spiele- und Multimedia-Programmierung 2
F Spiel ähnlich wie SimCity/o.ä programmieren Spiele- und Multimedia-Programmierung 5
X Erklärung zu einem Tic Tac Toe Spiel Spiele- und Multimedia-Programmierung 1
I Spectator Modus für Spiel ähnlich zu Terraria Spiele- und Multimedia-Programmierung 8
I Textbasiertes Spiel - Umsetzungsfrage & Schleifen Problem Spiele- und Multimedia-Programmierung 26
M Kollisions abfrage bei 3D spiel? Spiele- und Multimedia-Programmierung 12
D JAVA Basiertes Spiel aus dem Internet in eigenem Client laden Spiele- und Multimedia-Programmierung 1
P [Spiel]Welche Bilder sind gleich Spiele- und Multimedia-Programmierung 2
E GUI zum Spiel hinzufügen Spiele- und Multimedia-Programmierung 19
S 2D Spiel - Physics Spiele- und Multimedia-Programmierung 16
S 2D Spiel "Der Sprung" Spiele- und Multimedia-Programmierung 7
A 2D Spiel ohne Tiles Spiele- und Multimedia-Programmierung 10
V welche vorgehensweise beforzieht ihr bei einfachem Quizz Spiel ? Spiele- und Multimedia-Programmierung 4
S Quaxli's Heli Spiel läuft nicht nach Plan Spiele- und Multimedia-Programmierung 2
G Methode sleepen während das Spiel weiterläuft Spiele- und Multimedia-Programmierung 3
T Spiel Überprüfung Spiele- und Multimedia-Programmierung 3
P Spiel laggt nach unbestimmter Zeit tierisch. Spiele- und Multimedia-Programmierung 27
S Hilfe bei Spiel Spiele- und Multimedia-Programmierung 6
B Hauptmenü für Spiel Spiele- und Multimedia-Programmierung 1
W Spiel ist langsam/laggt Spiele- und Multimedia-Programmierung 18
J Ascii Spiel Spiele- und Multimedia-Programmierung 1
Androbin Mein Spiel will sich nicht zeichnen lassen !!! Spiele- und Multimedia-Programmierung 7
O Vollständige Musik in Spiel einbauen (wav - Format) Spiele- und Multimedia-Programmierung 8
Y Quiz Spiel Spiele- und Multimedia-Programmierung 1
J Conways Spiel des Lebens nachprogrammiert Spiele- und Multimedia-Programmierung 1
B Spiel Programmieren, die Anfänge Spiele- und Multimedia-Programmierung 6
D [OpenGL] Spiel in der Art von Age of Empires Spiele- und Multimedia-Programmierung 4
lord239123 suche Graphiker für ein Pokemon-Spiel Spiele- und Multimedia-Programmierung 6
S Spiel installeren lassen und organisieren Spiele- und Multimedia-Programmierung 3
J Lichtupdate in tile-basiertem Spiel Spiele- und Multimedia-Programmierung 4
P Erstes Spiel (Strategie) Spiele- und Multimedia-Programmierung 31
J Mein erstes Spiel [Spielevorstellung] Spiele- und Multimedia-Programmierung 2
Bananabert Spiel Renderer Images und Strings Spiele- und Multimedia-Programmierung 4
N Spiel Menü error ! Spiele- und Multimedia-Programmierung 5
S Anfangsmenü mit Spiel verknüpfen Spiele- und Multimedia-Programmierung 16
S Spiel ruckelt trotz 50 fps Spiele- und Multimedia-Programmierung 16
D Spiel-Bilddaten auswerten Spiele- und Multimedia-Programmierung 7
Creylon [LWJGL] Spiel Exportieren Spiele- und Multimedia-Programmierung 2
L Hilfe bei Klassendesign für Spiel Spiele- und Multimedia-Programmierung 2
Devil0s Spiel laggt trotz 90 FPS (bei der Anzeige) Spiele- und Multimedia-Programmierung 9
N Webanwendung als eine Art Spiel Spiele- und Multimedia-Programmierung 8
L Korrekte Darstellung von Wasser in 2D Spiel Spiele- und Multimedia-Programmierung 4
F Ideen für spiel Spiele- und Multimedia-Programmierung 4
J wohin mit der Logik des Spiel Spiele- und Multimedia-Programmierung 2
R Experimente mit Quaxlis Spiel Spiele- und Multimedia-Programmierung 12
W Spiel-Grundlagen selbst austüfteln: Kollisionen? Spiele- und Multimedia-Programmierung 3
Kenan89 Java 2D Spiel Spiele- und Multimedia-Programmierung 39
M Automaten Spiel Spiele- und Multimedia-Programmierung 27
J Tic tac toe spiel Neustart Spiele- und Multimedia-Programmierung 5
S 2D Spiel im Vollbild langsamer als im Fenster Spiele- und Multimedia-Programmierung 11
A TicTacToe Spiel Spiele- und Multimedia-Programmierung 3
S Verbesserungvorschläge Spiel Z Spiele- und Multimedia-Programmierung 31
S Spiel abbrechen Spiele- und Multimedia-Programmierung 3
J Greenfoot "Little Crab" Spiel Erweiterungen Spiele- und Multimedia-Programmierung 6
P Spiel HUD erstellen Spiele- und Multimedia-Programmierung 6
E Spiel neustarten Spiele- und Multimedia-Programmierung 4
S Aufbau von Klassen für Spiel Spiele- und Multimedia-Programmierung 13
A Grundlagensuche für Spiel Spiele- und Multimedia-Programmierung 8
V Basisprinzipien Breakout-Spiel Spiele- und Multimedia-Programmierung 8
E Spiel startet nach exportieren nicht Spiele- und Multimedia-Programmierung 7

Ähnliche Java Themen

Neue Themen


Oben