# Flüssige Bewegungen



## Guest (20. Feb 2006)

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. (20. Feb 2006)

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.


----------



## Guest (20. Feb 2006)

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. (20. Feb 2006)

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


----------



## Guest (20. Feb 2006)

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 ,)


```
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. (20. Feb 2006)

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 (20. Feb 2006)

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

dank dir Ikarus


----------



## André B. (20. Feb 2006)

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


----------

