OnKeyDown

0

Instrukcje zawarte w procedurze OnKeyDown, podczas trzymania wcisnietego klawisza, powtarzaja sie z predkoscia ustalona w panelu sterowania. Jak ustawic czestotliwosc powtarzania sie tych instrukcji? hmm...

Z gory THX

0

Hmm.. szczerze mówiąc to nie bardzo łapię o co Ci chodzi. Aczkolwiek jesli chodzi ci o częstotliwość to ie wystarczy np. stworzyć sobie Timera a OnKeyDown napisac że:
if not Timer1.Enabled then Timer1.Enabled:=true;
Nie od razu timer1.Enbled:=true, bo to może wywołać ciut inne efekty. Potem tylko go wyłączyć i sprawa z głowy.--, tradycyjnie pozdrawiam - Numi.

0

Ciekawy pomysl, ale nie wyjdzie w moim przypadku. Jesli przedstawilem problem nie jasno to sprobuje jeszcze raz:
W procedurze FormKeyDown dla formularza mam miedzy innymi takiego if'a:

if key=vk_up then paletka.y:=paletka.y-5;

(paletka jest sprite'm DelphiX)

Po skompilowaniu prog'a, jak wcisne i trzymam strzalke w gore, sprajt pomyka po ekranie w gore. Jednak jego szybkosc i reakcja na klawisz jest zalezna od ustawien w panelu sterowania-&gtklawiatura-&gtopoznienie powtarzania i czestotliwosc powtarzania. Jak zrobic reakcje sprite'a na klawisze z predkoscia niezalezna od ustawien windy? {glowa} hmm... ;(

0

Ja też jestem ciekawy jak to zrobić chociażby na zwykły PaintBox-ie czy Image, jak mu podam zeby szedl o 1 pixel to bardzo wolno zapieprza (wiadomo 1 pixel) i jak ustawic zeby co 1 pixel ale szybko?

0

Zrób sobie timera z interval np. 50. I w ontimer:

if ruch='left' then
sprite.left:=sprite.left-1;

if ruch='right' then
sprite.left:=sprite.left+1;

if ruch='up' then
sprite.top:=sprite.top-1;

if ruch='down' then
sprite.top:=sprite.top+1;

Potem robisz globalną zmienną ruch:string

i w onkeydown:

if key=VK_LEFT then
ruch:='left';

if key=VK_RIGHT then
ruch:='right';

if key=VK_UP then
ruch:='up';

if key=VK_DOWN then
ruch:='down';

A w onkeyup:

ruch:='stop';

Pisałem z pamięci, ale chyba powinno działać.---------------------------
Delphi 6

Pozdrówka

0

To jest to. THX. {browar}

Dokladnie zrobilem tak:

Dodalem komponenty DXImput i Timer (interval:=1) oraz wstawilem kodzik:

procedure TMainForm.Timer1Timer(Sender: TObject);
begin
DXInput.Update;
if DXInput.Keyboard.Keys[VK_Escape] then close;
if DXInput.Keyboard.Keys[VK_Up] then gracz.y:=gracz.Y-20;
if DXInput.Keyboard.Keys[VK_Down] then gracz.y:=gracz.Y+20;
(...)
end;

Narka {hello}

0

Właśnie o to mi chodziło, tylko nie podałem co z timerem ma być - ech.. nikt mnie nie rozumie :-(.--, tradycyjnie pozdrawiam - Numi.

0

To wasze rozwiązanie jest kiepskie :P . Sugeruję użyć DXInput. W Głównym timerze daje się tylko DXInput1.update; a w DoMove Sprite'a odczytujesz jakie są klawisze wciśnięte (mozna zrobić z autofire'em lub bez).--Delphi 6
Pozdrowienia{hello} ,
Moderator Imperior

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.