Форум: "Игры";
Текущий архив: 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