Flüssige Bewegungen -wie geht das?
Ich versuche seit einiger Zeit ein jump and run Spiel auf scratch zu programmieren aber meine Figur bewegt sich immer so ruckartig oder zu langsam!
4 Antworten
Vom Fragesteller als hilfreich ausgezeichnet
Du darfst keine 5er bewegungen machen, sondern immer nur 1er schritte, dann läuft es flüssiger.
Mit scratch programmieren isg aber generell nicht so gut.
Versuche die Figur langsam zu beschleunigen. Hier mal ein Beispiel im C++-Code mit SFML:
PS: Hab die Kommentare mal auf deutsch umgeschreiben :D
Achso: Natürlich musst du mit den Werten herumspielen und "a" und "v" sind 2-Dimensionale Vektoren
/*
W / Hoch (Pfeiltaste) - nach vorne
S / Runter (Pfeiltaste) - nach hinten
A / Links (Pfeiltaste) - nach links
D / Rechts (Pfeiltaste) - nach rechts
*/
const float accel = 0.03f;
// Um den Schwierigkeitsgrad zu erhöhen,
// kann der Spieler nur in eine Richtung fliegen; er kann also maximal
// nur eine Taste drücken.
// Tastenabfrage
if (sf::Keyboard::isKeyPressed(sf::Keyboard::A) ||
sf::Keyboard::isKeyPressed(sf::Keyboard::Left))
{
a.x = -accel;
// Raumschiff drehen
mSprite.setRotation(-180.f);
}
else if (sf::Keyboard::isKeyPressed(sf::Keyboard::D) ||
sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
{
a.x = accel;
// Raumschiff drehen
mSprite.setRotation(0.f);
}
else if (sf::Keyboard::isKeyPressed(sf::Keyboard::W) ||
sf::Keyboard::isKeyPressed(sf::Keyboard::Up))
{
a.y = -accel;
// Raumschiff drehen
mSprite.setRotation(-90.f);
}
else if (sf::Keyboard::isKeyPressed(sf::Keyboard::S) ||
sf::Keyboard::isKeyPressed(sf::Keyboard::Down))
{
a.y = accel;
// Raumschiff drehen
mSprite.setRotation(90.f);
}
else
{
// bis jetzt würde das Schiff einfach weiter gleiten, deshalb muss die Geschwindigkeit in jedem Frame reduziert werden.
float k = 0.97;
v.x *= k;
v.y *= k;
}
// Beschleunigung ist die Änderung der Geschwindigkeit
v.x = v.x + (a.x * dT.asSeconds());
v.y = v.y + (a.y * dT.asSeconds());
// Außerdem sollte man noch eine Maximalgeschwindigkeit festlegen,
// da die Geschwindigkeit sonst zu groß werden kann.
const float maxvel = 100;
if (v.x > maxvel)
{
v.x = maxvel;
}
if (v.x < -maxvel)
{
v.x = -maxvel;
}
// Sprite bewegen
mSprite.move(v.x, v.y);
dT.Zero;// Zeit zurücksetzten
a.x = 0; // Beschleunigung auf NULL setzen
a.y = 0; // Beschleunigung auf NULL setzen
Um so kleiner die Anzahl an Schritten die du machst um so flüssiger ist es.
Hat sich schon erledigt, war da nur noch ein Anfänger :)
Könnt ja mal mein neues Projekt anschauen: Timefrozer 2