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

hanhau

Treue Seele

  • »hanhau« ist der Autor dieses Themas

Beiträge: 80

Wohnort: St. Pölten, Österreich

Beruf: schueler

  • Private Nachricht senden

1

26.02.2015, 20:40

[SFML 2.1][C++] - Problem mit Drawing in Funktion

Hey :)

Zu meinen Problem:
Ich schreibe eine Funktion zu einen Slider, die die aktuelle Position
einstellt und dabei den "Trimmer", das Teil, was die aktuelle Position
widerspiegelt, zeichnnen soll. Das Problem liegt beim Zeichnen
des Trimmers, das sich in einer Schleife abspielt, solange
die Maus gedrückt ist. Die Abfrage zur Kollision klappt super und präzise,
nur das Zeichnen ist das Problem.

Ich kann inzwischen den Trimmer bewegen, allerdings
wird der Trimmer nicht aktiv mitbewegt, sonder nur
dann wieder gezeichnet, wenn ich die Maus loslasse.

Ich zeichne mit HW_Ptr, das ein Zeiger auf mein
Hauptfenster ist.

Die Bar_Shape ist die Form, die hinter den Trimmmer ist.

Ich kannn auch in der Schleife zum Beispiel das Fenster
schließen mit HW_Ptr->close() .... nur das besc***sene Zeichen :cursing:

Der Code der Funktion:

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
void ui::Slider::getSettingFromMouse()
{
    sf::Vector2f tempTrimmmerPos = Trimmer_Pos;                                // erstellt temporäre Position

    Trimmer_Shape.setFillColor(ui::std_Slider_Col_Trimmer_pressed);      // damit der Trimmer grün wird, wenn gedrückt
    HW_Ptr->draw(Trimmer_Shape);                                                      // kurz zeichnen
    sf::Time Delay;                                                                                // Delay für while-Schleife
    Delay = sf::milliseconds(5);

    while(sf::Mouse::isButtonPressed(sf::Mouse::Left))
    {
        tempTrimmmerPos = sf::Vector2f(sf::Mouse::getPosition(*HW_Ptr).x,Side_L_Pos.y);    //Position orientiert sich an der Sliderposition und der Mausposition

        if(tempTrimmmerPos.x < Side_L_Pos.x + ui::std_Slider_Side_Siz.x)                             // Wenn ausser Bereich, dann auf min oder max stellen
        {
            tempTrimmmerPos.x = Side_L_Pos.x + ui::std_Slider_Side_Siz.x + 0.1;
        }
        if(tempTrimmmerPos.x > Side_R_Pos.x - ui::std_Slider_Trimmer_Siz.x)
        {
            tempTrimmmerPos.x = Side_R_Pos.x - ui::std_Slider_Trimmer_Siz.x - 0.1;
        }

        Trimmer_Shape.setPosition(tempTrimmmerPos);                                                         // Shape auf Position stellen
        Trimmer_Pos = tempTrimmmerPos;                                                                            // für weitere Verarbeitungen dann später im GUI

        HW_Ptr->draw(Bar_Shape);
        HW_Ptr->draw(Trimmer_Shape);                                                                                // zuerst das Bar_Shape, dann das Trimmer_Shape

        sf::sleep(Delay);                                                                                                        // Bissi warten
    }
    Trimmer_Shape.setFillColor(ui::std_Slider_Col_Trimmer);                                                  // Standard Farbe

    if(Type == FLUENT)                                                                                                         // Späterer Code, nicht wichtig !
    {
        Trimmer_Pos_Percent;
    }
    else if(Type == LOCKED)
    {
        Trimmer_Pos_Lock;
    }

}


Danke im Voraus,
bin bisschen verzweifelt :) !
Oft denke ich an sie, niemals habe ich sie gefragt, niemals etwas gesagt,
nur verzweifelt am PC gesessen und dabei die Zeit vergessen, sie ist weg.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »hanhau« (26.02.2015, 20:55) aus folgendem Grund: Dokumentierung :)


Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

2

26.02.2015, 21:04

Du steckst in der While-Schleife fest, solang du deine linke Maustaste nicht loslässt. Dementsprechend zeichnest du permanent in den Backbuffer, wechselst aber nicht die Buffer (RenderWindow::display)
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

hanhau

Treue Seele

  • »hanhau« ist der Autor dieses Themas

Beiträge: 80

Wohnort: St. Pölten, Österreich

Beruf: schueler

  • Private Nachricht senden

3

26.02.2015, 21:09

Darauf wär ich jetzt nicht gekommen, danke :)
Klappt jetzt tadellos, herzlichsten Dank nochmal für die schnelle Antwort !

Schönen Abend mit Grüßen aus
Österreich :)
Oft denke ich an sie, niemals habe ich sie gefragt, niemals etwas gesagt,
nur verzweifelt am PC gesessen und dabei die Zeit vergessen, sie ist weg.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

27.02.2015, 06:19

Generell ist so eine blockierende Funktion überhaupt keine gute Idee. Schau Dir mal an, was ein "Gameloop" ist und wie er funktioniert. So, wie Du es aktuell gebaut hast, kann der Slider in keinem größeren Kontext (wie z.B. einem Spiel) eingebaut werden, weil der Rest in der Zeit eben gar nicht gezeichnet wird und auch nicht gezeichnet werden kann, da Deine Funktion eben so lange nicht verlassen wird, wie die Maus gedrückt wurde. Die Lösung von Nimelrian funktioniert für Deinen speziellen Fall, ist aber eigentlich logisch falsch.
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]

hanhau

Treue Seele

  • »hanhau« ist der Autor dieses Themas

Beiträge: 80

Wohnort: St. Pölten, Österreich

Beruf: schueler

  • Private Nachricht senden

5

27.02.2015, 16:38

Ja, das stimmt wohl leider.
Obwohl ich eigentlich eh vorhatte, meine Menüs statisch zu halten.
Wo sollte auch ein Slider im HUD sein ^^
Ich werde mein Konzept trotzdem überarbeiten,
schließlich bin ich noch in der rohen Aufbauphase.
Oft denke ich an sie, niemals habe ich sie gefragt, niemals etwas gesagt,
nur verzweifelt am PC gesessen und dabei die Zeit vergessen, sie ist weg.

6

27.02.2015, 17:22


Wo sollte auch ein Slider im HUD sein ^^


z.B. Für ein ChatFanster und noch weiter Dinge.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

Werbeanzeige