# Kollisionsprob bei Jump&Run



## Soleil83 (16. Jan 2005)

Hallo, folgendes Jump & Rund Problem: ... meine spielfigur rennt gegen einen Gegner. dabei wird folgende Methode aufgerufen

```
private static long t()
{return System.currentTimeMillis();}
private long letzteKollision;

        public boolean kollidiertMitGegner(PositionierbaresElement derAndere)
	{
	if(t()-letzteKollision<3000)return false; // Kollision für 2400 msekunden aussetzen lassen

	boolean kollision=getXPos()+20 >=  derAndere.getXPos()
	&& getXPos()-20 <=  derAndere.getXPos() 
	&& getYPos()+20 >=  derAndere.getYPos() 
	&& getYPos()-20 <=  derAndere.getYPos();

	if(kollision)letzteKollision=t();
	return kollision;
	}
```

Die Zeitabfrage ist dazu da, dann unsere Spielfigur "fred" nicht 100 mal nacheinander getroffen wird, während der Gegner nur an ihm vorbei läuft. Er ist also für 3 sec unverwundbar, wenn es ein und derselbe Gegner ist. Das ganze ist aber noch nicht so optimal, denn ich habe 2 Möglichkeiten diesen gegner zu treffen. Die eine ist: meine spielfigur steht und der gegner braucht 3 sec um aus dem blickfeld von "fred" raus zu sein. wenn "fred" allerdings gleichzeitig rennt braucht er nur 1 sec um rauszusein... kann mir jemand ne elegantere Lösung vorschlagen? 

*EDIT* ist es vielleicht möglich vorher abzufragen, wie lange die letzte Kollision her ist? Also bevor die Methode aufgerufen wird? Das tut sie übrigens hier: 

```
if( elemente.get(k) instanceof Gegner )
		    {
      	    if(((Gegner)elemente.get(k)).istTot()== false)
		      ((Gegner)elemente.get(k)).autoMove(this);	
		    if(((Gegner)elemente.get(k)).kollidiertMitGegner(fred)) 
		      derZaehler.trifftGegner();
```

Gruß und Danke, Soleil


----------



## Soleil83 (17. Jan 2005)

keiner ne idee??????


----------



## EgonOlsen (17. Jan 2005)

Ich verstehe das Problem nicht so ganz. Wenn die Figur nach 1 Sek. aus dem Bildschirm raus ist, ist das doch sowieso egal, oder? Oder läuft sie dann am anderen Ende wieder rein?
Naja, wie auch immer. Wie wäre es, wenn du den zeitlichen Ansatz ganz fallen lässt und stattdessen bei einer Kollision prüfst, ob es im letzten Durchlauf auch eine gegeben hat und erst dann wieder eine neue zulässt (bzw. zurückmeldest), wenn dies nicht der Fall war? Damit wäre sichergestellt, dass es nicht zu unzähligen Kollisionen kommt, während die Sprites aneinander vorbeilaufen und du hast das Problem mit der evtl. nicht gewollten Verzögerung nicht. Oder du kannst das auch kombinieren...


----------



## amlug (18. Jan 2005)

ich würde einfach nur einmal Punkte abziehen (dann vielleicht so viel,wie bei 3 Sekunden), aber dann mit einem boolean
festlegen, dass der Spieler getroffen wurde, und erst wieder auf false setzten, wenn er an dem Gegner vorbei ist.

Amlug.


----------



## Soleil83 (18. Jan 2005)

hallo leute... also das problem hat sich inzwischen gelöst, deshalb lass ich die erläuterung mal weg, wie ich es meinte... 

aber dafür hab ich ne andere frage: wie kann man die figur für 2 sec "blinken" lassen? wonach muss ich suchen? gibts da was vorgefertigtes von java? blinken meine ich im sinne von "du wurdest getroffen, dir wird energie abgezogen aber du bist noch nich tot..." wie das eben manchmal bei jump & runs gemacht wird, wenn die spielfigur gegen was böses rennt. ich glaube bei mario brothers war das früher so (bin mir aber nich sicher).


----------



## Soleil83 (18. Jan 2005)

als beispiel: spooky's challenge: der blinkt auch so, wenn er gegen einen gegner rennt... http://www.chamedion.de/site/4,2,1,0.htm


----------



## Core (19. Jan 2005)

Vielleicht die Figur mit dem Hintergrund alle x Milisekunden überzeichnen und dann die Figur wieder auf den Bildschirm packen. Ich weiß nicht genau ob das umzusetzen ist denn ich habe mich noch nicht viel mit Grafik in Java beschäftigt.


----------



## Guest (20. Jan 2005)

ich leider auch nicht... den teil haben immer andere übernommen ;-) naja dann werd ich das wohl mal auch den anderen überlassen *g*


----------



## Dr. Morv (24. Feb 2005)

Programmiermäßig müsste es doch leicht umzusetzten sein:
Du hast zwei Variabeln, vielleicht noch ne boolean, die prüft, ob du überhaupt blinken sollst, zählst die eine hoch bis zu einem bestimmten Wert, dann erhöchst du die andere, und während die erste unter der Hälfte ihres Höchstwertes ist, wird die Figur nicht gezeichnet, sonst doch. Das ganze geht, bis die zweite Variable eine bestimmte Grenze erreicht hat.

Braucht man mich wirklich, damit ich einen Blinkalgorithmus erkläre?? :autsch:


----------



## Hansdampf (2. Mrz 2005)

```
if(t()%500<200)zeichneFigur();  //blinkt 2mal inner sek für 200 Millis
if(t()%333<100)zeichneFigur();  //blinkt 3mal inner sek für 100 Millis
```


----------

