# Java Game performance Probleme



## JavaGamer (27. Jun 2014)

Hallo,

ich arbeite momentan an einen kleinen Java 2D-Game, doch leider ist irgend etwas beim letzten Update schief gegangen und jetzt updatet das Game mit 4 FPS und 20 Ticks und ist extrem langsam. Zudem spawnt der Spieler im Block anstatt auf diesen.
In der vorherigen Version hat noch alles einwandfrei funktioniert.

Weiss vielleicht einer, was ich falsch mache???:L (ich selbst finde den Fehler nicht...  ).
Zudem verwende ich Eclipse Luna mit Java 8.

EDIT:
Bevor ich es vergesse, weiss jemand wie ich die Collision behebe, da wenn du schnell genug bist, kannst du durch Blöcke durch springen. Zudem wie kann ich verhindern, dass der Spieler während des Fallens springen kann?

Ich hoffe ihr könnt mir helfen! (Das Eclipse-Projekt befindet sich im Anhang samt Code und benötigter Bilder...)

JavaGamer


----------



## Androbin (28. Jun 2014)

JavaGamer hat gesagt.:
			
		

> Bevor ich es vergesse, weiss jemand wie ich die Collision behebe, da wenn du schnell genug bist, kannst du durch Blöcke durch springen.


Ganz einfach, schreib deinen Code so um, dass deine Methode "move", etc. dich um nur einen Pixel bewegt und mach dir ne for-Schleife, die in etwa so aussieht:

```
int speedX = this.speedX;
if ( speedX > 0 ) {
	for ( int x = 0; x < speedX; x++ ) {
		move( Richtung.Rechts );
	}
} else {
	for ( int x = 0; x < -speedX; x++ ) {
		move( Richtung.Links);
	}
}
```



			
				JavaGamer hat gesagt.:
			
		

> Zudem wie kann ich verhindern, dass der Spieler während des Fallens springen kann?


Mit Hilfe eines boolean's "canJump" kannst du speichern, ob der Spieler den Boden bereits wieder berührt hat, nachdem die Variable beim Springen auf "false" gesetzt wurde.

PS. Seltsam, genau die gleichen Probleme hatte ich auch erst vor Kurzem ...


----------



## JavaGamer (28. Jun 2014)

Androbin hat gesagt.:


> Ganz einfach, schreib deinen Code so um, dass deine Methode "move", etc. dich um nur einen Pixel bewegt und mach dir ne for-Schleife, die in etwa so aussieht:
> 
> ```
> int speedX = this.speedX;
> ...



Problem wäre nur dass ich gar keine move-Methode besitze, sondern einfach nur die Position des Spielers um 5 erhöhe wenn dieser Button gedrückt wurde (also über KeyEvent). Und wohin mit der for-Schleife?
Und was ist dann mit der Kamera, man sieht ja auch, nachdem der Spieler plaziert wurde, wie der Screen angezeigt wird und dann erst die Position der Kamera geändert wird, was eigentlich so schnell geht, dass dies nicht sichtbar ist...


----------



## Androbin (29. Jun 2014)

JavaGamer hat gesagt.:


> Problem wäre nur dass ich gar keine move-Methode besitze, sondern einfach nur die Position des Spielers um 5 erhöhe wenn dieser Button gedrückt wurde (also über KeyEvent). Und wohin mit der for-Schleife?


Soll das etwa heißen, du hast überhaupt keine Kollisions-Abfragen?


JavaGamer hat gesagt.:


> Und was ist dann mit der Kamera, man sieht ja auch, nachdem der Spieler plaziert wurde, wie der Screen angezeigt wird und dann erst die Position der Kamera geändert wird, was eigentlich so schnell geht, dass dies nicht sichtbar ist...


Könntest du das bitte nochmal etwas verständlicher erklären?


----------



## JavaGamer (29. Jun 2014)

Androbin hat gesagt.:


> Soll das etwa heißen, du hast überhaupt keine Kollisions-Abfragen?
> 
> Könntest du das bitte nochmal etwas verständlicher erklären?



Eigentlich habe ich wohl eine Kollisions-Abfrage:

```
private void Collision(LinkedList<GameObject> object)
	{
		for(int i = 0; i < this.handler.object.size(); i++)
		{
			GameObject tempObject = this.handler.object.get(i);
			
			if(tempObject.getId() == ObjectId.Block)
			{
				// Top
				if(getBoundsTop().intersects(tempObject.getBounds()))
				{
					this.y = tempObject.getY() + 32;
					this.velY = 0;
				}
				
				// Buttom
				if(getBounds().intersects(tempObject.getBounds()))
				{
					this.y = tempObject.getY() - this.height;
					this.velY = 0;
					this.falling = false;
					this.jumping = false;
				}
				else
				{
					this.falling = true;
				}
				
				// Right
				if(getBoundsRight().intersects(tempObject.getBounds()))
				{
					this.x = tempObject.getX() - this.width;
				}
				
				// Left
				if(getBoundsLeft().intersects(tempObject.getBounds()))
				{
					this.x = tempObject.getX() + 35;
				}
			}
			else if(tempObject.getId() == ObjectId.Restart)
			{
				Player.setStatus(false);
				this.handler.swichtLevel();
			}
		}
	}
```

Diese wird in der Tick-Methode des Spielers aufgerufen.

Das mit der Kamera ist, dass wenn du das Spiel startest wird die Kamera-Position erst auf 0 gesetzt und dann wird ja das Level geladen und alles andere und dann wird die Kamera an die Position des Spielers gesetzt. Nur eigentlich geht dies so schnell, dass dies nicht zu sehen ist für den Spieler, aber aus irgendeinem Grund momentan schon.
Zudem kann sich der Spieler auch nicht bewegen, da der KeyListener keinen Spieler findet, obwohl dieser vorhanden ist, da dieser ja deutlich sichtbar zu sehen ist....


----------



## JavaGamer (30. Jun 2014)

Wirklich keiner der mir weiterhelfen kann, warum alles so langsam ist? (am Thread liegt es definitiv nicht, da dieser funktioniert einwandfrei, auch von der Geschwindigkeit her, nur sobald der Rest vom Code geladen wird, also alles in der init(), render() und tick() Methode/n wird der Thread extrem langsam...

EDIT: Anscheinend stimmt in irgendeiner Klasse etwas mit der tick()-Methode nicht oder diese bremst alles extrem aus, da ohne diese funktioniert alles einwandfrei, bis auf dass der Spieler immer noch nicht gefunden wird...


----------



## Ruzmanz (30. Jun 2014)

Deine Game-Loop sieht sehr seltsam aus. Du solltest dir nochmal ein Tutorial anschauen. Liegt höchstwahrscheinlich an deiner inneren while-Schleife, dessen Sinn ich nicht ganz verstanden habe. (Evtl. kann man die einfach entfernen und alles läuft ...)


```
[COLOR="Red"]while(delta >= 1)[/COLOR]
```


----------



## JavaGamer (30. Jun 2014)

Ruzmanz hat gesagt.:


> Deine Game-Loop sieht sehr seltsam aus. Du solltest dir nochmal ein Tutorial anschauen. Liegt höchstwahrscheinlich an deiner inneren while-Schleife, dessen Sinn ich nicht ganz verstanden habe. (Evtl. kann man die einfach entfernen und alles läuft ...)
> 
> 
> ```
> ...



Also den Fehler habe ich jetzt gefunden. :idea: (Habe anscheinend im Kollisionscheck die Zeile 

```
getBounds().intersects(tempObject.getBounds())
```
 vergessen.)

Also ohne diese while-Schleife geht gar nichts... (keine Grafik etc.) Also die muss da sein.
(Verwende die while-Schleife seit dem ich angefangen habe 2D-Spiele zu programmieren vor 2 Jahren, aber aus irgendeinem Grund bin ich nie mit einem Game fertig geworden... ka warum, aber egal. Kannst ja mal bei TheChernoProject oder RealTutsGML vorbei schauen, die können dir diese bestimmt erklären.)

@Androbin Also das mit deinem for-Loop habe ich in anderer Form ungesetzt... (sobald die Taste gedrückt wird wirst du immer um x-px nach vorne geschoben oder zurück mit einer Laufanimation und sobald du die Taste loslässt stoppt dies halt.
Aber deine canJump funktioniert noch nicht so ganz, wie ich es will:

Dies steht in der Tick-Methode drin.

```
if(!this.canJump)
		{
			this.velY += this.gravity;
			
			if(this.velY > this.MAX_SPEED)
				this.velY = this.MAX_SPEED;
		}
		
		Collision(object);
```

Und hier der Code in der Collision-Methode, der das canJump ändern soll....

```
if(tempObject.getId() == ObjectId.Block)
			{
				// Buttom --> Kollisionsabfrage wenn die Person auf einen Block steht.... I think... because of ... look a few lines down :D
				if(getBounds().intersects(tempObject.getBounds()))
				{
					this.y = tempObject.getY() - this.height;
					this.velY = 0;
					this.canJump = true;
				}	
				else if(!(getBounds().intersects(tempObject.getBounds()))) // aus irgendeinem Grund ignoriert der das obere.... und nimmt nur dies...
				{
					this.canJump = false; // da nur diese Methode aufgerufen wird und das andere nicht, kann man nicht springen :(
				}
			}
```

Hier die Zeile aus dem KeyInput:

```
if(key == KeyEvent.VK_W && tempObject.canJump())
				{
					tempObject.setJump(false);
					tempObject.setVelY(-10);
				}
```

Weisst du oder irgendjemand anderes was daran falsch ist und wie ich dies beheben kann?

Zudem kann der Spieler immer noch durch Wände springen oder in diesen verschwinden...

Und danke für die bisherige Hilfe! :toll:


----------

