# Freie Bewegung Realisierung



## Ungetuem (29. Aug 2007)

Hallo, ich habe mir mal ein Program überlegt mit dem ich meine Figur in jede Richtung frei steuern kann.
Allerdings finde ich  das ganze sowas von umständlich dass mir schlecht wird. wie hätte man das einfacher realisieren können? oder ist das so nötrig?


```
public class Spieler extends Canvas
{
	double _xposi;
	double _yposi;
	int _bewegungsrichtung; //(0-39)*9 grad
	double[] _xybewegungen;
	int _hp;
	int _energie;
	int _schilde;
	int _waffe;
	int _powerup;
	Image _spielerbild;
	Schuss[] _schuesse;
	
	
	
	
	public Spieler()
	{
		_xposi = 300.0;
		_yposi = 300.0;
		_bewegungsrichtung = 0;
		_xybewegungen = new double[2];
		_xybewegungen[0] = 3;
		_xybewegungen[1] = 0;
		_hp = 100;
		_energie = 100;
		_schilde = 100;
		_waffe = 1;
		_powerup = 0;
		_spielerbild = Toolkit.getDefaultToolkit().getImage("spielerbild0.gif");
		_schuesse = new Schuss[100];
	}
	
	public Spieler(int xposi, int yposi, int bewegungsrichtung, int hp, int energie, int schilde, int waffe, int powerup)
	{
		_xposi = xposi;
		_yposi = yposi;
		_hp = hp;
		_energie = energie;
		_schilde = schilde;
		_waffe = waffe;
		_powerup = powerup;
		_spielerbild = Toolkit.getDefaultToolkit().getImage("");
	}
	
	public void schiessen()
	{
		for(int i=0; i<100; i++)
		{
			if(_schuesse[i] == null)
			{
				_schuesse[i] = new Schuss();
				_schuesse[i].setzeXPosi(_xposi);
				_schuesse[i].setzeYPosi(_yposi);
				_schuesse[i].setzeBewegungsRichtung(_bewegungsrichtung);
				break;
			}
		}
	}
	
	public Schuss[] gibSchuesse()
	{
		return _schuesse;
	}
	
	public void nachVornBewegen()
	{
		_xposi = _xposi + _xybewegungen[0];
		_yposi = _yposi + _xybewegungen[1];
	}
	
	public void nachRechtsDrehen()
	{
		if(gibBewegungsRichtung() < 39)
		{
			setzeBewegungsRichtung(gibBewegungsRichtung()+1);
		}
		if(gibBewegungsRichtung() == 39)
		{
			setzeBewegungsRichtung(0);
		}
	}
	
	public void nachLinksDrehen()
	{
		if(gibBewegungsRichtung() > 0)
		{
			setzeBewegungsRichtung(gibBewegungsRichtung()-1);
		}
		if(gibBewegungsRichtung() == 0)
		{
			setzeBewegungsRichtung(39);
		}

	}
	
	public void setzeXPosi(int xposi)
	{
		_xposi = xposi;
	}
	
	public int gibXPosi()
	{
		return (int)_xposi+1;
	}
	public void setzeYPosi(int yposi)
	{
		_yposi = yposi;
	}
	
	public int gibYPosi()
	{
		return (int)_yposi+1;
	}
	
	public void setzeBewegungsRichtung(int bewegungsrichtung)
	{
		_bewegungsrichtung = bewegungsrichtung;
		if(_bewegungsrichtung == 0)
		{
			_xybewegungen[0] = 3*Math.cos(0.0/40*2*Math.PI);
			_xybewegungen[1] = 3*Math.sin(0.0/40*2*Math.PI);
			_spielerbild = Toolkit.getDefaultToolkit().getImage("spielerbild0.gif");
		}
		if(_bewegungsrichtung == 1)
		{
			_xybewegungen[0] = 3*Math.cos(1.0/40*2*Math.PI);
			_xybewegungen[1] = 3*Math.sin(1.0/40*2*Math.PI);
			_spielerbild = Toolkit.getDefaultToolkit().getImage("spielerbild1.gif");
		}
		if(_bewegungsrichtung == 2)
		{
			_xybewegungen[0] = 3*Math.cos(2.0/40*2*Math.PI);
			_xybewegungen[1] = 3*Math.sin(2.0/40*2*Math.PI);
			_spielerbild = Toolkit.getDefaultToolkit().getImage("spielerbild2.gif");
		}
		if(_bewegungsrichtung == 3)
		{
			_xybewegungen[0] = 3*Math.cos(3.0/40*2*Math.PI);
			_xybewegungen[1] = 3*Math.sin(3.0/40*2*Math.PI);
			_spielerbild = Toolkit.getDefaultToolkit().getImage("spielerbild3.gif");
		}
		if(_bewegungsrichtung == 4)
		{
			_xybewegungen[0] = 3*Math.cos(4.0/40*2*Math.PI);
			_xybewegungen[1] = 3*Math.sin(4.0/40*2*Math.PI);	
			_spielerbild = Toolkit.getDefaultToolkit().getImage("spielerbild4.gif");
		}
		
		if(_bewegungsrichtung == 5)
		{
			_xybewegungen[0] = 3*Math.cos(5.0/40*2*Math.PI);
			_xybewegungen[1] = 3*Math.sin(5.0/40*2*Math.PI);
			_spielerbild = Toolkit.getDefaultToolkit().getImage("spielerbild5.gif");
		}
		if(_bewegungsrichtung == 6)
		{
			_xybewegungen[0] = 3*Math.cos(6.0/40*2*Math.PI);
			_xybewegungen[1] = 3*Math.sin(6.0/40*2*Math.PI);
			_spielerbild = Toolkit.getDefaultToolkit().getImage("spielerbild6.gif");
		}
		if(_bewegungsrichtung == 7)
		{
			_xybewegungen[0] = 3*Math.cos(7.0/40*2*Math.PI);
			_xybewegungen[1] = 3*Math.sin(7.0/40*2*Math.PI);
			_spielerbild = Toolkit.getDefaultToolkit().getImage("spielerbild7.gif");
		}
		if(_bewegungsrichtung == 8)
		{
			_xybewegungen[0] = 3*Math.cos(8.0/40*2*Math.PI);
			_xybewegungen[1] = 3*Math.sin(8.0/40*2*Math.PI);
			_spielerbild = Toolkit.getDefaultToolkit().getImage("spielerbild8.gif");
		}
		if(_bewegungsrichtung == 9)
		{
			_xybewegungen[0] = 3*Math.cos(9.0/40*2*Math.PI);
			_xybewegungen[1] = 3*Math.sin(9.0/40*2*Math.PI);
			_spielerbild = Toolkit.getDefaultToolkit().getImage("spielerbild9.gif");
		}
		if(_bewegungsrichtung == 10)
		{
			_xybewegungen[0] = 3*Math.cos(10.0/40*2*Math.PI);
			_xybewegungen[1] = 3*Math.sin(10.0/40*2*Math.PI);	
			_spielerbild = Toolkit.getDefaultToolkit().getImage("spielerbild10.gif");
		}
		if(_bewegungsrichtung == 11)
		{
			_xybewegungen[0] = 3*Math.cos(11.0/40*2*Math.PI);
			_xybewegungen[1] = 3*Math.sin(11.0/40*2*Math.PI);
			_spielerbild = Toolkit.getDefaultToolkit().getImage("spielerbild11.gif");
		}
		if(_bewegungsrichtung == 12)
		{
			_xybewegungen[0] = 3*Math.cos(12.0/40*2*Math.PI);
			_xybewegungen[1] = 3*Math.sin(12.0/40*2*Math.PI);
			_spielerbild = Toolkit.getDefaultToolkit().getImage("spielerbild12.gif");
		}
		if(_bewegungsrichtung == 13)
		{
			_xybewegungen[0] = 3*Math.cos(13.0/40*2*Math.PI);
			_xybewegungen[1] = 3*Math.sin(13.0/40*2*Math.PI);
			_spielerbild = Toolkit.getDefaultToolkit().getImage("spielerbild13.gif");
		}
		if(_bewegungsrichtung == 14)
		{
			_xybewegungen[0] = 3*Math.cos(14.0/40*2*Math.PI);
			_xybewegungen[1] = 3*Math.sin(14.0/40*2*Math.PI);
			_spielerbild = Toolkit.getDefaultToolkit().getImage("spielerbild14.gif");
		}
		if(_bewegungsrichtung == 15)
		{
			_xybewegungen[0] = 3*Math.cos(15.0/40*2*Math.PI);
			_xybewegungen[1] = 3*Math.sin(15.0/40*2*Math.PI);
			_spielerbild = Toolkit.getDefaultToolkit().getImage("spielerbild15.gif");
		}
		if(_bewegungsrichtung == 16)
		{
			_xybewegungen[0] = 3*Math.cos(16.0/40*2*Math.PI);
			_xybewegungen[1] = 3*Math.sin(16.0/40*2*Math.PI);	
			_spielerbild = Toolkit.getDefaultToolkit().getImage("spielerbild16.gif");
		}
		if(_bewegungsrichtung == 17)
		{
			_xybewegungen[0] = 3*Math.cos(17.0/40*2*Math.PI);
			_xybewegungen[1] = 3*Math.sin(17.0/40*2*Math.PI);
			_spielerbild = Toolkit.getDefaultToolkit().getImage("spielerbild17.gif");
		}
		if(_bewegungsrichtung == 18)
		{
			_xybewegungen[0] = 3*Math.cos(18.0/40*2*Math.PI);
			_xybewegungen[1] = 3*Math.sin(18.0/40*2*Math.PI);
			_spielerbild = Toolkit.getDefaultToolkit().getImage("spielerbild18.gif");
		}
		if(_bewegungsrichtung == 19)
		{
			_xybewegungen[0] = 3*Math.cos(19.0/40*2*Math.PI);
			_xybewegungen[1] = 3*Math.sin(19.0/40*2*Math.PI);
			_spielerbild = Toolkit.getDefaultToolkit().getImage("spielerbild19.gif");
		}
		if(_bewegungsrichtung == 20)
		{
			_xybewegungen[0] = 3*Math.cos(20.0/40*2*Math.PI);
			_xybewegungen[1] = 3*Math.sin(20.0/40*2*Math.PI);
			_spielerbild = Toolkit.getDefaultToolkit().getImage("spielerbild20.gif");
		}
		if(_bewegungsrichtung == 21)
		{
			_xybewegungen[0] = 3*Math.cos(21.0/40*2*Math.PI);
			_xybewegungen[1] = 3*Math.sin(21.0/40*2*Math.PI);
			_spielerbild = Toolkit.getDefaultToolkit().getImage("spielerbild21.gif");
		}
		if(_bewegungsrichtung == 22)
		{
			_xybewegungen[0] = 3*Math.cos(22.0/40*2*Math.PI);
			_xybewegungen[1] = 3*Math.sin(22.0/40*2*Math.PI);
			_spielerbild = Toolkit.getDefaultToolkit().getImage("spielerbild22.gif");
		}
		if(_bewegungsrichtung == 23)
		{
			_xybewegungen[0] = 3*Math.cos(23.0/40*2*Math.PI);
			_xybewegungen[1] = 3*Math.sin(23.0/40*2*Math.PI);
			_spielerbild = Toolkit.getDefaultToolkit().getImage("spielerbild23.gif");
		}
		if(_bewegungsrichtung == 24)
		{
			_xybewegungen[0] = 3*Math.cos(24.0/40*2*Math.PI);
			_xybewegungen[1] = 3*Math.sin(24.0/40*2*Math.PI);
			_spielerbild = Toolkit.getDefaultToolkit().getImage("spielerbild24.gif");
		}
		if(_bewegungsrichtung == 25)
		{
			_xybewegungen[0] = 3*Math.cos(25.0/40*2*Math.PI);
			_xybewegungen[1] = 3*Math.sin(25.0/40*2*Math.PI);
			_spielerbild = Toolkit.getDefaultToolkit().getImage("spielerbild25.gif");
		}
		if(_bewegungsrichtung == 26)
		{
			_xybewegungen[0] = 3*Math.cos(26.0/40*2*Math.PI);
			_xybewegungen[1] = 3*Math.sin(26.0/40*2*Math.PI);
			_spielerbild = Toolkit.getDefaultToolkit().getImage("spielerbild26.gif");
		}
		if(_bewegungsrichtung == 27)
		{
			_xybewegungen[0] = 3*Math.cos(27.0/40*2*Math.PI);
			_xybewegungen[1] = 3*Math.sin(27.0/40*2*Math.PI);
			_spielerbild = Toolkit.getDefaultToolkit().getImage("spielerbild27.gif");
		}
		if(_bewegungsrichtung == 28)
		{
			_xybewegungen[0] = 3*Math.cos(28.0/40*2*Math.PI);
			_xybewegungen[1] = 3*Math.sin(28.0/40*2*Math.PI);
			_spielerbild = Toolkit.getDefaultToolkit().getImage("spielerbild28.gif");
		}
		if(_bewegungsrichtung == 29)
		{
			_xybewegungen[0] = 3*Math.cos(29.0/40*2*Math.PI);
			_xybewegungen[1] = 3*Math.sin(29.0/40*2*Math.PI);
			_spielerbild = Toolkit.getDefaultToolkit().getImage("spielerbild29.gif");
		}
		if(_bewegungsrichtung == 30)
		{
			_xybewegungen[0] = 3*Math.cos(30.0/40*2*Math.PI);
			_xybewegungen[1] = 3*Math.sin(30.0/40*2*Math.PI);
			_spielerbild = Toolkit.getDefaultToolkit().getImage("spielerbild30.gif");
		}
		if(_bewegungsrichtung == 31)
		{
			_xybewegungen[0] = 3*Math.cos(31.0/40*2*Math.PI);
			_xybewegungen[1] = 3*Math.sin(31.0/40*2*Math.PI);
			_spielerbild = Toolkit.getDefaultToolkit().getImage("spielerbild31.gif");
		}
		if(_bewegungsrichtung == 32)
		{
			_xybewegungen[0] = 3*Math.cos(32.0/40*2*Math.PI);
			_xybewegungen[1] = 3*Math.sin(32.0/40*2*Math.PI);
			_spielerbild = Toolkit.getDefaultToolkit().getImage("spielerbild32.gif");
		}
		if(_bewegungsrichtung == 33)
		{
			_xybewegungen[0] = 3*Math.cos(33.0/40*2*Math.PI);
			_xybewegungen[1] = 3*Math.sin(33.0/40*2*Math.PI);
			_spielerbild = Toolkit.getDefaultToolkit().getImage("spielerbild33.gif");
		}
		if(_bewegungsrichtung == 34)
		{
			_xybewegungen[0] = 3*Math.cos(34.0/40*2*Math.PI);
			_xybewegungen[1] = 3*Math.sin(34.0/40*2*Math.PI);
			_spielerbild = Toolkit.getDefaultToolkit().getImage("spielerbild34.gif");
		}
		if(_bewegungsrichtung == 35)
		{
			_xybewegungen[0] = 3*Math.cos(35.0/40*2*Math.PI);
			_xybewegungen[1] = 3*Math.sin(35.0/40*2*Math.PI);
			_spielerbild = Toolkit.getDefaultToolkit().getImage("spielerbild35.gif");
		}
		if(_bewegungsrichtung == 36)
		{
			_xybewegungen[0] = 3*Math.cos(36.0/40*2*Math.PI);
			_xybewegungen[1] = 3*Math.sin(36.0/40*2*Math.PI);
			_spielerbild = Toolkit.getDefaultToolkit().getImage("spielerbild36.gif");
		}
		if(_bewegungsrichtung == 37)
		{
			_xybewegungen[0] = 3*Math.cos(37.0/40*2*Math.PI);
			_xybewegungen[1] = 3*Math.sin(37.0/40*2*Math.PI);
			_spielerbild = Toolkit.getDefaultToolkit().getImage("spielerbild37.gif");
		}
		if(_bewegungsrichtung == 38)
		{
			_xybewegungen[0] = 3*Math.cos(38.0/40*2*Math.PI);
			_xybewegungen[1] = 3*Math.sin(38.0/40*2*Math.PI);
			_spielerbild = Toolkit.getDefaultToolkit().getImage("spielerbild38.gif");
		}
		if(_bewegungsrichtung == 39)
		{
			_xybewegungen[0] = 3*Math.cos(39.0/40*2*Math.PI);
			_xybewegungen[1] = 3*Math.sin(39.0/40*2*Math.PI);
			_spielerbild = Toolkit.getDefaultToolkit().getImage("spielerbild39.gif");
		}
		
	}
	
	public int gibBewegungsRichtung()
	{
		return _bewegungsrichtung;
	}
	
	public void setzeXybewegung(double[] xybewegungen)
	{
		_xybewegungen = xybewegungen;
	}
	
	public double[] gibXybewegung()
	{
		return _xybewegungen;
	}
	
	public void setzeHP(int hp)
	{
		_hp = hp;
	}
	
	public int gibHP()
	{
		return _hp;
	}
	
	public void setzeEnergie(int energie)
	{
		_energie = energie;
	}
	
	public int gibEnergie()
	{
		return _energie;
	}
	
	public void setzeSchilde(int schilde)
	{
		_schilde = schilde;
	}
	
	public int gibSchilde()
	{
		return _schilde;
	}
	
	public void setzeWaffe(int waffe)
	{
		_waffe = waffe;
	}
	
	public int gibWaffe()
	{
		return _waffe;
	}
	
	public void setzePowerup(int powerup)
	{
		_powerup = powerup;
	}
	
	public int gibPowerup()
	{
		return _powerup;
	}
	
	
	public void zeichnen(Graphics g)
	{
		g.drawImage(_spielerbild,gibXPosi(),gibYPosi(),this);
		for(int i=0; i<_schuesse.length; i++)
		{
			if(_schuesse[i] != null)
			{
				_schuesse[i].zeichnen(g);
			}
		}
	}
}
```


mfg ungetuem


----------



## Ungetuem (29. Aug 2007)

es geht halt um die methode setzeBewegungsRichtung
mfg


----------



## André Uhres (29. Aug 2007)

Class "basics.Spieler" does not have a main method.


----------



## Ungetuem (30. Aug 2007)

was soll das heißen?
mfg ungetuem


----------



## André Uhres (30. Aug 2007)

Ungetuem hat gesagt.:
			
		

> was soll das heißen?
> mfg ungetuem


Daß die Klasse Spieler keine main Methode hat


----------



## Evolver (30. Aug 2007)

André Uhres hat gesagt.:
			
		

> Ungetuem hat gesagt.:
> 
> 
> 
> ...



Seit wann hat jede Klasse eine main-Methode. Wäre ja ziemlich blöd. Das ist schließlich kein Spiel, sondern nur eine Klasse für eine Spielfigur, so wie ich das verstanden habe.


----------



## André Uhres (30. Aug 2007)

Evolver hat gesagt.:
			
		

> ..Seit wann hat jede Klasse eine main-Methode..


Wieso *jede *Klasse, ich seh hier nur eine einzige: Spieler   :roll:

EDIT: Achso, du meinst, da sind noch andere, die er uns vorenthält. 
Und wenn irgend jemand das ausprobieren will? 
Soll dann jeder einzelne Benutzer die fehlenden Klassen jeweils alle selbst erfinden?  :bloed:


----------



## Quaxli (30. Aug 2007)

> _spielerbild = Toolkit.getDefaultToolkit().getImage("spielerbild37.gif");



Das ist gaaanz schlecht. Jedes Mal wenn Du die Bewegungsrichtung änderst, lädst Du das Bild neu. Das kostet Zeit.
Idealerweise lädt man das vorher und schaltet dann nur noch um. Mal davon abgesehen, finde ich 40 Bewegungsrichtungen übertrieben.
8 Richtungen reichen doch meistens, oder?
Wenn Du das aber willst, würde ich versuchen, das nicht über Einzelbilder, sonder über eine Drehung Deines Images zu erreichen.


----------



## Marco13 (30. Aug 2007)

Quaxli's Hinweis ist schonmal ganz wichtig. Die Bilder sollten einmal am Anfang geladen werden, und dann z.B. in einem Array liegen. Und sonst... In diesem Block...

```
public void setzeBewegungsRichtung(int bewegungsrichtung)
   {
      _bewegungsrichtung = bewegungsrichtung;
      if(_bewegungsrichtung == 0)
      {
         _xybewegungen[0] = 3*Math.cos(0.0/40*2*Math.PI);
         _xybewegungen[1] = 3*Math.sin(0.0/40*2*Math.PI);
         _spielerbild = Toolkit.getDefaultToolkit().getImage("spielerbild0.gif");
      } 
      ...
      if(_bewegungsrichtung == 39)
      {
         _xybewegungen[0] = 3*Math.cos(39.0/40*2*Math.PI);
         _xybewegungen[1] = 3*Math.sin(39.0/40*2*Math.PI);
         _spielerbild = Toolkit.getDefaultToolkit().getImage("spielerbild39.gif");
      }
```
ist ein gewisses "Muster" erkennst, das es naheliegend erscheienen läßt, ihn eher so zu schreiben..:

```
public void setzeBewegungsRichtung(int bewegungsrichtung)
   {
      _bewegungsrichtung = bewegungsrichtung;
      _xybewegungen[0] = 3*Math.cos(_bewegungsrichtung/40*2*Math.PI);
      _xybewegungen[1] = 3*Math.sin(_bewegungsrichtung/40*2*Math.PI);
      _spielerbild = spielerBilder[_bewegungsrichtung]; // Die vorher einmal geladenen Bilder
```
Und damit du nicht beim Laden der Bilder das gleiche machst, noch der Tipp zum Laden:

```
for (int i=0; i<40; i++)
{
    spielerBilder[i] = Toolkit.getDefaultToolkit().getImage("spielerbild"+i+".gif");
}
```

Abgesehen davon ... sollten Variablennamen imho NICHT mit einem _ anfangen....


----------



## Ungetuem (30. Aug 2007)

soo
Guten Morgen und danke für die ANtworten.
Die Bilder vorher zu laden macht natürlich mehr Sinn, hab ich jetzt geändert. variablen mit _ zu benennen wurde uns so beigrbracht, naja ist geschmackssache denk ich.

zu den 40 verschiedenen Bildern: Ja vllt etwas viel, aber sieht butterweich aus 

Was mich aber sehr interessieren würde, weils mir viel arbeit ersparen würde ist: Wie kann ich das bild in java drehen anstatt immer ein neues zu laden?


Mfg ungetuem


----------



## Quaxli (30. Aug 2007)

Bilder drehem mit AffineTransform. 
Etwa so:


```
AffineTransform at = new AffineTransform();
  ....

  public void drawObject(Graphics2D g) {
  	
    if (angle != 0) {
      at.rotate(Math.toRadians(angle), x + rotationx , y + rotationy);
      g.setTransform(at);
      g.drawImage(pics[current], (int) x, (int) y, this.master);
      at.rotate(-Math.toRadians(angle), x + rotationx , y + rotationy);
      g.setTransform(at);
    } else {
      g.drawImage(pics[current], (int) x, (int) y, this.master);
    }
  }
```
Das ist mein Code, den ich standardmäßig verwenden. 
Das AffineTransform-Objekt erzeuge ich schon im Konstruktor.
x/y sind die Koordinaten des Objektes
rotationx/rotationy ist der Rotationspunkt des Objektes mit x/y als Nullpunkt
pics[current] ist das aktuelle Image aus einem Array (int current ist mein "Animationszähler")


Ein Nachteil dieser vorgehensweise ist aber, daß es etwas frickeliger wird, wenn man pixelgenaue Kollisionen berechnen will.


----------



## Ungetuem (30. Aug 2007)

ok super vielen dank!!
ich hab noch ne frage für die ich kein neues topic eröffnen wollte, unzdwar würde ich gern wissen ob ihr gute adressen kennt wo man frei verfügbare grafiken für spieleentwickler bekommt..
wäre euch wirklich dankbar

mfg ungetüm


----------



## Quaxli (30. Aug 2007)

Ja. Google.


----------



## Quaxli (30. Aug 2007)

Such mal nach "free sprites"


----------

