Pamācības
Lietotāja saskarne (User Interface), 1. daļa - simbolu atkārtošana un dubultklikšķis
1. Lietotāja saskarne (user interface) - Simbolu atkārtošana (character repeat) un dubultklikšķis (double-click)
Simbolu atkārtošana
Sveiki visiem! Domāju, ka ļoti noderīga lieta spēlēs ir tā sauktā simbolu atkārtošana (character repeat). Spēles interfeiss kļūst daudz ērtāks. Taču ja nelietojat Windows input'u, tad jums tas būs jākodē pašiem.
Lūk, šādi tas izskatās Windows
Tādēļ es domāju parādīt metodi kā to var viegli īstenot.
Tātad mums ir vajadzīgi divi parametri: Repeat delay un Repeat rate.
Vēl mums ir vajadzīga struktūra kura glabās informāciju par nospiesto pogu.
Kods:
int nRepeatDelay=500; int nRepeatRate=50; struct SKey { DWORD dwKey; DWORD dwTimeStamp; int nPushCount; }; SKey kCurrentKey;
Šeit būs kods, kas jāievieto Jūsu GetKeyboardInput (vai kā savādāk) funkcijā:
void GetKeyboardInput(DWORD dwKey,bool bDown) { if (bDown) //ja poga tiek nospiesta { kCurrentKey.dwKey=dwKey; kCurrentKey.dwTimeStamp=GetTickCount(); kCurrentKey.nPushCount=0; } else //ja poga tiek palaista vaļā { if (dwKey==kCurrentKey.dwKey) //ja vaļā tiek palista tieši mūsu poga { kCurrentKey.dwKey=0; //"izdsēšam" visus parametrus kCurrentKey.dwTimeStamp=0; kCurrentKey.nPushCount=0; } } }
Šajā kodā mēs vienkārši saglabājam pēdējo nospiesto pogu un laiku kad tā tika nospiesta. Ja lietojat DirectInput, tad DIDEVICEOBJECTDATA'a dwTimeStamp būs daudz precīzāks nekā GetTickCount(), jo poga var būt nospiesta kādu laiku pirms GetKeyboardInput funkcijas. Ja mūsu poga tiek palaista vaļā tad mēs "izdsēšam" visus parametrus lai nerastos kļūdas.
Šis kods jums jāievieto savā Run (noteikti Jūsu nosaukums būs savādāks) funkcijā:
void Run() { while (kCurrentKey.dwKey && //ja kāda poga ir nospiesta GetTickCount()-nRepeatDelay-m_kCurrentKey.nPushCount*nRepeatRate>m_kCurrentKey.dwTimeStamp) { SendMessage(KEYDOWN,kCurrentKey.dwKey); //sūtam ziņu ka simbols tiek atkārtots kCurrentKey.nPushCount++; } }
Šeit mēs pārbaudām vai kāda poga ir nospiesta un vai ir laiks tai atkārtoties. Katru reizi mēs palielinām kCurrentKey.nPushCount lai zinātu cik reizes mēs jau simbolu esam atkārtojuši. Mēs to darām līdz to vairs nevajag.
Dubultklikšķis
Nakošā lieta bez kuras nevar iztikt neviena sevis cienīga lietotāja saskarne (user interface) ir dubultklikšķis (double-click).
Dubultklikšķa konfigurēšana
Šeit mums ir vajadzīgs tikai viens parametrs: double-click speed. Arī šeit mums būs vajadzīga struktūra pelei.
Kods:
int nDoubleclickSpeed; struct SMouse { DWORD dwTimeStamp; POINT pPos; }; SMouse mMouse;
Šeit atkal kods, kas jāievieto GetMouseInput funkcijā. Tikai šoreiz tā darbosies tikai pelei.
void GetMouseInput(DWORD dwKey,bool bDown) { if (dwKey==0) //šoreiz mēs darbosimies tikai ar kreiso peles pogu, taču Jūs to varat pielāgot visām pogām pievienojot SMouse parametru //DWORD dwKey { if (bDown) //ja tā tiek nospiesta { POINT pPos; GetCursorPos(&pPos); //iegūstam peles koordinātas if (GetTickCount()-nDoubleclickSpeed < mMouse.dwTimeStamp && //ja laiks starp klikšķiem ir mazāks par nDoubleclickSpeed pPos.x==mMouse.pPos.x && //un ja peles koordinātas sakrīt ar iepriekšējām pPos.y==mMouse.pPos.y) { SendMessage(DOUBLECLICK,0); //sūtam ziņu ka ir noticis dubultklikšķis mMouse.dwTimeStamp=0; //"izdzēšam" visus parametrus mMouse.pPos.x=0; mMouse.pPos.y=0; } else { mMouse.dwTimeStamp=GetTickCount(); //citādi mēs saglabājam peles tagadējos parametrus mMouse.pPos=pPos; } } else //ja tā tiek palaista vaļā { //... } } }
Šajā kodā mēs saglabājam peles koordinātas un laiku (ar GetTickCount()) kad tā tika nospiesta (atkal precīzāk būtu DIDEVICEOBJECTDATA'a dwTimeStamp). Ja laiks starp iepriekšējo pogas nospiešanu un tagadējo ir mazāks par nDoubleclickSpeed tad sūtam ziņu ka ir noticis dubultklikšķis un "izdzēšam" visus parametrus lai nerastos kļūdas.
Beigas
Es domāju ka normālam input'am jums pietiks ar šo. Taču ja jums ir kādi jautājumi, labojumi vai jaunas idejas, tad sūtiet rakstiet tos komentāros.
Tagad es varu mazliet atpūsties un gatavoties nākošajai pamācībai: 2. Lietotāja saskarne (user interface) - pogas (buttons), checkbox.
Līdzīgi raksti: