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
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
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.
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->klawiatura->opoznienie powtarzania i czestotliwosc powtarzania. Jak zrobic reakcje sprite'a na klawisze z predkoscia niezalezna od ustawien windy? {glowa} hmm... ;(
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?
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';
Pozdrówka
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}
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.
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.