Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 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.06 c
9-1086797256
karlsn
2004-06-09 20:07
2004.10.10
ии в игре типа "генералов"


1-1095853264
M-Alex
2004-09-22 15:41
2004.10.10
Деление


6-1091177936
MegaVolt
2004-07-30 12:58
2004.10.10
Когда правильно вызывать WSAStartup и WSACleanup


1-1096312758
Kolan
2004-09-27 23:19
2004.10.10
Что за ф-ция INC


14-1093725767
Marser
2004-08-29 00:42
2004.10.10
Вопрос спортсменам





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский