Главная страница
    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.47 MB
Время: 0.037 c
14-1097345866
olookin
2004-10-09 22:17
2004.10.31
4-0


1-1098106297
Pentium133
2004-10-18 17:31
2004.10.31
Сообщение WM_VSCROLL и пр...


4-1096312884
Луарвик
2004-09-27 23:21
2004.10.31
DLL: Privileged instruction !!!


14-1097214769
OlDemon
2004-10-08 09:52
2004.10.31
Атлон, Дюрон, Селерон ...


14-1097473776
RDA
2004-10-11 09:49
2004.10.31
Script под Inno Setup для исталяции Firebird 1.5





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