Entwickler-Ecke

Sonstiges (Delphi) - Tastatur schneller


Moritz M. - So 15.12.02 10:29
Titel: Tastatur schneller
Hi

Ich habe ein pong spiel, einen balken kann man bewegen. Nur leieder geht die Tastatur sehr langsam. Kann man das umstellen?


lightning_in_the_dark - So 15.12.02 10:34

Hi Leuts
hmm.. Du meinst, dass sich der Balken sehr langsam bewegt, wenn du eine Taste gedrückt hälst. Ich würde pro "Zyklus" einfach mehr Pixel zur Position adieren.

MfG
lightning_in_the_dark


DeCodeGuru - So 15.12.02 10:35

Start -> Einstellungen -> Systemsteuerung -> Tastatur -> Wiederholrate

Ich hoffe, das hilft.


Moritz M. - So 15.12.02 10:49

Das wäre auch eine Lösung, nbur müsste das der User selbst einstellen. Ich suche eine Lösung, die nur in meinem Prog zählt


tommie-lie - So 15.12.02 19:32

uiii, das geht glaub' ich irgendwie mit DirectInput.
Aber wie wär's denn mit ein paar Variabeln? Im KeyDown wird dann die Variable gesetzt, je nachdem, welche Taste gedrückt wurde. Dann guckst du in deiner Endlosschleife, die auch den Pong-Ball bewegt (der GLCadencer ;-), ich weiß was gemeint ist) ob die links- oder die rechts-variable gesetzt ist. Dementsprechend bewegst du dann das Paddle um eine konstante Anzahl an Pixeln (per Vektor). So einfach geht das auch ohne DirectInput.
Auf Wunsch gibt's auch ein Codebeispiel...

Tschüß
Thomas


Moritz M. - So 15.12.02 19:39

Ein Codebespiel wäre nett(Ich nehm nen Timer :wink: )


tommie-lie - So 15.12.02 19:49

also ein Cadencer wäre immer von Vorteil. Der hat auch gleich 'n DeltaTime drin....

codebeispiel:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
var: Direction: set of (left, right);

procedure KeyDown;
begin
  if Key = VK_Left then
    Direction := left
  else if Key = VK_Right then
    Direction := right;
end;

procedure CadencerProgress;
begin
  if Direction = left then
    Paddle.bewege_nach_links
  else if Direction = right then
    Paddle.bewege_nach_rechts;
end;


Der Code ist ohne nachgucken und ausprobieren geschrieben wurden, die Prozeduren sind cniht richtig deklariert, die Aufrufe teilweise auch falsch, aver der Sinn, der dahinter steckt, dürfte klar sien.


Aya - Di 17.12.02 06:49

Hi,

du kannst die Tastatur ganz einfach so schnell machen wie es die CPU zulässt.. :)


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
var
  Keys: Array[0..255] of Boolean;

procedure OnKeyDown...
begin
  Keys[Key]:=true;
end;

procedure OnKeyUp...
begin
  Keys[Key]:=false;
end;

procedure OnTimer... //TTimer.OnTimer Event
begin
  if Keys[VK_LEFT] then
    GoLeft;
  if Keys[VK_RIGHT] then
    GoRight;
  //blbla... dein Code halt *g*
end;


Den Timer Intervall kannst du jetzt einfach auf 1ms setzen oder was du halt gern willst... wenn die tastatur langsam reagierne soll halt auf 100... versuch's einfach :)

Au'revoir,
Aya~


Moritz M. - Di 17.12.02 07:00

Really thanks!! :P


Delete - Di 17.12.02 08:37

Aya hat folgendes geschrieben:

du kannst die Tastatur ganz einfach so schnell machen wie es die CPU zulässt.. :)

Das ist falsch! Wenn du mit einem Timer arbeitest kannst du es nur so schnell machen wie die Auflösung des Timers vom Betriebssystem ist und die ist vom OS abhängig. Wiondows2000 hat zum Beipsiel eine höhere Auflösung wie Windows 9x. Bei einem von beiden liegt die mindest Auflösung bei 50 ms, wenn du jetzt 1 ms angibts, wird im günstigsten Falls ein Timer-Ereigniss auch nur alle 50 ms ausgelöst. Im günstigesten Fall, weill nicht sicher ist, dass deine Anwendung auch alle 50 ms dazu kommt die WM_TIMER Nachricht auch alle 50 ms abzuholen. Braucht die Anwendung für die Nachrichte, die davor ligen länger kann es passieren, das deinen Anwendung erst nach 100 ms oder gar erst 200 ms dazu kommt die Timer Nachricht abzuholen.


enigma - Di 17.12.02 12:43

Wenn du einen Timer nehmen willst würde ich den DXTimer aus DelphiX nehmen.
Den stellst du auf Null und dann läuft der Code wirklich so schnell wie die CPU es zulässt


tommie-lie - Di 17.12.02 15:00

oder den TGLCadencer. Ist ja im Prinzip auch nur ein Timer.
Aber ich finde Ayas Lösung für nur zwei Tasten ein bisschen zu kompolex. Wenn noch mehr Tasten dazukommen, würde es vielleicht was bringen, aber ich würde für 2 Tasten trotzdem einfach 2 Boolean-Variablen (bzw ein Set) nehmen, weil's übersichtlicher ist (meiner Meinung nach). Nachher wird dann eifnach nur abgefragt, welche Richtung "true" ist und schon hat man's.


Moritz M. - Di 17.12.02 19:10

Ich habs jetzt mit nem Timer und allen tasten gemacht, weil ich noch mher Funktionen hab, die öfters aufgerufen werden müssen.
Und es geht sehr gut!! :lol:
Really Thanks!! :P