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

cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

1

06.02.2016, 21:28

[C++ | SFML] SFML combined Matrizen schaffen nur bedingt relative Positionen

Hallo,

zurzeit programmieren mein Freund und ich auch eine GUI. Unsere GUI soll auch Windows und Buttons enthalten.
Nun zum Problem: Unsere Absicht ist es, dass wenn man ein Fenster verschiebt, sich der gesamte Inhalt des Fensters auch um die gleiche Position verschiebt. Aber leider scheitert es schon beim setzten der Buttons. Die Buttons werden wie folgt erzeugt:

C-/C++-Quelltext

1
2
3
4
Button eins(100, 50), zwei(100, 50), drei(100, 50);
eins.setPosition(sf::Vector2f(110, 0));
zwei.setPosition(sf::Vector2f(220, 0));
drei.setPosition(sf::Vector2f(330, 0));


Das Ergebnis ist nicht ganz das, was wir wollen (Anhang). Um relative Positionen zu schaffen, multiplizieren wir die bedein Transform-Matrizen des Fensters und des aktuellen GUI-Elements:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
void WidgetContainer::draw(sf::RenderTarget& target, sf::RenderStates states) const
{
//std::vector<Widget*> _children;

    for (auto &it : _children)
    {
        states.transform *= it->getTransform();
        it->draw(target, states); 
    }
}


Nun zu den Positionen: Die Höhe (y-Achse), auf der die Buttons gesetzt werden, stimmt. Aber die Breite (x-Achse), auf der die Buttons gesetzte werden, stimmt überhaupt nicht.

Was haben wir falsch gemacht?
Danke im Voraus :)
»cojo2015« hat folgendes Bild angehängt:
  • Unbenannt.PNG

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

06.02.2016, 22:06

Spontan würde ich sagen, dass Ihr da für jedes Child die Transformation nochmal drauf multipliziert, was sicher nicht ganz das ist, was Ihr tun wollt. Ihr wollt das sicher entweder nur einmal machen oder für jedes Child separate States verwenden, aber nicht denselben State immer wieder mit derselben Transformation multiplizieren.
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]

cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

3

19.02.2016, 18:14

Es ist uns leider bis jetzt nicht gelungen eine Lösung zu finden :( Kannst du uns einen Lösungsansatz geben? Danke :D

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

19.02.2016, 18:18

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
void WidgetContainer::draw(sf::RenderTarget& target, sf::RenderStates states) const
{
    for (auto &it : _children)
    {
        auto childStates = states;
        childStates.transform *= it->getTransform();
        it->draw(target, childStates); 
    }
}
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]

cojo2015

Alter Hase

  • »cojo2015« ist der Autor dieses Themas

Beiträge: 516

Wohnort: bei mir zu Hause

Beruf: Schüler

  • Private Nachricht senden

5

19.02.2016, 18:33

Oh danke, das ist mehr als der Lösungsansatz :thumbsup: Trotzdem Vielen Dank :D

Werbeanzeige