Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вопрос насчет клавиш [Delphi, Windows]


Страницы:   1 2

Грей ©   (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]

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо