C++ Sprites graduell auf Zielposition bewegen.

Bronislaw

Cadet 2nd Year
Registriert
Juli 2014
Beiträge
28
Hallo Leute,
es geht darum erstellte Sprites per Mausklick auf eine Zielposition zu bewegen (Klick 1 auf Sprite zwecks Selektion, Klick 2 Zielkoordinaten für dieses Sprite usw.), sodass man die Bewegung auch beobachten kann, also ohne "Teleportation" wie das bei folgendem Code leider der Fall ist:
Wenn ich recht verstehe, braucht man eine Zeitmessung, Richtung, Geschwindigkeit, 2. Positionsvektor etc., aber hab keine Ahnung wie man das richtig umsetzt. Schon mal vielen Dank für jede Antwort im Voraus!



Code:
#include <SFML/Graphics.hpp>
#include <iostream>
#include <vector>

int main()
{
    sf::RenderWindow mMainWindow(sf::VideoMode(600,600), "Map", sf::Style::Close);
    mMainWindow.setFramerateLimit(60);
    mMainWindow.setKeyRepeatEnabled(false);
    sf::Image image;
    image.create(50, 50, sf::Color::Red);
    sf::Texture texture;
    texture.loadFromImage(image);
    std::vector<sf::Sprite> EnemyVector;
    sf::Sprite* focus = nullptr;

    while (mMainWindow.isOpen())
    {
        sf::Event event;

        bool creating = false;
        bool leftclicked = false;
	bool rightclicked = false;

        sf::Vector2i mousePos;

        while (mMainWindow.pollEvent(event))
        {
            switch (event.type)
            {
            case sf::Event::Closed:
                mMainWindow.close();
                break;
            case sf::Event::KeyPressed:
                creating = (event.key.code == sf::Keyboard::A);
                break;
            case sf::Event::MouseButtonPressed:
                if (event.mouseButton.button == sf::Mouse::Left)
		{
                     leftclicked = true;
		     mousePos = sf::Vector2i(event.mouseButton.x, event.mouseButton.y);
		     break;
		}
		if (event.mouseButton.button == sf::Mouse::Right)
		{
                     rightclicked = true;
		     mousePos = sf::Vector2i(event.mouseButton.x, event.mouseButton.y);
		     break;
		}
            }
        }
        if (creating)
        {
            sf::Sprite sprite;
            mousePos = (mousePos == sf::Vector2i(0, 0) ? sf::Mouse::getPosition(mMainWindow) : mousePos);
            sprite.setTexture(texture);
            sprite.setColor(sf::Color::Red);
            sprite.setOrigin(static_cast<float>(sprite.getTextureRect().width) / 2, static_cast<float>(sprite.getTextureRect().height) / 2);
            sprite.setPosition(static_cast<float>(mousePos.x), static_cast<float>(mousePos.y));
	    focus=nullptr;
            EnemyVector.push_back(sprite);
        }
        if (leftclicked)
        {
	    for (auto& enemy = EnemyVector.rbegin(); enemy != EnemyVector.rend(); ++enemy)
	       {
		    if (enemy->getGlobalBounds().contains(static_cast<float>(mousePos.x), static_cast<float>(mousePos.y)))
		    {
		        focus = &(*enemy);
			break;
                    }
		    else
			if(focus!=nullptr)
			{
			    focus->move((sf::Mouse::getPosition(mMainWindow).x - focus->getPosition().x),(sf::Mouse::getPosition(mMainWindow).y - focus->getPosition().y)) ;
			    focus = nullptr;
			    break;
			}
		    }
        }
	if(rightclicked)
	{
	    focus = nullptr;
	}
        mMainWindow.clear();
        for (auto& enemy = EnemyVector.rbegin(); enemy != EnemyVector.rend(); ++enemy)
        {
            mMainWindow.draw(*enemy);
        }
        mMainWindow.display();
    }
    return 0;
}
 
Zuletzt bearbeitet:
Ohne jetzt deinen Code zu lesen, da deine Formatierung hier leider für'n Eimer ist:

1. Position des Sprites hast du -> (x, y)
2. Zielposition des Sprites hast du -> (x', y')
3. Du kannst die Länge berechnen -> Lx = x' - x, Ly = y' - y
4. Du kannst eine beliebige Zeit festlegen die das Sprite brauchen soll -> XperUnit = T / Lx, YperUnit =T / Ly
5. Jeden Frame (x, y) += (XperUnit * FrameTime, YperUnit * FrameTime) bis du an der Zielposition bist. FrameTime ist dann die Zeit die jeder Frame benötigt, bei 60 FPS z.B. 16,66 ms(1 / 60). Ohne Vsync oder bei anderer fester FPS Zahl musst du selbst die Framezeit ermitteln.
 
