# Jump'n'Run: Probleme mit Kollision



## Soleil83 (13. Dez 2004)

Hallo,
wir haben als Softwareprojekt ein Jump'n'Run Spiel entwickelt und es funktioniert bis jetzt auch schon alles recht gut. Es gibt nun ein Problem mit den Gegnern: Wenn die Spielfigur gegen so nen Gegner rennt, dann erkennt das Programm noch nicht, dass es nur einmal getroffen sein soll. So wird nämlich gleich die ganze Energie abgezogen, da die Kollision zu oft hintereinander durchgeführt wird. Wie kann ich der Spielfigur sagen, wenn du einmal gegen so einen Gegner rennst, dann wird dir auch erst mal nur 1mal Energie abgezogen?! Wäre cool, wenn Ihr mir einen Tipp geben könntet.
Liebe Grüße, Soleil


----------



## Reality (13. Dez 2004)

Mach´s doch so wie in anderen Andventures:
Der Spieler ist nach einer Kollision für eine Weile unverwundbar.

Liebe Grüße
Reality


----------



## Soleil83 (13. Dez 2004)

Okay... hast du vielleicht ein Beispiel, wie das geht? bin leider noch nich so der Profi


----------



## Illuvatar (13. Dez 2004)

Na speicher dir wann die letzte Kollision war und wenn die sagen wir <1500ms her ist, tut sich nix.


----------



## 0xdeadbeef (13. Dez 2004)

Wohl eher 200-300ms. 1500ms sind eine halbe Ewigkeit. Kommt natürlich auch auf's Spieltempo usw. an.

Andere Möglichkeit: bei Kollisionserkennung erneute Kollisionserkennung sperren, bis die Figur wieder frei ist (also N mal keine Kollision erkannt wurde).


----------



## foobar (14. Dez 2004)

> Mach´s doch so wie in anderen Andventures:
> Der Spieler ist nach einer Kollision für eine Weile unverwundbar.


Gute Idee 
Wird das in kommerziellen Spielen auch so gehandhabt?


----------



## Soleil83 (14. Dez 2004)

okay... rein theoretisch weiß ich ja wie ihr das meint. aber bräuchte irgendwie ein beispiel wo das so gemacht wurde.  wie sperrt mann denn eine kollision für 300 ms?


----------



## Beni (14. Dez 2004)

Du speicherst bei einer Kollision die Zeit, und machst dann eine nette if-Abfrage um die Kollisionserkennung.

Als Pseudocode sieht das so aus:

```
public class Kollision{
  private long time = 0;
  private long delta = 300;

  public boolean isKollision( Player player, Wall wall ){
    long current = System.currentTimeMillis();

    if( current > time + delta ){
      if( {... kollision ...} ){
         time = current;
         return true;
      }
    }
    return false;
  }
}
```


----------



## Hansdampf (14. Dez 2004)

```
long lastCollisiontime;
long t(){return Sytem.getCurrentTimeMillis();}

void checkCollision(){
if(t()-lastCollisionTime>300){
performCollision();
lastCollisionTime=t();
}
}
```
edit: oops, da war einer schneller


----------



## Soleil83 (14. Dez 2004)

so, vielen dank für den pseudo-code. hab mal versucht, dass auf unsere klassen anzuwenden aber bis jetzt ist es mir noch nicht gelungen. kann euch vielleicht noch ma meine kollisionsabfrage schicken

```
// Kollision wird aufgerufen und Energie abgezogen


if( elemente.get(k) instanceof Gegner )
{
   ((Gegner)elemente.get(k)).autoMove(this);
				
   if(((Gegner)elemente.get(k)).kollidiertMit(fred))					
   derZaehler.sammeltEnergie(-2);
}


//Kollisionsmethode an sich:
public boolean kollidiertMit(PositionierbaresElement derAndere)
{
   if(   (
	 this.getXPos()+28 >=  derAndere.getXPos() 
	&&
	this.getXPos()-28 <=  derAndere.getXPos() 
	) 
	&&
         (
         this.getYPos()+28 >=  derAndere.getYPos() 
	&&
	this.getYPos()-28 <=  derAndere.getYPos() 
         )		
	)
	return true;
	else
	return false;
	}
}
```

wenn ihr mir so vielleicht schnelle helfen könnt, als ich jetzt die fehler suche, wär das geil[/code]


----------



## Guest (14. Dez 2004)

```
if( elemente.get(k) instanceof Gegner )
{
   ((Gegner)elemente.get(k)).autoMove(this);
            
   if(((Gegner)elemente.get(k)).kollidiertMit(fred))               
   derZaehler.sammeltEnergie(-2);
}


private long lastCollisiontime;
private static long t(){return Sytem.getCurrentTimeMillis();}

public boolean kollidiertMit(PositionierbaresElement derAndere)
{
if(t()-lastCollisionTime<300)return false;

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

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

bis auf Tippfehler müsste es gehen


----------



## Hansdampf (14. Dez 2004)

habs nun mal umgestellt, das mit dem einloggen  :wink:


----------



## Reality (14. Dez 2004)

foobar hat gesagt.:
			
		

> Gute Idee
> Wird das in kommerziellen Spielen auch so gehandhabt?


Ja, du kennst es doch sicher, wenn eine Figur auf einen Gegner trifft und er anfängt so halbtransparent zu blinken. Während dieser Zeit ist er unverwundbar.

Liebe Grüße
Reality


----------



## Soleil83 (14. Dez 2004)

ihr seid die größten. es funktioniert. vielen vielen dank!!!!


----------

