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

Volker_Neff

Treue Seele

  • »Volker_Neff« ist der Autor dieses Themas

Beiträge: 249

Wohnort: Hamburg

  • Private Nachricht senden

1

09.11.2015, 14:50

SFGUI Remove(Object)

Moin,

ich habe noch einmal eine Frage zur SFGUI und wie man sie benutzt. Wie es in jeder GUI mal vorkommt soll ein Object gelöscht werden, es soll also weder gerendert werden noch soll es auf aktion durch den User eingehen.
Wenn ich das richtig verstanden habe sollte dies mit der FunktionXYZ->Remove(ZYX) funktioniren.

Ich erstelle nun einen Button. Wenn man ihn drückt soll er verschwinden. Soweit so gut. Doch leider wird er wohl nur aus dem Listener raus geöscht, gerendert wird er weiterhing. Mache ich etwas falsch?

C-/C++-Quelltext

1
2
3
button = sfg::Button::Create("click");
    button->GetSignal(sfg::Widget::OnLeftClick).Connect(std::bind(&handlButton));
    desktop.Add(button);


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
void handlButton()
{
    if (button->IsGloballyVisible())
    {
        desktop.Remove(button);
        std::cout << "delete button" << std::endl;
    }
    return;
}


C-/C++-Quelltext

1
2
3
4
desktop.Update(1.0f);
render_window.clear(sf::Color{ 50, 50, 50 });
sfgui.Display(render_window);
render_window.display();


ich würde mich sehr über eine Antwort freuen
»Volker_Neff« hat folgende Bilder angehängt:
  • Screenshot_01.jpg
  • Screenshot.jpg

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

09.11.2015, 15:01

Bitte zeige mehr Code. Allein anhand des Auszugs lässt sich vermutlich das Problem nicht finden. Zeile 6 aus Delete-Button wird korrekt ausgeführt?
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]

Volker_Neff

Treue Seele

  • »Volker_Neff« ist der Autor dieses Themas

Beiträge: 249

Wohnort: Hamburg

  • Private Nachricht senden

3

09.11.2015, 15:04

Ja der Code wird korrekt ausgeführt. Es ist nur ein kleines Beispiel, das Eigentliche Projekt ist sehr viel größer.
Die Bilder stammen aus diesem Programm

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
sf::RenderWindow render_window = { sf::VideoMode{ 400, 400 }, "Test" };
sf::Event event;
sfg::Desktop desktop;
sfg::SFGUI sfgui;
sfg::Button::Ptr button;
size_t timecount = 0;

void handlButton();

int main()
{
    render_window.resetGLStates();

    button = sfg::Button::Create("click");
    button->GetSignal(sfg::Widget::OnLeftClick).Connect(std::bind(&handlButton));
    desktop.Add(button);

    while (render_window.isOpen())
    {
        while (render_window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
            {
                render_window.close();
            }

            desktop.HandleEvent(event);         
        }

        desktop.Update(1.0f);
        render_window.clear(sf::Color{ 50, 50, 50 });
        sfgui.Display(render_window);
        render_window.display();

        std::this_thread::sleep_for(std::chrono::milliseconds(100));
        timecount++;
        std::cout << timecount << std::endl;

        if (timecount == 100)
            desktop.RemoveAll();
    }

    return 0;
}

void handlButton()
{
    if (button->IsGloballyVisible())
    {
        desktop.Remove(button);
        std::cout << "delete button" << std::endl;
    }
    return;
}

4

09.11.2015, 20:06

Vorab, ich kenne mich mit SFGUI nicht aus.
Allerdings habe ich einige Erfahrungen mit Qt und dort ist ein Remove nie ein löschen des Objekts. Remove entfernt das Widget immer nur vom Parent, vll gibt es dort Parallelen.

EDIT:
Hier mal nen Link
http://sfgui.sfml-dev.de/forum/topic75-d…et-problem.html
scheint auch nicht so gewollt zu sein, Widgets zu löschen.

Volker_Neff

Treue Seele

  • »Volker_Neff« ist der Autor dieses Themas

Beiträge: 249

Wohnort: Hamburg

  • Private Nachricht senden

5

09.11.2015, 21:40

OK das klimgt ja schon mal ganz spannend. Aber was mache ich nun wenn ich große Texturen habe und später gerne aus dem Speicher verbannen würde?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Volker_Neff« (11.11.2015, 19:46)


6

09.11.2015, 23:06

English?

MfG
Check

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

10.11.2015, 07:02

Wir sprechen im ganzen Satz... ;)
Anders formuliert: Was wolltest Du uns damit mitteilen, Checkmateing?

@Volker: Wo genau siehst Du denn da Probleme? Immerhin bist Du für Texturen doch selbst zuständig.
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]

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »BlueCobold« (11.11.2015, 14:30)


8

11.11.2015, 14:04

Ich wollte darauf hinaus, dass ich beim besten Willen nicht verstehe, was Volker Neff geschrieben hat. Dementsprechend habe ich, zugegeben sehr provokativ, nach einer englischen Neuformulierung des Satzes gefragt, die möglicherweise besser verständlich ist.

MfG
Check

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Checkmateing« (11.11.2015, 18:00)


Volker_Neff

Treue Seele

  • »Volker_Neff« ist der Autor dieses Themas

Beiträge: 249

Wohnort: Hamburg

  • Private Nachricht senden

9

11.11.2015, 20:04

Die frage ist was gibt es für Risiken wenn ich über das Objekt keine Kontrolle mehr habe weil ich es nicht mehr brauche und deswegen lösche

eXpl0it3r

Treue Seele

Beiträge: 386

Wohnort: Schweiz

Beruf: Professional Software Engineer

  • Private Nachricht senden

10

25.11.2015, 14:16

Etwas später aber was solls. Wie bereits angedeutet: Wenn das Widget nicht mehr willst, dann ruf Remove() auf und danach lass den shared_ptr aus dem Scope laufen oder reset ihn.
Wenn du das Widget wieder verwenden willst, dann verstecke es einfach mit Show().
Blog: https://dev.my-gate.net/
—————————————————————————
SFML: https://www.sfml-dev.org/
Thor: http://www.bromeon.ch/libraries/thor/
SFGUI: https://github.com/TankOs/SFGUI/

Werbeanzeige

Ähnliche Themen