![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вопрос насчет клавиш [Delphi, Windows]
Грей © (2004-05-09 18:47:00)Здравствуйте, у меня два вопроса.
Как сделать так, чтобы делфи обрабатывала нажатие нескольких клавиш (в том числе и символьных) одновременно?
И как сделать так, чтобы при прижатии клавиши таймеры не останавливались?
NailMan (2004-06-09 15:29:00) [1]Синхронизацию делай значит. Синхронизацию по времени и масштабирование.
---
WBR, NailMan aka 2:5020/3337.13
Грей (2004-06-09 14:40:00) [2]Да, но если, допустим, мне нужно чтобы при прижатии клавиши морда двигалась медленно.
NailMan (2004-06-07 00:38:00) [3]Да тоже в главном. Инпут в таймер не пихают. В таймеры пихают изменения
состояний. Даже изменения состояний игрока, но не инпут.
---
WBR, NailMan aka 2:5020/3337.13
Грей (2004-06-06 17:12:00) [4]А если способом [1](GetKeyboardState(kеystate);)
Его тоже в главном цикле?
NailMan (2004-06-05 18:03:00) [5]Грей
Нет конечно - это должно происходить в самом главном цикле, иначе если ты в таймер запихнешь, будет рывковость движений(если кнопка ответственна на изменения состояния).
Типа у меня Главный цикл примерно такой:
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-05 12:45:00) [6]А вот это все дело ( directinput)
UTCM.ReadKBState;
If (Diks[DIK_GRAVE]=128) and DevelopEnableConsole then
begin
UTConsole.Enabled:=true;
UTCM.NoKB;
exit;
end;
нужно в таймер засовывать?
Грей (2004-05-31 13:48:00) [7]не понял
Axis_of_Evil (2004-05-31 13:33:00) [8]SetKeyboardState:>
Грей (2004-05-31 13:25:00) [9]Подскажите, пожалуйста, код на очистку буфера клавиатуры без проверки, что в нем.
NailMan (2004-05-28 13:24:00) [10]Почтой тебе выслал пример
---
WBR, NailMan aka 2:5020/3337.13
Грей (2004-05-28 12:03:00) [11]Кстати! Может зацените игру?
http://grey100.narod.ru/megamaze.exe
350 кб
Грей (2004-05-28 11:51:00) [12]Никто в двух словах не скажет, как directinput использовать?
NailMan (2004-05-17 09:48:00) [13]KilkennyCat ©
Что-то мне подсказывает, что это предполагает использование DirectX... Не вижу упоминания его в вопросе.
Поправка: Это предполагает использование DirectInput из состава DirectX и ничего больше. Зато огромные возможности и скорость работы при правильном использовании.
---
WBR, NailMan aka 2:5020/3337.13
Грей (2004-05-16 10:41:00) [14]Я так понял, про directX надо тоже читать на delphikindom.
KilkennyCat (2004-05-14 20:42:00) [15]
> [10] MeF88 © (14.05.04 10:02)
> [11] NailMan © (14.05.04 13:22)
Что-то мне подсказывает, что это предполагает использование DirectX... Не вижу упоминания его в вопросе.
NailMan (2004-05-14 13:22:00) [16]Делать инпут на DirectInput и не иметь проблем.
---
WBR, NailMan aka 2:5020/3337.13
MeF88 (2004-05-14 10:02:00) [17]KilkennyCat © (09.05.04 21:28) [1]
Если обрабатывать таким методом, то часто клавиши по непонятной причине залипают и три сразу не работают. Лучше через DirectInput.
Thor (2004-05-12 21:34:00) [18]
> Грей (12.05.04 15:34) [8]
вперед на delphikingdom.com про мультимедийные таймеры.
Грей (2004-05-12 15:34:00) [19]Да, таймер стандартный, а какие-то еще мудреные есть?
Thor (2004-05-10 21:13:00) [20]
> KilkennyCat © (10.05.04 20:51) [6]
соглсен, можно и на канвасе красиво рисовать :)
а тормоза могут быть из-за маленького интервала таймера.