Flüssige Bewegungen

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Moin moin,

ich möchte ein Spielfigur(Kreis, Radius=5) vom Punkt X1 -> X2 bewegen, dabei hat diese Figure ein bestimmte Geschwindigkeit (speed=1) : also figur.x += speed;
Erhöhe ich jedoch die Geschwindigkeit (speed=5), fängt die Figur an zu Ruckeln... kein flüssiger Überlauf zu X2, da 5 Pixel "übersprungen" werden.
Die Frage: wie bekomme ich in solch einen Fall eine flüssige Bewegung hin?

hab dank
 

André B.

Bekanntes Mitglied
Vielleicht sollte die Geschwindigkeit nicht für die Pixel stehen, um die dein Teil bewegt wird, sonder wie oft , pro Sekunde z.B., deine Figur bewegt wird. Wenn du schnell aktualisierst, solltest du Doppelpufferung einsetzen. Ich glaube das wird auch im FAQ erklärt.
 
G

Guest

Gast
DoppelPufferung ist mit schon klar ;)
aber wie kann ich das mit den "wie oft , pro Sekunde" realisieren? bzw wonach (Begriff) soll ich in welcher FAQ suchen
 

André B.

Bekanntes Mitglied
Du musst ja, wenn du den Kreis bewegen willst, dein Bild alle x sec aktualisieren. Ich nehme mal an, dass das bei dir in einer Schleife gemacht wird. Wenn du nun sagst, der Kreis soll sich mit einer gewissen Geschwindigkeit bewegen, dann musst du halt ein gewisses Timeout in deine Schleife einbauen. Am besten postest du mal deinen Code.
MfG Ikarus
 
G

Guest

Gast
hier mal ein Test-Beispiel:
Bewegen: w,d,s,a Ende: x
wenn ich mit der Maus über die Oberfläche "gleite" dann sieht es um einiges flüssiger aus und sollte es auch mit der Tastatur ablaufen... wenns möglich ist ,)

Code:
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferStrategy;

public class Move extends Frame implements Runnable, KeyListener, MouseMotionListener {
	int x, y, mx, my, speed;
	BufferStrategy bs;
	Thread th;
	
	public static void main(String[] args) {
		Move frame = new Move();
		frame.animStart();
		frame.addKeyListener(frame);
		frame.addMouseMotionListener(frame);
	
	}
	
	Move() {
		x = 100;
		y = 100;
		mx = 0;
		my = 0;
		speed = 10;
		setSize(400, 400);
		setVisible(true);
		createBufferStrategy(2);
	
	}
	public void animStart() {
		th = new Thread(this);
		th.start();
	}
	public void makeD() {
		bs = this.getBufferStrategy();
		Graphics gs = bs.getDrawGraphics();
		
		draw(gs);
		gs.dispose();
		bs.show();
	}
	public void draw(Graphics g) {
		g.setColor(Color.RED);
		g.fillRect(0,0,400,400);
		g.setColor(Color.BLUE);
		g.fillOval(x,y, 10, 10);
		g.setColor(Color.GREEN);
		g.fillOval(mx-10,my-10, 10, 10);
	}
	public void run() {
		while(true) {
			makeD();
			
			try {
				Thread.sleep(0,1);
			} catch (InterruptedException e) {}
		}
	}

	public void keyTyped(KeyEvent e) { }

	public void keyPressed(KeyEvent e) {
		switch (e.getKeyChar()) {
		case 'w': y -= speed;  break;
		case 'd': x += speed; break;
		case 's': y += speed;  break;
		case 'a': x -= speed;  break;
		case 'x': this.dispose(); System.exit(0); break;
		}
		
	}

	public void keyReleased(KeyEvent e) { }

	public void mouseDragged(MouseEvent e) { }

	public void mouseMoved(MouseEvent e) {
		mx = e.getX();
		my = e.getY();
	}


	
}
 

André B.

Bekanntes Mitglied
So wie ich das sehe, machst du ja in der run Methode eine Schleife. Diese Schleife hat auch ein Timeout(Thread.sleep()). Ich denke dieses Timeout solltest du variabel halten, sodass es sich an die geschwindigkeit anpasst.
 

Ijon

Neues Mitglied
denkst du bei variabel an frames per second?
ich werde es dann mal testen...

dank dir Ikarus
 

André B.

Bekanntes Mitglied
Ijon hat gesagt.:
denkst du bei variabel an frames per second?
Sowas in der Art. Nur geht das natürlich so direkt nicht mehr, wenn du mehrere Objekte mit verschiedenen Geschwindigkeiten hast. Aber du machst das schon ;)
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben