SFML Sprite bis zu einer bestimmen Kachel gehen

Einstiegsfragen, Mathematik, Physik, künstliche Intelligenz, Engine Design
Antworten
repac3r
Beiträge: 2
Registriert: 25.01.2014, 17:11

SFML Sprite bis zu einer bestimmen Kachel gehen

Beitrag von repac3r »

Hallo,

derzeit programmiere ich ein kleines 2D-Spiel basierend auf Sfml.
Mein Problem ist jetzt, dass ich möchte, dass ein Sprite genau
zu einer Kachel hoch oder runter wandert. Eine Kachel bzw. Ebene ist
64 Pixel hoch. Mit meinem bisherigen Code läuft er zwar bis zur nächsten Kachel aber das viel
zu schnell. Hier mal mein Code:

Code: Alles auswählen

void player::setLayerDown(sf::Time elapsedTime)
{
	isLocking = true;
	if(getCurrentLayer() < 5)
	{
		float nextLayer	= mPlayer.getPosition().y + 64.f;

		while(mPlayer.getPosition().y < nextLayer)
		{
			//std::cout << "pos: " << mPlayer.getPosition().y + (PlayerSpeed * elapsedTime.asSeconds()) << std::endl;
			if(mPlayer.getPosition().y + (PlayerSpeed * elapsedTime.asSeconds()) > nextLayer)
					mPlayer.setPosition(20.f, nextLayer);
			else
				mPlayer.move(0.f, PlayerSpeed * elapsedTime.asSeconds());
		}
	}
	isLocking = false;
}
Wenn die aktuelle Spielposition + der Playerspeed größer als die Zielposition ist, wird er nicht mehr mit move darauf hin bewegt, sondern gleich per
setPosition hingesetzt, wenn das alles nicht der Fall ist, läuft er jeden Schleifendurchgang PlayerSpeed + Vergangene Zeit. Jedoch sieht es im Spiel
so aus als würde er immer sofort zu seiner Zielposition hingesetzt werden.
Liegt es vielleicht daran, dass die Schleife viel zu schnell ist und der Renderer von Sfml da nicht hinter her kommt ?
Niki
Establishment
Beiträge: 309
Registriert: 01.01.2013, 21:52

Re: SFML Sprite bis zu einer bestimmen Kachel gehen

Beitrag von Niki »

Vielleicht sollte ich nicht antworten, da ich von SFML absolut keine Planung habe. Also vergib mir bitte falls ich jetzt Unfug schreiben sollte :-)

In deiner while-Schleife sehe ich zwar wie du die Position deines Sprites veränderst, aber ich sehe nicht, dass diese Änderungen gezeichnet werden. Bei den SDKs wie ich sie kenne hat man pro Frame ein Update(), gefolgt von einem Render(). In Update() werden Objekte z.B. bewegt, und in Render() werden sie angezeigt. D.h., für jede einzelne Bewegung die man sehen möchte muss man zuerst die Objekte ein kleines bisschen bewegen, und die diese Bewegung dann per Render() anzeigen. Eine längere Bewegung, wie z.B. eine Kachel rauf/runter zu wandern, besteht daher aus vielen Update()- und Render()-Aufrufen, wobei jedes Update() das Sprite nur einen Bruchteil der Gesamtstrecke bewegt.
Deine setLayerDown-Methode scheint mir mit einer Update()-Methode vergleichbar zu sein. Allerdings berechnest du hier die gesamte Bewegung zur nächsten Kachel, und nicht nur einen Bruchteil der Bewegung. Wenn auch in SFML erst nach diesem "Update" gezeichnet wird, dann ist der Fall klar...: die Zwischenstufen werden nicht gezeichnet, da der Renderer nicht zum Zuge kommt.
repac3r
Beiträge: 2
Registriert: 25.01.2014, 17:11

Re: SFML Sprite bis zu einer bestimmen Kachel gehen

Beitrag von repac3r »

Danke.
Die Updatefunktion ist in der Klasse game, die LayerDown Funktion wird von der Updatefunktion augerufen, aber es wird ja erst dann
gezeichnet, wenn die Bedingung der Schleife nicht mehr zutrifft. Habe das jetzt gefixt, die Schleife raus gemacht und die Funktion ein
bisschen umgestellt.

Jetzt geht mein Spieler immer eine Kachel hoch oder runter, danke für deine Hilfe.
Niki
Establishment
Beiträge: 309
Registriert: 01.01.2013, 21:52

Re: SFML Sprite bis zu einer bestimmen Kachel gehen

Beitrag von Niki »

Gern geschehen! Bin froh, dass ich korrekt geraten habe :-)
Antworten