Форум: "Игры";
Текущий архив: 2004.10.10;
Скачать: [xml.tar.bz2];
ВнизВопрос насчет клавиш Найти похожие ветки
← →
Грей (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;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.039 c