Hra na grafický displej

Václav Halbich

Obsah

  1. Úvod
  2. Realizace
  3. Ukázky kódu
  4. Závěr
  5. Soubory

Úvod

Projekt je řešením hry na grafickém displeji s názvem Proleť meteory. Účelem hry je vyhíbat se, či případně sestřelit přilétající meteority a udržet se ve hře co nejdýl. Loď má tři životy a meteory se neustále zrychlují. Ovládání je řešeno pomocí tří tlačítek maticové klávesnice. Jsou to tlačítka pro pohyb doleva, doprava a pro střelbu. Při každém střetnutí lodě s meteoritem přichází hráč o jeden život, nicméně meteory při pokračování zůstávají ve stejné rychlosti jako při střetnutí a neustále zrychlují.

Realizace

Realizace proběhla na vývojové desce pro ATmega16 vyrobené na ústavu radioelektroniky na FEKT VUT. Grafický displej je také zapůjčen od tohoto ústavu a byly pro něj použity již hotové knihovny ks0108.h, avrlcd.h, avrlcd_fonts.h a font.h. Displej je rozdělen na dvě části, vpravo na větší části je samotná hra a vlevo na menší části je počet životů. Pro nezávislé mazání obou částí, byla upravena funkce v ks0108.h. Nejprve byly vytvořeny funkce pro loď, meteor a střelu. Meteor se generuje vždy na náhodném místě. Tato náhodnost je zajištěna pomocí generátoru pseudonáhodných čísel z knihovny stdlib.h. U střely bylo potřeba ošetřit, aby nekopírovala neustále polohu lodi, řízená střela by byla pro tuto hru nežádoucí. Proto byl zaveden příznakový byte, flag, který rozhoduje také o tom jestli byl meteor sesřelen, nebo jestli trefil loď a má se dekremento vat život. V případě ztráty všech tří životů je oznámena prohra a hráč se může pomocí stisku střely vrátit opět na start. Drobnou vadou hratelnosti může být fakt, že hra díky neustálému zrychlování nejde nikdy vyhrát, takže účelem hry a případného soupeření je udržet se co nejdéle. Níže jsou uvedeny ukázky kódu pro loď, meteor, střelu, zásah a kontakt lodě s meteorem.

Ukázky kódu

void lod(void)
{
  rectangle(xlod-1,57,xlod+1,62,CL_BLACK);
  rectangle(xlod-3,60,xlod+3,62,CL_BLACK);
  ks0108SetDot(xlod-3, 59, CL_BLACK);
  ks0108SetDot(xlod+3, 59, CL_BLACK);
}

void meteor(void)
{
  if(ymet>57)
  {
    xmet = rand()/520; //generovani nahodneho mista objevu meteoru
    ymet = 3;
  }
  else ymet=ymet+1+zrych;

  fillrect(xmet-3, ymet-3, xmet+3, ymet+3, CL_BLACK, CL_BLACK);
  circle(xmet, ymet, 4, CL_BLACK);
}

void strela(int x) //x je atkualni umisteni lodi
{
  if(strilet == 1) //reakce na zmacknuti tlacitka strilet
  {
    xstr = x;
    flag = 2; //prehozeni do pozice, kdy se bude ignorovat poloha lodi
    if(ystr==2) //pri dojeti na konec obrazovky reset strely
    {
      strilet = 0;
      ystr = 60;
      flag = 1;
    }
    else ystr--;

    rectangle(xstr-1, ystr-2, xstr+1, ystr+2, CL_BLACK);
  }
}

void zasah(void)
{
  if(abs(xstr-xmet) < 4 & abs(ystr-ymet) < 5 ) //pokud se potka strela a meteor
  {
    ymet = 100;
    ystr = 60;
    strilet = 0;
    flag = 1; //opet se bude pro strelu zapisovat aktualni poloha lodi
  }
}

void kontakt(void)
{
  if(abs(xlod-xmet) < 10 & abs(60-ymet) < 5 ) //pokud se potka lod a meteor
  {
    flag = 3;
    ymet = 100;
    ystr = 60;
    strilet = 0;
  }
}

Závěr

V projektu byla naprogramovaná hratelná hra Proleť meteory na grafickém displeji. Hra nabízí pro dostatečně rychlého jedince v podstatě nekonečnou zábavu, protože jejím účelem je udržet se ve hře co nejdéle.

Soubory

Zdrojový kód