Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.10;
Скачать: CL | DM;

Вниз

Вопрос насчет клавиш   Найти похожие ветки 

 
Грей   (2004-05-09 18:47) [0]

Здравствуйте, у меня два вопроса.
Как сделать так, чтобы делфи обрабатывала нажатие нескольких клавиш (в том числе и символьных) одновременно?
И как сделать так, чтобы при прижатии клавиши таймеры не останавливались?


 
KilkennyCat ©   (2004-05-09 21:28) [1]

Используйте функцию GetKeyboardState(keystate : Tkeyboardstate);

Tkeyboardstate - это массив э-э... 0..256 of Byte, если не ошибаюсь. Грубо говоря - это матрица клавиатуры.
Можно обрабатывать так:
GetKeyboardState(kеystate);
if (kеystate[vk_Space] And 128) <> 0 then нажат пробел
if (kеystate[65] And 128) <> 0 then нажата А

что касается остановки таймера при нажатии... как Вы это сделали?


 
Грей   (2004-05-10 17:13) [2]

Вот у меня через определенный промежуток времени монстры передвигаются по карте и летают снаряды. (это с помощью таймера).
Так вот. Если у меня прижать клавишу, допустим стрелка вверх, то монстры не двигаются и снаряды не летают.
Если хотите, я могу вам ссылку на мою игру дать - все увидите.


 
Thor ©   (2004-05-10 18:28) [3]

а таймер наверняка обыкновенный, стандартный?
если да, то не мудрено.
на нем игры лучше не делать вообще, а почитать про мултимедийные таймеры.
статьи были здесь на DelphiGFX и на delphikingdom.


 
KilkennyCat ©   (2004-05-10 20:10) [4]

ну, можно ж и без таймера сделать... в цикле бесконечном, с application.processmessage... или отдельным потоком.


 
Thor ©   (2004-05-10 20:41) [5]


> KilkennyCat ©   (10.05.04 20:10) [4]

а оно нужно?


 
KilkennyCat ©   (2004-05-10 20:51) [6]


> [5] Thor ©   (10.05.04 20:41)


ну.. не все ж игры в ДиректИкс делать-то...
Хотя, честно говоря, не понимаю, почему монстры останавливаются. Я от скуки леплю с обычным таймером - все ок.


 
Thor ©   (2004-05-10 21:13) [7]


> KilkennyCat ©   (10.05.04 20:51) [6]

соглсен, можно и на канвасе красиво рисовать :)
а тормоза могут быть из-за маленького интервала таймера.


 
Грей   (2004-05-12 15:34) [8]

Да, таймер стандартный, а какие-то еще мудреные есть?


 
Thor ©   (2004-05-12 21:34) [9]


> Грей   (12.05.04 15:34) [8]

вперед на delphikingdom.com про мультимедийные таймеры.


 
MeF88 ©   (2004-05-14 10:02) [10]

KilkennyCat ©   (09.05.04 21:28) [1]
Если обрабатывать таким методом, то часто клавиши по непонятной причине залипают и три сразу не работают. Лучше через DirectInput.


 
NailMan ©   (2004-05-14 13:22) [11]

Делать инпут на DirectInput и не иметь проблем.

---
WBR, NailMan aka 2:5020/3337.13


 
KilkennyCat ©   (2004-05-14 20:42) [12]


> [10] MeF88 ©   (14.05.04 10:02)


> [11] NailMan ©   (14.05.04 13:22)

Что-то мне подсказывает, что это предполагает использование DirectX... Не вижу упоминания его в вопросе.


 
Грей   (2004-05-16 10:41) [13]

Я так понял, про directX надо тоже читать на delphikindom.


 
NailMan ©   (2004-05-17 09:48) [14]

KilkennyCat ©
Что-то мне подсказывает, что это предполагает использование DirectX... Не вижу упоминания его в вопросе.
Поправка: Это предполагает использование DirectInput из состава DirectX и ничего больше. Зато огромные возможности и скорость работы при правильном использовании.

---
WBR, NailMan aka 2:5020/3337.13


 
Грей   (2004-05-28 11:51) [15]

Никто в двух словах не скажет, как directinput использовать?


 
Грей   (2004-05-28 12:03) [16]

Кстати! Может зацените игру?
http://grey100.narod.ru/megamaze.exe
350 кб


 
NailMan ©   (2004-05-28 13:24) [17]

Почтой тебе выслал пример

---
WBR, NailMan aka 2:5020/3337.13


 
Грей   (2004-05-31 13:25) [18]

Подскажите, пожалуйста, код на очистку буфера клавиатуры без проверки, что в нем.


 
Axis_of_Evil ©   (2004-05-31 13:33) [19]

