Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2004.10.31;
Скачать: [xml.tar.bz2];

Вниз

DirectInput   Найти похожие ветки 

 
lifo ©   (2004-07-01 15:24) [0]

Как избавиться от "залипания клавишь" (ну по другому я не знаю как сказать ) в ДирИнп
просто как я понял при нажатии на клавишу посылаеться очень много сообщений что клавиша нажата и постоянно обрабатывает ту часть проги которая соответствует данной клавиши !
А мне бы надо при удерживание нажатии данной клавиши один раз обработать соответсвующий код !
Нет ну конечно может я что - то не так понял => подскажите плз


 
ПсихЪ_клон   (2004-07-01 15:58) [1]

Можешь совместно с буффером нажатий заполнять ещё буффер повторных нажатий. А код выполнять только если у тебя в буффере нажатий true, а в буффере повторов false.


 
lifo ©   (2004-07-01 16:16) [2]

Ого блин а как это будет выглядеть (в смысле код :( )


 
NailMan ©   (2004-07-01 16:23) [3]

Во-первых: перед началом опроса девайса(хоть мышки хоть клавы хоть джоя) обязательно заполняй нулями структуру состояний(ту откуда берешь данные инпута).

Во-вторых: опрос должен выглядеть так:

Procedure TControlsManager.ReadKBState;
var hret:hresult;
begin
//как раз нануляем структуру возврата даннных  
fillchar(diks,SizeOf(diks),0);
 hret:=DIkeyboard.GetDeviceState(SizeOf(diks), @diks);
//если обломилось, то включаем опрос клавы, до тех пор пока не заработает
 if Failed (hRet) then
  begin
   hRet := DIKeyboard.Acquire;
    while hRet = DIERR_INPUTLOST do
     hRet := DIKeyboard.Acquire;
  end;
end;


Таким образом для того чтобы тебе по нажатии на какую-то клавишу девайса обработать только один раз, а не тысячу, то тебе надо делать примерно следующее:


//если мы нажали нужную клавишу, то....
If diks[uiPilot_Thrust_Right]=128 then
 begin
  if ControlPlayer then
   begin
    UTPlayer.StrafeActive:=true;
    UTPlayer.SetStrafeAccel(UTPlayer.MoveCaps.MaxStrafeAcceleration);
   end
   else
   begin
    ActiveActor.StrafeActive:=true;
    ActiveActor.SetStrafeAccel(ActiveActor.MoveCaps.MaxStrafeAcceleration);
    ActiveActor.IncThrustFoCTGroup(ENGINE_GROUP_STRAFERIGHT,0.15*ActiveActor.OneDivSyncDelay);
   end;

//Выключаем опрос клавы чтобы тыщу раз не выполнять нашу рекацию на нажатие.
  DIKeyboard.Unacquire;
end;


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


 
Zeqfreed ©   (2004-07-01 16:26) [4]

2ПсихЪ_клон:
Интересная задумка

2lifo:
Пишешь мссив key_times[0..255] of DWORD; при нажатии клавиши
пишешь: if (Keys[DIK_KEY] = 128) and GetTickCount - key_times[DIKK_KEY] > Delay then begin key_times[DIK_KEY] := GetTickCount; DoKeyDown(); end;


 
lifo ©   (2004-07-01 17:02) [5]

Я конечно извеняюсь но я Ламер в 3 поколении и учу по МСДН а там
типа
void WINAPI ProcessKBInput()
{
   #define KEYDOWN(name, key) (name[key] & 0x80)

   char     buffer[256];
   HRESULT  hr;

   hr = g_lpDIDevice->GetDeviceState(sizeof(buffer),(LPVOID)&buffer);
   if FAILED(hr)
   {
        // If it failed, the device has probably been lost.
        // Check for (hr == DIERR_INPUTLOST)
        // and attempt to reacquire it here.
        return;
   }

   // Turn the spaceship right or left
   if (KEYDOWN(buffer, DIK_RIGHT));
       // Turn right.
   else if(KEYDOWN(buffer, DIK_LEFT));
       // Turn left.

   // Thrust or stop the spaceship
   if (KEYDOWN(buffer, DIK_UP)) ;
       // Move the spaceship forward.
   else if (KEYDOWN(buffer, DIK_DOWN));
       // Stop the spaceship.
}


ну я преределал

 if (KEYDOWN(buffer,DIK_RETURN  ))
         switch (GameMode)
{     case 1:
       GameMOde = 2;
break;
     case 2:
        GameMode = 1;
break;

}    
так вот так как оно куча раз проходит то не льзя нормално переключаться
Вы может и правельно говорите но я повторяю что програмирую не так уж и долго и поетому плз на данном моем примере раскажите КАК СДЕЛАТЬ ЧТОБ все работало !!!!!!!!    



 
cyborg ©   (2004-07-01 17:09) [6]

Посмотри в моих статьях там всего один раз идёт нажатие и отжатие при опросе.
http://www.cyborghome.ru/index.php?&id=documents&subid=creategame06



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

Форум: "Игры";
Текущий архив: 2004.10.31;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.041 c
1-1098080595
Uran
2004-10-18 10:23
2004.10.31
delphi5 в delphi7


3-1096366410
bobsan
2004-09-28 14:13
2004.10.31
Кодировка при переносе dbase->mysql


3-1096884693
WondeRu
2004-10-04 14:11
2004.10.31
FireBird: port 3050


1-1098204181
Mirror
2004-10-19 20:43
2004.10.31
Событие OnClose


1-1097673237
Uran
2004-10-13 17:13
2004.10.31
Цифровые символы в строке





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский