Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.31;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.041 c
4-1096305827
Kolan
2004-09-27 21:23
2004.10.31
Проблема с регионом


1-1097930568
Dionnis
2004-10-16 16:42
2004.10.31
Количество дочерних элементов элементов в дереве


1-1097739709
AlexanderSK
2004-10-14 11:41
2004.10.31
Есть ли в дельфи константа для обозначения конца строки?


1-1098178724
Sonic_gd
2004-10-19 13:38
2004.10.31
Текст как ссылка


1-1098078393
Dema-X
2004-10-18 09:46
2004.10.31
clipboard->WAVE->file