5. Jeden Frame (x, y) += (XperUnit * FrameTime, YperUnit * FrameTime) bis du an der Zielposition bist. FrameTime ist dann die Zeit die jeder Frame benötigt, bei 60 FPS z.B. 16,66 ms(1 / 60). Ohne Vsync oder bei anderer fester FPS Zahl musst du selbst die Framezeit ermitteln.

Ich wäre etwas vorsichtig Bewegungen über die Frame-Time zu definieren, weil einem die so definierte variable Schrittweite sehr schnell um die Ohren fliegt.
 
Zuletzt bearbeitet:
Ja, da war ich mir jetzt auf den zweiten Blick auch nicht mehr ganz so sicher. Geht nur darum, dass man das Delta noch mit einbezieht, damit es eine FPS unabhängige Bewegung ist. Je weniger FPS, desto größer muss der "Sprung" pro Frame sein und je mehr, desto weniger. Ansonsten ist man bei hohen FPS vor der gewünschten Zeit fertig und bei wenigen dauert es länger.
Ist auch schon eine Weile her, dass ich da etwas gemacht habe :D

Dein Einwurf ist aber auf jeden Fall gerechtfertigt.
 
Und unbedingt zuerst mal refactorn (Methoden extrahieren)! Du kannst doch nicht die ganze Spiellogik im game loop hinhacken. Da bluten mir ja die Augen. :freak:

Zu frame-independent game loops findet man übrigens ausführliche Erklärungen und Diskussionen im Netz.
 
Ich meinte das eher so: Wenn du die Schrittweite der Spiellogik von der Framerate abhängig machst, so ist die Schrittweite wiederum vor allem von der Szenenkomplexität und von der Geschwindigkeit deines Rechners abhängig. Bei schnellen Rechnern und wenigen Objekten ist sie gering; bei langsamen Rechnern und vielen Objekten ist sie groß. Die Schrittweite beinflusst jedoch die numerische Genauigkeit (zum Beispiel wie bewegt sich ein beschleunigtes Objekt?) und damit auch die funktionale Korrektheit (kollidieren zwei Objekte miteinander?). Beides kann dazu führen, dass auf einem langsamen System oder bei zu vielen Objekten "kuriose" Fehler entstehen (zum Beispiel: Große Explosion verursacht massiven framerate drop, wodurch Spieler durch Boden fällt). Aus diesem Grund ist es nicht zu letzt auch ein "Paradigma der Informatik", dass die funktionale Korrektheit eines Programmes unabhängig von der Rechnergeschwindigkeit sein sollte.
 
Ich komme irgendwie nicht weiter, vorallem bei der Bewegung. Entweder die Teile teleportieren sich oder folgen sofort der Maus.
Aber wie soll man das machen, dass man erst ein Ziel anklickt und das fokussierte Sprite erst dann diesem Ziel folgt.

Code:
#include <SFML/Graphics.hpp>
#include <iostream>
#include <vector>

