Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

11

19.02.2013, 16:35

Jetzt hast du teile vom Code in Funktionen ausgelagert, deine komische Schleifenkonstruktion bleibt aber immer noch. Es ging mir darum, dass du die drei Schritte verstehst aus welchen das ganze besteht.

Schritt1:
Erkenne, dass die Maus geklickt wurde. Das ist genau der Moment, in welchem du die Maustaste runter drückst. Nun prüfst du ob sich die Maus über einem Objekt befindet welches mal mit d&d bewegen kann. Wenn ja speicher die Daten die du für den Vorgang benötigst und teile deinem Programm irgendwie mit, dass du im Drag&Drop Zustand bist.
Schritt2:
Wenn du im Drag&Drop Zustand bist, dann bewege dein Objekt. Entweder heftest du es direkt an die Maus oder verschiebst es um die letzte Mausverschiebung.
Schritt3:
Wenn die Maustaste losgelassen wird, dann prüfe ob du dein Objekt ablegen kannst/darfst. Wenn nein, dann setz es an die Ausgangsposition zurück, wenn ja, tu was nötig ist um das Objekt abzulegen und teile deinem Programm mit, dass es nun nicht mehr im Drag&Drop Zustand bist.

Das sind die drei Phasen die du bei einem Drag&Drop Vorgang normalerweise hast. Dein Code ist mir zu unübersichtlich und so wirklich verstehen was du da tun möchtest tu ich auch nicht. Versuch mal ein wenig von deiner Schleifenkonstruktion Abstand zu nehmen. Schritt 1 ist etwas was nur beim Klick der Maus eingeleitet wird. Hier holst du dir jetzt schon alle Informationen. Dazu gehört auch das Objekt welches du bewegen willst. Schritt2 bewegt nur das Objekt, tut dies aber auch nur, wenn du im d&d Zustand bist. Schritt3 wird nur ausgeführt wenn du im d&d Zustand warst und die Maus wieder los lässt.

Durch ordentliche Übersicht vereinfachst du die Fehlersuche. Der Debugger kann dir auch gut helfen. Setz mal Haltepunkte und guck was in deinen Phasen wirklich genau passiert und warum wie verschoben wird.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

12

19.02.2013, 16:49

Das macht sein Code auf den ersten Blick auch, nur die Anordnung der Schleife und der IFs ist etwas merkwürdig, ich würde es andersrum machen. Theoretisch sollte das aber egal sein.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

13

19.02.2013, 18:14

EDIT:
Noch einige Fehler drin gefunden (z.B. die If-Abfrage beim Droppen), werde sie nicht extra hier posten, aber sie sind mir bekannt und bereits behoben!



Danke für die ganzen Ratschläge!
Habe nun versucht alles genau zu analysieren und es funktioniert (mit einer kleinen Einschränkung, ich darf die Maus nicht "zu schnell bewegen")!
Meine 3 Methoden:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    void getMouseOver(sf::RenderWindow &Spiel, sf::View &view)
    {
        // Maus- und Spritekoordinaten im Fenster "Spiel" ermitteln
        // Mauskoordinaten müssen wegen der verschobenen Kamera "view" konvertiert werden
        m = Spiel.convertCoords(sf::Mouse::getPosition(Spiel), view);
        
        if(m.x > sIcon.getPosition().x && m.x < sIcon.getPosition().x + 32 && m.y > sIcon.getPosition().y && m.y < sIcon.getPosition().y + 32)
        {
            dragged = true;
        }
    }

    void Drag(int x, int y, sf::RenderWindow &Spiel, sf::View &view)
    {
        sIcon.setPosition(x-16, y-16);
    }

    void Drop(sf::RenderWindow &Spiel, sf::View &view)
    {
        if(m.x > sIcon.getPosition().x && m.x < sIcon.getPosition().x + 32 && m.y > sIcon.getPosition().y && m.y < sIcon.getPosition().y + 32)
        {
            dragged = false;
        }
    }


Und meine 3 If-Abfragen in der Hauptschleife:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
                // Drag and Drop für Items
                if(sf::Mouse::isButtonPressed(sf::Mouse::Left))
                {
                    for(int i = 0;i<items.size();i++)
                    {
                        items.at(i).getMouseOver(Spiel, view);
                    }
                }

                if(sf::Event::MouseMoved)
                {
                    for(int i = 0;i<items.size();i++)
                    {
                        if(items.at(i).getDragged() == true)
                        {
                                                        // nPos könnte ich auch direkt in der Dragmethode erstellen
                            sf::Vector2f nPos = Spiel.convertCoords(sf::Mouse::getPosition(Spiel), view);
                            items.at(i).Drag(nPos.x, nPos.y, Spiel, view);
                        }
                    }
                }

                if(sf::Event::MouseButtonReleased && sf::Mouse::isButtonPressed(sf::Mouse::Left))
                {
                    for(int i = 0;i<items.size();i++)
                    {
                        items.at(i).Drop(Spiel, view);
                    }
                }

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Kaev« (19.02.2013, 18:31)


Werbeanzeige