# 2D Vogelperspektive



## Flu5hy (5. Dez 2013)

Hallo ihr lieben,
ich habe ein kleines Verständnisproblem bei einem 2D-Spiel welches ich programmieren will.

Und zwar gibt es eine 2D Welt in der jedes Element eine Position(x,y) und einen Blickwinkel besitzt.
Mein Problem ist, dass ich nicht genau Weiß wie ich die Elemente auf der Grafikoberfläche platzieren kann,
denn wenn der Spieler (der in der Mitte des Bildschirms angezeigt werden soll) seine Blickrichtung oder Position ändert müssen ja alle anderen Elemente mit ihrer relativen Position vom Spieler angezeigt werden. (Um das Gefühl zu erzeugen der Bildschirm würde rotieren)

Ich habe mich mal an einer kleinen Zeichnung versucht:
http://i.imgur.com/lvFZ5zk.jpg

Ich zeichne das ganze in einem JPanel über das Graphics2D-Objekt.

Weiß zufällig jemand die Lösung? Ich komme einfach nicht darauf, alle meine Lösungsversuche scheinen die anderen Elemente um den Ursprungspunkt rotieren zu lassen wenn ich den Spieler drehe.

Hier mal mein momentaner Code, der nicht wirklich funktioniert :/

```
Player p = Main.player;
		Vector playerPos = p.getPosition(); //Meine Eigene Klasse, nicht die aus java.util
		int screenX = Main.window.getWidth();
		int screenY = Main.window.getHeight();

		g2d.translate(playerPos.getIntX(), playerPos.getIntY());
		g2d.rotate(p.getView().getAngle());
		for(int i=0;i<e.length;i++) {
			e[i].paintComponent(g2d, 0, 0); //Zeichnen der Elemente
		}
		g2d.rotate(-p.getView().getAngle());
		g2d.translate(-playerPos.getIntX(), -playerPos.getIntY());

		g2d.translate(screenX/2, screenY/2);

		Gfx.fillCenteredQuad(g2d, 0, 0, p.getHitBox()); //Statische Methode die an (0,0) den 
//Spieler zeichnen soll.
```


----------



## Flu5hy (6. Dez 2013)

Ich bin's nochmal.
Ich habe jetzt eine andere Methode versucht mein Problem zu lösen indem ich die Position der Elemente relativ zum Spieler zeichne indem ich die relativen x und y Werte in einem Vektor speichere den ich dann entgegengesetzt zum Spieler-Blickwinkel rotiere.
Das ganze funktioniert soweit ganz gut, allerdings nur in einem Blickfeld von 180°.
Wenn ich über die 180° hinausdrehe springt er wieder auf 0° anstatt dann z.B. zu 190° weiterzudrehen.
Ich verstehe irgendwie nicht ganz wieso er das macht, die Vektor-methoden müssten eigentlich soweit richtig sein.

Der unterschied der Blickwinkel zwischen den beiden bildern beträgt nur ungefähr 10°


```
public class Vector {
	private Double x;
	private Double y;

	public void rotateBy(Double alpha) {
		double sinAlpha=Math.sin(alpha);
		double cosAlpha=Math.cos(alpha);
		double tempX=x;
		x=x*cosAlpha-y*sinAlpha;
		y=tempX*sinAlpha+y*cosAlpha;
	}

	public Double getAngle() {
		return Math.atan(y/x);
	}
}

public class Enemy extends Unit {
	@Override
	public void paintComponent(Graphics2D g2d, int offX, int offY) {
		//offX und offY sind die Offsets vom oberen linken Bildschirmrand zum Mittelpunkt des 
        //Bildschirms
		Vector playerPos = Main.player.getPosition();
		double angle=Main.player.getView().getAngle();
		double relativeX=playerPos.getX()-getPosition().getX();
		double relativeY=playerPos.getY()-getPosition().getY();
		Vector relativePos = new Vector(relativeX, relativeY);
		relativePos.rotateBy(-angle);
		
		Rectangle2D.Double r2d = new Rectangle2D.Double(relativePos.getIntX()+offX-getHitBox()/2,relativePos.getIntY()+offY-getHitBox()/2,getHitBox(),getHitBox());
		AffineTransform at = AffineTransform.getRotateInstance(getView().getAngle()+angle, relativePos.getIntX()+offX, relativePos.getIntY()+offY);
		Shape rect = at.createTransformedShape(r2d);
		g2d.fill(rect);
	}

}
```


----------



## rme (6. Dez 2013)

Könnte dein Problem an der Unstetigkeit von atan liegen? Für sowas verwendet man eigentlich atan2(y, x) statt atan(y / x). Siehe Arkustangens und Arkuskotangens ? Wikipedia


----------



## Flu5hy (6. Dez 2013)

rme hat gesagt.:


> Könnte dein Problem an der Unstetigkeit von atan liegen? Für sowas verwendet man eigentlich atan2(y, x) statt atan(y / x). Siehe Arkustangens und Arkuskotangens ? Wikipedia



Oh man, vielen dank!
Genau das war's :toll:


----------

