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

Raidenkk

Treue Seele

  • »Raidenkk« ist der Autor dieses Themas

Beiträge: 151

Wohnort: Bergkamen/Oberaden

Beruf: Multimedia Informatik

  • Private Nachricht senden

41

16.09.2011, 13:58

Ich habe es mal mit Sc4vs vorschlag versucht aber leider habe ich genau das gleiche Problem wie mit meinem Beispiel.
Ich drücke 1 mal kurz auf die up Taste und schon springt die Auswahl aufs Maximum und überspring so die anderen Menü Felder :/

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
enum key_state
    {
        KS_NONE = 0,
        KS_PRESSED,
        KS_PRESSING,
        KS_RELEASED
    };

    key_state up_key_state = KS_NONE;
    key_state down_key_state = KS_NONE;

    const sf::Input& input = App.GetInput();
    if( input.IsKeyDown( sf::Key::Up ) && up_key_state == KS_NONE )
       up_key_state = KS_PRESSED;
    else if( input.IsKeyDown( sf::Key::Up ) && up_key_state == KS_PRESSED )
        up_key_state = KS_PRESSING;
    else if ( !input.IsKeyDown( sf::Key::Up ) && ( up_key_state == KS_PRESSED || up_key_state == KS_PRESSING ) )
        up_key_state = KS_RELEASED;
    else if( !input.IsKeyDown( sf::Key::Up ) )
        up_key_state = KS_NONE;

    if( up_key_state == KS_PRESSED )
        ++Auswahl;

Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

42

16.09.2011, 14:05

Wie sieht deine Funktion genau aus?

C-/C++-Quelltext

1
2
key_state up_key_state = KS_NONE;
key_state down_key_state = KS_NONE;

Das darf nicht Teil der Funktion sein. Sonst kann es nicht funktionieren. up_key_state muss eine Membervariable sein, die immer wieder neu gesetzt und aktualsiert wird.

43

16.09.2011, 14:08

Was machst du da eigentlich?
Warum Down_Key_State?
Warum definierst du unnütz KS_NONE mit 0? Wird bei enum-Auflistungen nicht alles automatisch definiert?
Du Fragst ab ob was KS_NONE ist. JA! Also weiter: Ist etwas KS_PRESSED? JA! Also weiter: Ist etwas KS_PRESSED und KS_RELEASED? JA! Also weiter: Taste oben gedrückt? Ja, also KS_NONE setzen.
Nach jedem Lauf gehst du einmal alle if-Bedingungen durch. Im Prinzip sind sie unnütz.
Lerne deinen eigenen Code zu verstehen, kommentiere aus, fange das Projekt noch einmal neu an. Nur ein gut gemeinter Rat.
Achja: TGGC hat schon Recht, ich verbitte mir das du den Ton von TGGC verbittest! Denn hier ist das angebracht.

MfG
Check

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

44

16.09.2011, 14:19

Zitat

Achja: TGGC hat schon Recht, ich verbitte mir das du den Ton von TGGC verbittest! Denn hier ist das angebracht.

1. Hast du gar nichts zu verbieten
2. Ist dieser Ton niemals angebracht
3. Bei deinem Ton fällt mir nur ein: Es gibt genügend Threads wo du auch massiv auf den Schlauch standest. Also wer im Glashaus sitzt und so...
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

45

16.09.2011, 14:29

Jaja, nur habe ich nicht über solch Bemerkungen gemeckert, falls doch nehme ich´s zurück.
Und ich finde den Spruch von TGGC nicht wirklich unhöflich, jedenfalls hier nicht.

MfG
Check

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Checkmateing« (16.09.2011, 14:36)


Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

46

16.09.2011, 14:36

Meinst du wirklich ernst was du da schreibst? Du solltest erst mal den ganze Thread lesen, dann weißt du auch, wo der Code herkommt.

Du Fragst ab ob was KS_NONE ist. JA! Also weiter: Ist etwas KS_PRESSED? JA! Also weiter: Ist etwas KS_PRESSED und KS_RELEASED? JA! Also weiter: Taste oben gedrückt? Ja, also KS_NONE setzen.

else ist dir ein Begriff? Lies mal nach, was das bedeutet...

Ich habe selten eine derart unqualifizierten Beitrag gelesen. Völlig unnötig aggressiv gegenüber einem Anfänger und selbst einen auf absoluten Ober-Programmierer machen, was leider total nach hinten losgeht.

47

16.09.2011, 14:40

Nach jedem Durchlauf.
Ich dachte das wäre klar.
Ist aber der Falsche Ort zum Diskutieren, nicht?

MfG
Check

EDIT: Beschimpfen?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Checkmateing« (16.09.2011, 15:09)


Fred

Supermoderator

Beiträge: 2 121

Beruf: Softwareentwickler

  • Private Nachricht senden

48

16.09.2011, 15:00

Wieso der falsche Ort zum Diskutieren. Du behauptest eine Hilfe zu geben, die schlichtweg falsch ist und beschimpfst den Fragesteller noch dazu. Darauf muss natürlich hingewiesen werden und das ist dann sicher nicht der falsche Ort zum diskutieren.

Das Problem liegt darin, dass bei jedem Durchlauf up_key_state auf KS_NONE gesetzt wird(das muss außerhalb geschehen). Sonst tut der Code genau das, was er soll. Ich habe es gerade mal kurz mit der SFML 2.0(weil ich 1.6 nicht habe, aber es ist egtl. genau das gleiche nur andere Funktionsnamen) getestet und hatte keine Probleme. Ich glaube du hast nur noch nicht so ganz verstanden, was der Code tun soll.

Aus diesem Grund hier nochmal kommentiert mit Funktionssignatur da eingefügt, wo sie sein sollte:

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
// Key-State enum definiert für eine Taste einen bestimmten Zustand,
enum key_state
    {
        KS_NONE = 0, // Nicht gedrückt
        KS_PRESSED, // Gerade gedrückt
        KS_PRESSING, // Länger gedrückt
        KS_RELEASED // Gerade losgelassen
    };

    key_state up_key_state = KS_NONE;

    // Down state logischerweise analog zum up_state zu realisieren....
    key_state down_key_state = KS_NONE;

void check_input()
{
    const sf::Input& input = App.GetInput();
    // Wenn die Taste jetzt gedrückt ist, vorher nocht nicht gedrückt war, dann ist sie jetzt gerade eben gedrückt worden
    if( input.IsKeyDown( sf::Key::Up ) && up_key_state == KS_NONE )
       up_key_state = KS_PRESSED;
    // Ist die Taste gedrückt und war auch vorher schon gedrückt, dann ist sie schon länger gedrückt
    else if( input.IsKeyDown( sf::Key::Up ) && up_key_state == KS_PRESSED )
        up_key_state = KS_PRESSING;
   // Ist die Taste nicht gedrückt, war es aber gerade eben noch, dann ist sie jetzt gerade losgelassen worden
    else if ( !input.IsKeyDown( sf::Key::Up ) && ( up_key_state == KS_PRESSED || up_key_state == KS_PRESSING ) )
        up_key_state = KS_RELEASED;
   // Ist die Taste nicht gedrückt, aber auch nicht gerade eben gedrückt gewesen, dann ist sie nicht gedrückt.
    else if( !input.IsKeyDown( sf::Key::Up ) )
        up_key_state = KS_NONE;

    // Nur wenn die Taste gerade eben gedrückt wurde, wird die Auswahl erhöht.
    if( up_key_state == KS_PRESSED )
        ++Auswahl;
}

Raidenkk

Treue Seele

  • »Raidenkk« ist der Autor dieses Themas

Beiträge: 151

Wohnort: Bergkamen/Oberaden

Beruf: Multimedia Informatik

  • Private Nachricht senden

49

16.09.2011, 15:11

Ich danke dir Fred vielmals!
Endlich geht es.Dazu habe ich neue sachen zu gelernt :) und ich dachte schon ich finde garkeine lösung mehr.

50

16.09.2011, 15:19

Lösungen sind so häufig wie Fragen, so viele Fragen es gibt, so viele Lösungen gibt es. ^^

MfG
Check

Werbeanzeige