SetKeyboardState:>


 
Грей   (2004-05-31 13:48) [20]

не понял


 
Грей   (2004-06-05 12:45) [21]

А вот это все дело ( directinput)
 UTCM.ReadKBState;
If (Diks[DIK_GRAVE]=128) and DevelopEnableConsole then
 begin
  UTConsole.Enabled:=true;
  UTCM.NoKB;
  exit;
 end;
нужно в таймер засовывать?


 
NailMan ©   (2004-06-05 18:03) [22]

Грей
Нет конечно - это должно происходить в самом главном цикле, иначе если ты в таймер запихнешь, будет рывковость движений(если кнопка ответственна на изменения состояния).

Типа у меня Главный цикл примерно такой:

Procedure TGameEngine.CocpitMode;
var e:integer;
begin
resettime:=false;
REPEAT
//ля-ля-ля с мессаджами окна
if PeekMessage(Msg,Handle,0,0,PM_REMOVE) then begin TranslateMessage(Msg);DispatchMessage(Msg);end;

//если консоль активна, то все управление инпутом на нее
 if UTConsole.Enabled then
  begin
   e:=UTConsole.Execute; //обработка ввода консоли и прочие махинации
   if e=EC_TOGGLECONSOLE then
     begin UTConsole.Enabled:=False;
             ResetTime:=true;
    end;
  end
 else
  ReadInputCocpitMode; //иначе инпут обрабатывается как обычно

//Если не пауза и консольнеактивна производим обработку игровых процессов
if (not UTConsole.Enabled) and (not Status.Paused) then
 Processing;

//рендер
 Dev.BeginScene;
 Scene.Render(False); //ирсуем сцену
 if UTConsole.Enabled then UTConsole.Render(true);  //если консоль активна и ее тоже
 if status.paused then DrawPauseString;  //если игра в режиме паузы рисуем надпись "ПАУЗА"

//рисуем счетчик фпс-ов
if DevelopShowFPS then
UTManager.NFont[Chicago10px].DrawText(FPSString,FPSRect,$ffffffff,DF_LEFT);
//рисуем инфо-строку(если надо)
if DevelopShowInfo then
 UTManager.NFont[Chicago10px].DrawText(InfoString,InfoRect,$ffffffff,DF_LEFT);

 Dev.EndScene;
 Dev.Present(nil, nil, 0, nil);
 Inc(FPSCounter);

//продолжаем до тех пор пока не произойдет одно из событий
UNTIL status.ProcStatus in[STAT_EXITCODE,STAT_RESTART, STAT_SCREENSHOT, STAT_DISPLAYINGAMEMENU];
end;


Собственно в методе ReadInputCocpitMode и находится считывание клавиатуры(которое приведено в твоем посте) и обработка мыша, клавы, джоя. Если консоль включается, то мыш и джой вырубаются(делается им UnAcquire для того чтобы не было смещений в этих девайсах пока они не используются иначе будет бяка).

ResetTime в данном случае нужен для различных процессов, которые привязаны к таймеру. Скажем партиклы. Если ResetTime=true, значит партиклсистем заново себя инициализирует(т.к. время упущено большой паузой).

---
WBR, NailMan aka 2:5020/3337.13


 
Грей   (2004-06-06 17:12) [23]

А если способом [1](GetKeyboardState(kеystate);)
Его тоже в главном цикле?


 
NailMan ©   (2004-06-07 00:38) [24]

Да тоже в главном. Инпут в таймер не пихают. В таймеры пихают изменения
состояний. Даже изменения состояний игрока, но не инпут.

---
WBR, NailMan aka 2:5020/3337.13


 
Грей   (2004-06-09 14:40) [25]

Да, но если, допустим, мне нужно чтобы при прижатии клавиши морда двигалась медленно.


 
NailMan ©   (2004-06-09 15:29) [26]

Синхронизацию делай значит. Синхронизацию по времени и масштабирование.

---
WBR, NailMan aka 2:5020/3337.13



Страницы: 1 вся ветка

Текущий архив: 2004.10.10;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.028 c
4-1093845468
Роман Снегирев
2004-08-30 09:57
2004.10.10
MMF


6-1091593309
Дмитрий Ботвин
2004-08-04 08:21
2004.10.10
Объём оперативной памяти


8-1090407440
Urvin
2004-07-21 14:57
2004.10.10
EMS


3-1094627732
yuray
2004-09-08 11:15
2004.10.10
Инфо о клиентах базы


4-1094602456
jack128
2004-09-08 04:14
2004.10.10
Запуск программы из под IDE. Проблемы..