int main()
{
    sf::RenderWindow mMainWindow(sf::VideoMode(600,600), "Map", sf::Style::Close);
    mMainWindow.setFramerateLimit(60);
    mMainWindow.setKeyRepeatEnabled(false);
    sf::Image image;
    image.create(50, 50, sf::Color::Red);
    sf::Texture texture;
    texture.loadFromImage(image);
    std::vector<sf::Sprite> EnemyVector;
    sf::Sprite* focus = nullptr;

    bool move = false;
	
    float lengthx = 0;
    float lengthy = 0;

    float xperunit = 0;
    float yperunit = 0;

    while (mMainWindow.isOpen())
    {
        sf::Event event;
        bool creating = false;
        bool leftclicked = false;

        sf::Vector2i mousePos;

        while (mMainWindow.pollEvent(event))
        {
            switch (event.type)
            {
            case sf::Event::Closed:
                mMainWindow.close();
                break;
            case sf::Event::KeyPressed:
                creating = (event.key.code == sf::Keyboard::A);
                break;
            case sf::Event::MouseButtonPressed:
                if (event.mouseButton.button == sf::Mouse::Left)
		{
                    leftclicked = true;
		    mousePos = sf::Vector2i(event.mouseButton.x, event.mouseButton.y);
	            break;
		}
            }
        }
        if (creating)
        {
            sf::Sprite sprite;
            mousePos = (mousePos == sf::Vector2i(0, 0) ? sf::Mouse::getPosition(mMainWindow) : mousePos);
            sprite.setTexture(texture);
            sprite.setColor(sf::Color::Red);
            sprite.setOrigin(static_cast<float>(sprite.getTextureRect().width) / 2, static_cast<float>(sprite.getTextureRect().height) / 2);
            sprite.setPosition(static_cast<float>(mousePos.x), static_cast<float>(mousePos.y));
	    focus=nullptr;
            EnemyVector.push_back(sprite);
        }
        if (leftclicked)
	{
	    for (auto& enemy = EnemyVector.rbegin(); enemy != EnemyVector.rend(); ++enemy)
	    {
	        if (enemy->getGlobalBounds().contains(static_cast<float>(mousePos.x), static_cast<float>(mousePos.y)))
		{
		    focus = &(*enemy);
		    move = !move;

		    lengthx = sf::Mouse::getPosition(mMainWindow).x - focus->getPosition().x;
		    lengthy = sf::Mouse::getPosition(mMainWindow).y - focus->getPosition().y;

		    xperunit = 10 / lengthx;
		    yperunit = 10 / lengthy;

		    break;
		}
	    }
	}
	if(move)
	{
	    if(focus!=nullptr)
	    {
	        focus->move((sf::Mouse::getPosition(mMainWindow).x - focus->getPosition().x),(sf::Mouse::getPosition(mMainWindow).y - focus->getPosition().y)) ;
	    }
	}
        mMainWindow.clear();
        for (auto& enemy = EnemyVector.rbegin(); enemy != EnemyVector.rend(); ++enemy)
        {
            mMainWindow.draw(*enemy);
        }
        mMainWindow.display();
    }
    return 0;
}
 
Etwas im Pseudocode:
Code:
std::vector<float2> EnemyPositions;
std::vector<float2> EnemyVelocities; //Durch Mausklick bestimmen!

for (int i=0; i< EnemyPositions.size(); i++)
{
EnemyPositions[i] = EnemyPositions[i] + DT * EnemyVelocities[i];
mMainWindow.draw(Enemies[i], EnemyPositions[i]);
}

Konvertieren darfst du das selbst noch :)
 
Eine Frage zu den float2 Vektoren. (weil es nicht erkannt wird)

Ist damit das gemeint?:
Code:
std::vector<std::vector<float>>
 
Ich gehe mal davon aus, Nai hatte einen kleinen Gehirnfurz und meinte eigentlich

Code:
std::vector< sf::Vector2f > EnemyPositions;
std::vector< sf::Vector2f > EnemyVelocities;
 
Hab den Code wieder etwas umgeschrieben, aber es gibt jetzt merkwürdige Effekte, die sich nicht erklären lassen. Beim Linksclick bewegt sich das entsprechende Sprite einfach irgendwohin. Was ist hier falsch?
Hab schon alles mögliche durchprobiert und das Problem lässt sich nicht lösen.








Code:
#include <SFML/Graphics.hpp>
#include <iostream>
#include <vector>

