Pamācības

Lietotāja saskarne (User Interface), 1. daļa - simbolu atkārtošana un dubultklikšķis

Lietotāja saskarne (User Interface), 1. daļa - simbolu atkārtošana un dubultklikšķis

Elviss Strazdiņš, 25.02.2010

Komentāri: 3

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.

Jūs varētu interesēt arī šādi raksti:

Aptauja

Vai Tu apmeklēji gamedev.lv konferenci [0]



Citas aptaujas

Autorizācija

Lietotājs

Parole


Reģistrēties Aizmirsi paroli?