Frage von Lennartosaurus1, 74

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!

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von Pizzablister123, 46

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.

Kommentar von J0T4T4 ,

Was hast Du gegen Scratch?

Kommentar von Pizzablister123 ,

Danke für den Stern:)

Antwort
von ByteJunkey, 26

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

Antwort
von jolo0815, 3

Um so kleiner die Anzahl an Schritten die du machst um so flüssiger ist es.

Antwort
von Lennartosaurus1,

Hat sich schon erledigt, war da nur noch ein Anfänger :)

Könnt ja mal mein neues Projekt anschauen: Timefrozer 2

Keine passende Antwort gefunden?

Fragen Sie die Community