int main()
{
    sf::RenderWindow mMainWindow(sf::VideoMode(600,600), "Map", sf::Style::Close);
    mMainWindow.setFramerateLimit(60);
    mMainWindow.setKeyRepeatEnabled(false);
    sf::Image image;
    image.create(50, 50, sf::Color::Red);
    sf::Texture texture;
    texture.loadFromImage(image);

    std::vector<sf::Sprite> EnemyVector;
    std::vector<sf::Vector2f> EnemyPositions;
    std::vector<sf::Vector2f> EnemyDestinations;

    sf::Sprite* focus = nullptr;
    bool move = false;
	
    while (mMainWindow.isOpen())
    {
        sf::Event event;
        bool creating = false;
        bool leftclicked = false;
	bool rightclicked = false;
        sf::Vector2i mousePos;

        while (mMainWindow.pollEvent(event))
        {
            switch (event.type)
            {
            case sf::Event::Closed:
                mMainWindow.close();
                break;
            case sf::Event::KeyPressed:
                creating = (event.key.code == sf::Keyboard::A);
                break;
            case sf::Event::MouseButtonPressed:
                if (event.mouseButton.button == sf::Mouse::Left)
		{
                    leftclicked = true;
		    mousePos = sf::Vector2i(event.mouseButton.x, event.mouseButton.y);
		    break;
		}
		if (event.mouseButton.button == sf::Mouse::Right)
		{
                    rightclicked = true;
		    mousePos = sf::Vector2i(event.mouseButton.x, event.mouseButton.y);
		    break;
		}
            }
        }
        if (creating)
        {
            sf::Sprite sprite;
            mousePos = (mousePos == sf::Vector2i(0, 0) ? sf::Mouse::getPosition(mMainWindow) : mousePos);
            sprite.setTexture(texture);
            sprite.setColor(sf::Color::Red);
            sprite.setOrigin(static_cast<float>(sprite.getTextureRect().width) / 2, static_cast<float>(sprite.getTextureRect().height) / 2);
            sprite.setPosition(static_cast<float>(mousePos.x), static_cast<float>(mousePos.y));
	    focus=nullptr;
            EnemyVector.push_back(sprite);
	    EnemyPositions.push_back(sf::Vector2f(static_cast<float>(mousePos.x), static_cast<float>(mousePos.y)));
	    EnemyDestinations.push_back(sf::Vector2f(static_cast<float>(mousePos.x), static_cast<float>(mousePos.y)));
        }
	if (leftclicked)
	{
	    for (auto& enemy = EnemyVector.rbegin(); enemy != EnemyVector.rend(); ++enemy)
	    {
	        if (enemy->getGlobalBounds().contains(static_cast<float>(mousePos.x), static_cast<float>(mousePos.y)))
		{
		    focus = &(*enemy);
		    break;
		}
	    }
	}
	if(rightclicked)
	{
	    if(focus!=nullptr)
	    {
	        for (auto& enemy = EnemyVector.rbegin(); enemy != EnemyVector.rend(); ++enemy)
		{
		    move=true;
		    EnemyDestinations[std::distance(EnemyVector.rbegin(),enemy)].x = static_cast<float>(mousePos.x);
		    EnemyDestinations[std::distance(EnemyVector.rbegin(),enemy)].y = static_cast<float>(mousePos.y);
		}
	    }
	}
	if(move)
	{
	    for (auto& enemy = EnemyVector.rbegin(); enemy != EnemyVector.rend(); ++enemy)
	    {
	        if(focus!=nullptr)
		{
		    focus->move((EnemyDestinations[std::distance(EnemyVector.rbegin(),enemy)].x*0.1 - focus->getPosition().x*0.1),
                    EnemyDestinations[std::distance(EnemyVector.rbegin(),enemy)].y*0.1 - focus->getPosition().y*0.1);
		}
	    }
	}
        mMainWindow.clear();
        for (auto& enemy = EnemyVector.rbegin(); enemy != EnemyVector.rend(); ++enemy)
        {
            mMainWindow.draw(*enemy);
        }
        mMainWindow.display();
    }
    return 0;
}
 
Zuletzt bearbeitet:
Schau dir mal den gesamten Codeblock an. Sieht das aus als würde man es gerne lesen, so wie es hier dargestellt wird? Einfach Copy&Paste geht hier halt nicht, die Formatierung geht dabei futsch, vor allem wegen zu langen Zeilen etc.
Hin und wieder eine Leerzeile um etwas zu trennen ist auch nicht verkehrt.

Was ich dir empfehlen würde: Nutze eine Klasse oder zumindest ein struct um Sprite, Position, Zielposition und Geschwindigkeit zusammenzufassen.
Falls du dich damit nicht auskennst, lies dich ein.
Mit einem struct wäre es jedenfalls erst einmal simpler:
PHP:
typedef struct
{
    sf::Sprite* sprite;
    sf::Vector2f position;
    sf::Vector2f target;
    sf::Vector2f velocity;
} Moveable;

Jetzt kannst du Sprites und deren zugehörigen Positionen zusammen in einen vector packen. Ich nehme mal an, dass deine Indices durcheinander geraten und du die Positionen des falschen Sprites abfragst. Ich habe mir deinen Code aber nicht mehr näher angeschaut.

Statt jetzt jedenfalls viele verschiedene std::vector für Sprites, Positionen etc. zu haben, hast du jetzt nur noch einen:

PHP:
std::vector< Moveable > myMoveables;

