Flüssige Bewegungen -wie geht das?

6 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.

Was hast Du gegen Scratch?

0

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.

 - (programmieren, Figur, Bewegung)

Was möchtest Du wissen?