A * zu Move

NudelMaus

Grünschnabel
Halli Hallo,

Ich habe es jetzt so umgesetzt und Hurra der Player bewegt sich, yeahh :)

Aber jetzt kommen zwei neue Probleme :(

Das erste ist das der player nun in endlosschleife den Pfad geht, und nicht am Ziel stoppt.
Und das zweite ist, da ich jetzt die koordinaten im Initialisierungsteil berechne, kann ich sie nicht mehr ändern, mein ziel war es ja per mausklick das ziel zu bestimmen, und nicht zu Anfang :(

Und wenn ich jetzt versuche die Koodinaten erst nach mausklick zu berechnen, stürz natürlich das Programm ab, da ja coordinaten_index in setPosition auf einen leeren Index greift ..

Kann man die zwei Probleme irgentwie noch lösen.

Trotz all dem vielen vielen dank ich bin mega Happy das der player sich endlich schrittweise Bewegt :)
 

Technipion

Erfahrenes Mitglied
Ich habe es jetzt so umgesetzt und Hurra der Player bewegt sich, yeahh :)
Sehr schön!

Kann man die zwei Probleme irgentwie noch lösen.
Ja das geht. Allerdings bewegst du dich jetzt immer mehr in Richtung Pfadanimationen, und das ist ein komplexes Thema für sich. Leider habe ich gerade viel zu tun, und deshalb keine Zeit das jetzt ausführlich zu erklären. Ich habe deshalb hier ein Beispiel aufgesetzt, das hoffentlich alles veranschaulicht:
C++:
#include <SFML/Graphics.hpp>   // for sf::*
#include <vector>              // for std::vector

// EXAMPLE from https://www.sfml-dev.org/documentation/2.5.1/
// modified to needs


int main()
{
    sf::RenderWindow window(sf::VideoMode(800, 600), "SFML window");

    sf::Texture texture;
    // source: https://upload.wikimedia.org/wikipedia/commons/d/df/Sprite01.gif
    if (!texture.loadFromFile("Sprite01.gif"))
        return EXIT_FAILURE;

    sf::Sprite sprite(texture);
    sprite.setOrigin(50, 50);

    sf::Font font;
    // source: https://www.fontspace.com/freesans-font-f13276
    if (!font.loadFromFile("FreeSans-LrmZ.ttf"))
        return EXIT_FAILURE;

    sf::Text text("Klick mich", font, 50);
    text.setOrigin(100, 35);
    text.setPosition(400, 300);

    std::vector<std::pair<float, float> > path;
    float path_time = 0.0f;
    bool following_path = false;

    std::vector<sf::CircleShape> path_points;
    for (const auto &p : path) {
        sf::CircleShape circle(4.0f);
        circle.setFillColor(sf::Color::Green);
        circle.setPosition(p.first, p.second);

        path_points.push_back(circle);
    }

    sf::Clock clock;

    while (window.isOpen())
    {
        sf::Time elapsed = clock.restart();

        sf::Event event;
        while (window.pollEvent(event))
        {
            switch (event.type)
            {
                case sf::Event::Closed:
                    window.close();
                    break;

                case sf::Event::MouseButtonPressed:
                    switch (event.key.code)
                    {
                        case sf::Mouse::Button::Left:
                        {
                            float x = sf::Mouse::getPosition(window).x;
                            float y = sf::Mouse::getPosition(window).y;

                            path.push_back(std::make_pair(x, y));

                            sf::CircleShape circle(4.0f);
                            circle.setFillColor(sf::Color::Green);
                            circle.setPosition(x, y);

                            path_points.push_back(circle);

                            following_path = true;
                            path_time = 0.0f;
                            break;
                        }
                        default:
                            break;
                    }
                case sf::Event::KeyPressed:
                    if (event.key.code == sf::Keyboard::Space) {
                        path.clear();
                        path_points.clear();

                        following_path = false;
                        path_time = 0.0f;
                    }
                    break;
            }
        }

        // rotate text:
        text.rotate(180.0f * elapsed.asSeconds()); // 180° per second

        // follow path:
        if (following_path == true) {
            path_time += 0.5f * elapsed.asSeconds(); // slow down to 50%

            if (path_time > path.size()) {
                path_time = 0.0f;
                following_path = false;
            }

            size_t path_from = (size_t)path_time % path.size();
            size_t path_to = (path_from + 1) % path.size();
            float interpol = path_time - (float)path_from;

            float x = ((1.0f - interpol) * path[path_from].first +
                       interpol          * path[path_to].first);

            float y = ((1.0f - interpol) * path[path_from].second +
                       interpol          * path[path_to].second);

            sprite.setPosition(x, y);
        }

        window.clear();
        window.draw(sprite);
        window.draw(text);

        for (const auto &c : path_points) {
            window.draw(c);
        }

        window.display();
    }
    return EXIT_SUCCESS;
}

So, deine Aufgabe ist jetzt:
  • Führe den Code mal aus und teste, dass alles funktioniert
  • Lies den Code mehrmals durch und versuche ihn nachzuvollziehen
  • Falls etwas unklar ist versuch ruhig Google zu bemühen, das müssen Programmierer drauf haben
  • Für alles was nicht rein technisch ist (also Verständnisfragen, Vorschläge, oder andere Überlegungen) kannst du gerne wieder hier im Forum nachfragen
Wenn du das getan hast können wir an den Feinschliff gehen :)

Gruß Technipion
 

Neue Beiträge