So kannst du schonmal keine Indices mehr durcheinander bringen.
Solltest du dich doch schon mit Klassen auskennen kannst du es auch als Klasse umsetzen, ich gehe aber in deinem Fall nicht davon aus.

Ansonsten wären wie schon von anderen angesprochen Funktionen nicht verkehrt, das entwirrt das Ganze ein wenig.

Im Nachhinein denke ich, dass aber wahrscheinlich Zeile 97 fehlerhaft sein wird. Sprite.move soll mit einem Offset aufgerufen werden, also quasi dem Betrag der bewegt werden soll. Das entspräche der berechneten Geschwindigkeit. Irgendein x * 0.1 scheint da etwas seltsam.
 
Zuletzt bearbeitet:
Also bei der Fromatierung hab ich mir extra Mühe gegeben. Vielleicht liegt es an der Seitenbreite. Wenn ich alles auf breit stelle, ist es perfekt.
Zu Zeile 97. Ich hab einfach mal versuchsweise ne float Variable erstellt und sie statt der 0.1 eingefügt, aber das hat keine Auswirkung.
Zu den Funktionen: Soll die Funktion in den move-fall?
Was ich überhaupt nicht verstehe, ist, warum es beim Linksklick auf eine Sprite überhaupt zu diesen seltsamen Bewegungen kommt.
 
Gibt es eigentlich einen Grund, warum du immer mit reverse iteratoren arbeitest? Ich vermute mal recht stark, dass dir
Code:
EnemyDestinations[std::distance(EnemyVector.rbegin(),enemy)]
nicht die EnemyDestination ausspuckt, die du haben willst.
 
hier stand Blödsinn
 
Zuletzt bearbeitet:
So, habe das hingekriegt, allerdings besteht jetzt das Problem, dass nicht mehrere Einheiten gleichzeitig bewegt werden können. Könnten mehrere Einheiten auf einmal moven und nicht nur die jeweils fokussierte, könnte ich den Code dahingehend ändern, dass nach Festlegung der Zielposition sofort eine Deselektierung erfolgen könnte ohne Abbruch der Bewegung. Also es geht darum z.B. Sprite A anzuklicken und auf eine Zielposition zu bewegen und noch während der Bewegung von Sprite A schon das nächste Sprite anzuklicken und wiederum eine andere Zielposition festzulegen (ein warmer Wechsel sozusagen) usw.. Jedes Sprite hat jeweils immer nur eine Bewegung frei, bevor es erneut angeklickt werden muss. Jetzt hab ich gehört, dass man dafür einen 2. Vektor oder so braucht, aber was soll dieser Vektor speichern? (Koordinaten?) Kann mir schwer vorstellen, was man jetzt ändern müsste, damit es wie gewünscht funktioniert.
Zur Frage wegen der Reverse Iteratoren: Die sind dafür da, um jeweils das oberste Sprite anklicken zu können.

Code:
#include <SFML/Graphics.hpp>
#include <iostream>
#include <vector>

