Tipy a triky pre vývoj aplikácií a hier 4

Po nájdení vhodnej polohy pre kurzorové tlačidlá dotykového ovládania sa zdalo byť všetko vyriešené. Vytvorím kontejnerový prvok Grid o rozmeroch 3×3 polia a na vhodné miesta rozmiestnim 4 tlačidlá. Bohužiaľ nefungovalo to. Klasické tlačidlo vo Windows 8 totiž má udalosť zatlačenia, bohužiaľ sa nedá jednoducho definovať udalosť pustenia tlačidla. V hre tohto typu je to dôležité – kým hráč chce aby sa figúrka pohybovala vpravo drží pravú šipku. Keď ju pustí figúrka musí zastať. To pri ovládaní jednou rukou. Trochu predbehnem a uvediem skúsenosť z implementácie hry pre Windows Phone. Tu som hru implementoval pod názvom Flappy Chicken. Všimnite si ovládacie prvky po obidvoch stranách hracieho plánu. Na každej strane je tlačidlo pre príslušný smer a tlačidlá “HORE”, “DOLE” a “HOĎ HUBU”, ktoré sú takto vlastne zdvojené

Porovnajte s Windows 8.1 implementáciou kde je “kurzorový kríž”. Prax ukáže, ktorý spôsob ovládania je lepší. Možno bude najlepším riešením “tretia cesta”. Obidve platformy, teda tablety s Windows 8 aj Windows Phone majú náklonomery, takže hra by sa možno najlepšie dala ovládať naklápaním zariadenia. Vyskúšam, uvidím…

(Free verzia hry je tu http://apps.microsoft.com/windows/app/flappy-free/a2153dbe-ac79-44b8-9af2-bc0169391af8)

U obidvoch spôsobov ovládania treba počítať so sekundárnym javom. U WP8 používateľ prstom alebo palcom jednej ruky stále drží kláves pre jeden smer a druhou rukou sa dotkne iného smeru. Logicky pritom očakáva že figúrka zmení smer. U W8 s kurzorovým krížom sa stáva to že hráč presunie prst napríklad zo šípky vľavo na šípku hore bez toho aby oddialil prst od displeja. Takže suma sumárum tlačidlo kde je k dispozícii len udalosť zatlačenia sa použiť nedá.

Riešením sú bitmapové obrázky, prvok typu Image. Upozorňujem na jednu vec. Prvok pre dotykové ovládanie musí reagovať na dotyk nejakou zmenou (farby, tvaru…) inak vám aplikáciu so Store neschvália.

Takže v mojom prípade XAML kód (pre prehľadnosť a úsporu miesta len pre jedno tlačidlo)

<Image x:Name=”imgUp”
Grid.Row=”0″ Grid.Column=”1″ Margin=”4″ Source=”Assets/gup.png” PointerPressed=”imgUp_PointerPressed” PointerReleased=”imgUp_PointerReleased” Loaded=”imgUp_Loaded”
/>

Obsluha udalostí

private void imgUp_PointerPressed(object sender, PointerRoutedEventArgs e)
{
  ZmenObrazokDotykovejKlavesy(sender as Image, “Assets/oup.png”);
  dotykUp();
 //obrazok zdvihnutej klavesy na ostatných
  ZmenObrazokDotykovejKlavesy(imageLeft, “Assets/gleft.png”);
  ZmenObrazokDotykovejKlavesy(imageRight, “Assets/gright.png”);
  ZmenObrazokDotykovejKlavesy(imageDown, “Assets/gdown.png”);
}

private void imgUp_PointerReleased(object sender, PointerRoutedEventArgs e)
{
  ZmenObrazokDotykovejKlavesy(sender as
   Image, “Assets/gup.png”);
   klav.dotykUpR();
}

Metóda dotykUp() je vlastne obsluha zatlačenia klávesu na klasickej klávesnici, ktorá nastavuje stavové premenné kláves

public void dotykUp() { up = true; down = false; left = false; right = false; }

V hre sa potom tieto premenné čítajú nasledovne

public void StavKlavesnice()
{
  if (space) { nAktualnaAkcia = AKCIA_HOD_HUBOU; }
  else if (up) { nAktualnaAkcia = SMER_HORE; nPredchadzajucaAkcia = SMER_HORE;}
  else if (down) { nAktualnaAkcia = SMER_DOLE; nPredchadzajucaAkcia = SMER_DOLE;}
  else if (left) { nAktualnaAkcia = SMER_VLAVO; nPredchadzajucaAkcia = SMER_VLAVO;}
  else if (right) { nAktualnaAkcia = SMER_VPRAVO; nPredchadzajucaAkcia = SMER_VPRAVO;}
  else if (esc) { nAktualnaAkcia = AKCIA_STORNO; }
  else if (nova) { nAktualnaAkcia = AKCIA_NOVASCENA; }
 else {nAktualnaAkcia = 0;}
}

Reklamy

Pridaj komentár

Zadajte svoje údaje, alebo kliknite na ikonu pre prihlásenie:

WordPress.com Logo

Na komentovanie používate váš WordPress.com účet. Odhlásiť sa / Zmeniť )

Twitter picture

Na komentovanie používate váš Twitter účet. Odhlásiť sa / Zmeniť )

Facebook photo

Na komentovanie používate váš Facebook účet. Odhlásiť sa / Zmeniť )

Google+ photo

Na komentovanie používate váš Google+ účet. Odhlásiť sa / Zmeniť )

Connecting to %s


%d bloggers like this: