Freie Bewegung Realisierung

Status
Nicht offen für weitere Antworten.

Ungetuem

Mitglied
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?

Code:
	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
 

André Uhres

Top Contributor
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

Top Contributor
_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

Top Contributor
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...
Code:
   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..:
Code:
   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:
Code:
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

Mitglied
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

Top Contributor
Bilder drehem mit AffineTransform.
Etwa so:

Code:
  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

Mitglied
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
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben