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

1

12.01.2004, 16:16

Delay beim Input?

Heya Leute, leider muss ich euch wieder einmal mit einem meiner lästigen Probleme nerven!
Ihr kennt doch sicher alle das Phänomen, dass euer Input in so rasend schneller Frequenz läuft, dass es unmöglich ist einen Character für sich alleine auf den Bildschirm zu bekommen. Eine Release-Key Funktion wollt ihr aber aus Komfortgründen und Liebe zum Spam nich verwenden, drum muss sowas wie eine DelayInput Methode her.
Leider war ich auch durch intensivstes Rumprobieren nicht in der Lage, folgendes Prinzip informationstechnisch umzusetzen:

Zitat

Auf Tastendruck: Starte Counter; Hole einen einzigen Character;
Counter < MeineDelayZeit: Tue nichts, zähle nur den Counter weiter;
Counter >= MeineDelayZeit: Jetzt kannste spammen!


Das Problem bei mir liegt zum grössten Teil daran an folgendem Code:

Quellcode

1
ON_PRESS(DIK_A){strcpy(&cConsoleInput[iCursor],"a"); iCursor++; return OK;}

Ich kann in diesen Syntax leider keine Delay-Funktion mehr reinhauen, dass würde alles andere blockieren. Ich hab auch schon n switch-statement und ne if-schleife ausserhalb der angegebenen Funktion probiert, doch dann brauch ich obigen Code-Schnipsel ja doppelt und dreifach (find ich sehr hässlichen Code).

Wisst ihr vielleicht einen guten Lösungsansatz?

Help would be appreciated,
ByeBye

Euer Pirat!

2

12.01.2004, 20:39

also, ich habe ja schon ne lösung, ich zeig sie euch einfach mal.

Quellcode

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
ON_PRESS(DIK_A)
    {
        if(fDelayTime == 0.0f)
        {
            strcpy(&cConsoleInput[iCursor],"a");
            iCursor++;
            fDelayTime += CYCLE_TIME;
        }
        else if(fDelayTime < 1.0f && !0.0f)
        {
            fDelayTime += CYCLE_TIME;
        }
        else
        {   
            strcpy(&cConsoleInput[iCursor],"a");
            iCursor++;
        }

        return JDX_OK;
    }
    ON_PRESS(DIK_B)
    {
        if(fDelayTime == 0.0f)
        {
            strcpy(&cConsoleInput[iCursor],"b");
            iCursor++;
            fDelayTime += CYCLE_TIME;
        }
        else if(fDelayTime < 1.0f && !0.0f)
        {
            fDelayTime += CYCLE_TIME;
        }
        else
        {   
            strcpy(&cConsoleInput[iCursor],"b");
            iCursor++;
        }

        return JDX_OK;
    }
ON_RELEASE(DIK_A){fDelayTime = 0.0f; return JDX_OK}
ON_RELEASE(DIK_B){fDelayTime = 0.0f; return JDX_OK}


is des net verdammt hässlicher code? und dass mach ich jetzt fuer jeden key??? wisst ihr vielleicht wie man das aufpolieren könnte?

3

12.01.2004, 20:44

2 sachen:

erstmal die if-abfrage:

Quellcode

1
else if(fDelayTime < 1.0f && [b]!0.0f[/b]) 

das !0.0f is bestimmt nicht so gewollt.

ansonsten gibt es noch die möglichkeit, die dx-codes in die jeweiligen ascii-zeichen umzuwandeln:

Quellcode

1
2
3
4
5
6
BYTE kState[256];
HKL Layout = GetKeyboardLayout(0);
int i = DIK_A;
char Result[3];

ToAsciiEx(MapVirtualKeyEx(i, 1, Layout), i, kState, (USHORT *)Result, 0, Layout);
stay tight, project universe comes back!
### project earth <> 2004 ###

4

12.01.2004, 20:57

Thx für deine Antwort! Leider wird dadurch mein code auch nicht gerade schöner. Ist ja ganz nett mit den ASCII Zeichen, und ich werd probieren mir des zu merken (oder hab ich nur mal wieder net gecheckt wie ich meinen code dadurch viel schöner machen kann?? imho macht das meinen code noch unübersichtlicher, der zählt aber net viel hier). Mir gehts mehr darum, wie ich mein oben gestelltes Problem einfach informationstechnisch schöner lösen könnte. Hat jemand schon mal sowas gemacht?

:crying: hoffentlich kann papa helfen :crying:

edit:
!0.0f is schon so gemeint wies dasteht, auch wenns komisch und unlogisch aussieht. Es ist der einzig richtig funktionierende Weg.

5

12.01.2004, 21:04

also das was ich oben geschrieben habe packst du zb in eine funktion foo(), i wird 1. parameter, result der 2.

jetzt kannst du alle tasten durchgehen:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
// im hauptprogramm
for (int i=0; i<256; i++)
{
  char Result[2];  // Es werden bis zu 2 bytes geschrieben (eigentlich is nur das erste wichtig)

  if (ON_PRESS(i))
  {
    foo(i, Result);
    Result[1] = '\0';
    strcpy(&cConsoleInput[iCursor], &Result[0]); 
  }
}


ich denke, dein release und die zeit einbauen schaffst du selber :)
stay tight, project universe comes back!
### project earth <> 2004 ###

6

12.01.2004, 21:11

yeah! Thx! Thx! Thx!

7

12.01.2004, 21:23

hab ich jetzt erst gelesen:

Zitat


!0.0f is schon so gemeint wies dasteht, auch wenns komisch und unlogisch aussieht. Es ist der einzig richtig funktionierende Weg.


du meinst das sicherlich so:
else if(fDelayTime < 1.0f && fDelayTime != 0.0f)
(also ein delay time mehr, sonst hat es einen unerwarteten effekt)

cya, neonew
stay tight, project universe comes back!
### project earth <> 2004 ###

8

12.01.2004, 22:00

Werds ändern auch wenns einwandfrei funzt, Neo sensei. Sieht besser aus!

Werbeanzeige