int main()
{
    sf::RenderWindow mMainWindow(sf::VideoMode(600,600), "Map", sf::Style::Close);
    mMainWindow.setFramerateLimit(60);
    mMainWindow.setKeyRepeatEnabled(false);
    sf::Image image;
    image.create(50, 50, sf::Color::Red);
    sf::Texture texture;
    texture.loadFromImage(image);

    std::vector<sf::Sprite> EnemyVector;
    std::vector<sf::Vector2f> EnemyDestinations;
    sf::Sprite* focus = nullptr;
    bool move = false;

    int focusxvar = 0;
    int focusyvar = 0;

    sf::Clock clock;
    sf::Time time;

    while (mMainWindow.isOpen())
    {
        sf::Event event;
        bool creating = false;
        bool leftclicked = false;
        sf::Vector2i mousePos;

        time = clock.getElapsedTime();
        clock.restart();

        while (mMainWindow.pollEvent(event))
        {
            switch (event.type)
            {
            case sf::Event::Closed:
                mMainWindow.close();
                break;
            case sf::Event::KeyPressed:
                creating = (event.key.code == sf::Keyboard::A);
                break;
            case sf::Event::MouseButtonPressed:
                if (event.mouseButton.button == sf::Mouse::Left)
                {
                    leftclicked = true;
                    mousePos = sf::Vector2i(event.mouseButton.x, event.mouseButton.y);
                    break;
                }
            }
        }
        if (creating)
        {
            sf::Sprite sprite;
            mousePos = (mousePos == sf::Vector2i(0, 0) ? sf::Mouse::getPosition(mMainWindow) : mousePos);
            sprite.setTexture(texture);
            sprite.setColor(sf::Color::Red);
            sprite.setOrigin(static_cast<float>(sprite.getTextureRect().width) / 2, static_cast<float>(sprite.getTextureRect().height) / 2);
            sprite.setPosition(static_cast<float>(mousePos.x), static_cast<float>(mousePos.y));
            focus=nullptr;
            EnemyVector.push_back(sprite);
            EnemyDestinations.push_back(sf::Vector2f(static_cast<float>(mousePos.x), static_cast<float>(mousePos.y)));
        }
        if (leftclicked)
        {
            for (auto& enemy = EnemyVector.rbegin(); enemy != EnemyVector.rend(); ++enemy)
            {
                if (enemy->getGlobalBounds().contains(static_cast<float>(mousePos.x), static_cast<float>(mousePos.y)))
                {
                    if(focus==nullptr)
                    {
                    focus = &(*enemy);
                    EnemyDestinations[0]=sf::Vector2f(static_cast<float>(mousePos.x),static_cast<float>(mousePos.y));
                    move=false;
                    break;
                    }
                }
                else
                {
                    move=true;
                    EnemyDestinations[0]=sf::Vector2f(static_cast<float>(mousePos.x),static_cast<float>(mousePos.y));
                }
            }
        }
        if(move)
        {
            {
                if(focus!=nullptr)
                {  
                    focusxvar = focus->getPosition().x;
                    focusyvar = focus->getPosition().y;

                    focus->move(((EnemyDestinations[0].x - focusxvar)*time.asSeconds()*10),
                                 (EnemyDestinations[0].y - focusyvar)*time.asSeconds()*10);
                    clock.restart();

                    if((EnemyDestinations[0].x == focusxvar && EnemyDestinations[0].y == focusyvar))
                    {
                        focus=nullptr;
                    }
                }
            }
        }
        mMainWindow.clear();
        for (auto& enemy = EnemyVector.rbegin(); enemy != EnemyVector.rend(); ++enemy)
        {
            mMainWindow.draw(*enemy);
        }
        mMainWindow.display();
    }
    return 0;
}
 
Zuletzt bearbeitet:
Bronislaw schrieb:
Zur Frage wegen der Reverse Iteratoren: Die sind dafür da, um jeweils das oberste Sprite anklicken zu können.
Dann würde ich sie aber auch nur in der für die Auswahl relevanten Schleife verwenden - ansonsten stiften sie eher Verwirrung bzw. sind einfach falsch. Soweit ich deinen Code verstehe wird z.B. das zuletzt erstellte sprite im Moment zuerst gezeichnet und damit von den anderen verdeckt - du wählst also nicht das oberste, sondern das UNTERSTE sprite aus.

Mit deinen EnemyDestinations stimmt auch irgendwas nicht: du nutz immer nur den ersten Eintrag. Entweder da ist ein Fehler, oder du brauchst garkeinen vector sondern nur eine einzelne Variable.

Noch zwei generelle Tipps zur Formatierung:
1) Einige deiner Schleifen kannst du durch range-based for loops ersetzen. Die draw Schleife würde dann z.B. so aussehen (jetzt mit umgekehrter Iterationsrichtung)
Code:
for (auto& enemy : EnemyVector) {
    mMainWindow.draw(enemy);
}

2) Die meisten "static_cast<float>" - Anweisungen kannst du eigentlich weg lassen. Die machen nur in der Zeile 58 einen Unterschied und auch die lässt sich viel einfacher schreiben, wenn man aus den 2ern explizit floats macht:
Code:
 sprite.setOrigin(sprite.getTextureRect().width / 2.0f,sprite.getTextureRect().height / 2.0f);
 
So, habe diesen Beitrag noch gefunden, also ich habe das Problem damals gelöst, indem ich Tuples verwendet habe, wo für jedes Sprite u.a. auch die Zielkoordinaten und sogar eine Kopie der move function enthalten waren. So konnte jedes Sprite unabhängig von den jeweils anderen gleichzeitig Bewegungen mit unterschiedlichen Zielen ausführen.
 
hast du denn das problemm mit der fehlenden abstraktion gelöst? :D
 

Ähnliche Themen

Zurück
Oben