LINUXSOFT.cz Přeskoč levou lištu
Uživatel: Heslo:  
   CZUKPL

> Qt framework - qt_tetris(2)

Další díl při tvorbě naší hry nás zavede do problematiky tvorby enginu pro kreslení jednotlivých hracích kostiček a celé logiky v hracím poli.

16.6.2010 00:00 | Martin Chudoba | Články autora | přečteno 6548×

Virtuální hrací pole

V minulém díle jsme si založili structuru sGAME_FIELD a její proměnnou l_gameField, která představuje naše virtuální pole. Každá kostička v tomto poli obsahuje třídu pro kostičku a může mít celkem tři stavy. Buď zde nic není a tím pádem bude s_Sprite roven NULL, obsahuje kostičku s_Sprite a ta se buď pohybuje nebo je „skamenělá“. Tedy proměnná l_status označuje existenci kostičky a l_isFixed její pohyblivost. Pole si je možné představit jako takovou neviditelnou šachovnici.

Jaká bude další kostička

V našem boxu Další si vygenerujeme novou kostičku. Nejdříve si do konstruktoru vytvoříme náhodné generování:

qsrand(time(NULL)); l_currentType = (qrand() % 8)+1; l_nextType = (qrand() % 8)+1;

Tím zajistíme, že náš program ví, kterou kostičkou má hra začínat a jakou vypustí jako následující (generování je náhodné). Jednoduše budeme generovat čísla od 1 – 8 a každé znich představuje určitý typ kostičky (já jsem zvolil pro příklad 8 kostiček). Vytvoříme novou metodu v tetris.cpp pro vykreslování našich náhodných kostiček:

void CTetris::paintNextSprite(QPainter* a_painter) { if (l_isStart) { switch(l_nextType) { case 1: l_GameField->DrawSprite1(a_painter); break; case 2: l_GameField->DrawSprite2(a_painter); break; case 3: l_GameField->DrawSprite3(a_painter); break; case 4: l_GameField->DrawSprite4(a_painter); break; case 5: l_GameField->DrawSprite5(a_painter); break; case 6: l_GameField->DrawSprite6(a_painter); break; case 7: l_GameField->DrawSprite7(a_painter); break; case 8: l_GameField->DrawSprite8(a_painter); break; } } }

Tado metoda vždy vykreslí do našeho okna kostičku, která bude následovat hned jak dopadne aktuální pohyblivá kostička (všechny políčka v hracím poli nabydou hodnoty l_isFixed = true). Dále si vytvoříme do projektu novou třídu představující jednu kostičku, pojmenovanou CCube. Třída by mohla vypadat takto:

#ifndef CUBE_H #define CUBE_H #include #include #include #define WIDTH 30 #define HEIGHT 30 #define WIDTH_PREV 20 #define HEIGHT_PREV 20 class CCube { public: CCube(); void Draw(QPainter* painter); void DrawReal(QPainter* painter); void setPozition(int a_x, int a_y); void setColor(int r, int g, int b); void autoMove(); void moveLeft(); void moveRight(); QPoint getPos(); QColor getColor(); protected: int l_x; int l_y; QColor l_color; }; #endif // CUBE_H

Třída nám vykreslí jednu kostičku do hracího pole metodou DrawReal, tak i kostičku do pozice následující hrací kostičky metodou Draw. Metody pak budou vypadat takto:

void CCube::Draw(QPainter* painter) { painter->setPen(l_color); painter->fillRect(l_x, l_y, WIDTH_PREV, HEIGHT_PREV, l_color); QRectF rectangle(l_x, l_y, WIDTH_PREV, HEIGHT_PREV); painter->drawRect(rectangle); } void CCube::DrawReal(QPainter* painter) { painter->setPen(l_color); painter->fillRect(l_x, l_y, WIDTH, HEIGHT, l_color); QRectF rectangle(l_x, l_y, WIDTH, HEIGHT); painter->drawRect(rectangle); }

Metoda by šla udělat pouze jedna s dalším parametrem. Možností je více. Můžete si zkusit různé experimenty. Důležeté je povšimnout si praktického využití knihovny Qt4. V našich dvouch metodách jsme využili metodu pro nastavení barvy setPen (pro okraje) a pro vyplnění pozadí naší kostičky fillRect. A konečně sama metoda pro vykreslování 4 úhelníků drawRect s parametrem QRectF pro určení souřadnic. Další metody naší třídy:
  • setPozition – nastaví aktuální pozici
  • setColor – nastaví aktuální barvu
  • autoMove – automaticky nastaví pohyb směrem dolů
  • moveLeft – pohyb vlevo
  • moveRight – pohyb vpravo
  • getPos – vrací aktuální pozici
  • getColor – vrací aktuální barvu
Implementaci těchto metod si můžete vyzkoušet sami nebo si ji můžete stáhnout v příkladu. V třídě hracího pole CGameField si vytvoříme metody pro inicializaci „preview“ kostiček:

//Inicializacni metody //----------------------- void InitSprite1(void); void InitSprite2(void); void InitSprite3(void); void InitSprite4(void); void InitSprite5(void); void InitSprite6(void); void InitSprite7(void); void InitSprite8(void);

Impementace by pak mohla být třeba takto:

void CGameField::InitSprite2(void) { CCube* a_sprite = new CCube; a_sprite->setColor(255, 0, 0); a_sprite->setPozition(55, 130); CCube* a_sprite2 = new CCube; a_sprite2->setColor(255, 0, 0); a_sprite2->setPozition(75, 130); CCube* a_sprite3 = new CCube; a_sprite3->setColor(255, 0, 0); a_sprite3->setPozition(55, 110); CCube* a_sprite4 = new CCube; a_sprite4->setColor(255, 0, 0); a_sprite4->setPozition(75, 110); l_Sprite2.push_back(a_sprite); l_Sprite2.push_back(a_sprite2); l_Sprite2.push_back(a_sprite3); l_Sprite2.push_back(a_sprite4); }

Toto například bude velká kostička tvořená čtyřmi menšími kostičkami. Každé části se nastaví pozice a barva jak je patrné z příkladu. Dále přidáme v tetris.cpp k metodě void CTetris::paintEvent(QPaintEvent *event) řádek paintNextSprite(&a_painter). Tím jsme si zajistili, že se nám vykreslí vždy následující kostičky vždy, když spustíme hru tlačítkem start. Aktivace tlačítka start Vytvoříme si metodu pro stisk tlačítka Start.

void CTetris::on_pushButton_clicked() { l_GameField->Reset(); ui->pushButton->setEnabled(false); l_isStart = true; l_GameField->AddNewSprite(l_currentType); //l_currentType repaint(); l_timer = startTimer(100); }

Po stisku provedeme metodu Reset hracího pole (pokud začínáme hru po skončení předchozí hry je potřeba resetovat hrací pole). Tlačítko Start deaktivujeme. Nastavíme proměnnou indikující zda je hra v běhu na hodnotu true. Metodou AddNewSprite (implementujeme si v dalším díle) si vložíme hrací kostku (podle náhodně vygenerované l_currentType). Provedeme překreslení našeho okna metodou repaint. A nakonec spustíme smyčku Timer (se 100ms). Implementace Reset metody pole bude vypadat následovně:

void CGameField::Reset(void) { for (int x = 9; x >= 0; x--) { for (int y = 0; y < 17; y++) { l_gameField[x][y].l_isFixed = false; l_gameField[x][y].l_status = 0; delete l_gameField[x][y].s_Sprite; l_gameField[x][y].s_Sprite = new CCube; } } l_isMoved = false; }

Timer smyčka se pak definuje takto:

void CTetris::timerEvent(QTimerEvent *event) { repaint(); }

Závěr

Máme již hotové hrací pole a víme jaká bude vždy následovat kostička. Příště si doděláme engine pro vykreslení hracích kostiček, uděláme metodu pro testování zda došlo ke kolizi, metodu pro test zda je plná řada a plné řady necháme zmizet. Ukážeme si algoritmu co nám zajistí posunutí „zkamenělin“ po odstranění plné řady. A aktivujeme si klávesnici pro ovládání kostiček.

Verze pro tisk

pridej.cz

 

DISKUZE

Nejsou žádné diskuzní příspěvky u dané položky.



Příspívat do diskuze mohou pouze registrovaní uživatelé.
> Vyhledávání software
> Vyhledávání článků

14.11.2017 16:56 /František Kučera
Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Zajímá tě DIY, CNC, SDR nebo morseovka? Přijď na sraz spolku OpenAlt – tradičně první čtvrtek před třetím pátkem v měsíci: 16. listopadu od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5).
Přidat komentář

12.11.2017 11:06 /Redakce Linuxsoft.cz
PR: 4. ročník odborné IT konference na téma Datová centra pro business proběhne již ve čtvrtek 23. listopadu 2017 v konferenčním centru Vavruška, v paláci Charitas, Karlovo náměstí 5, Praha 2 (u metra Karlovo náměstí) od 9:00. Konference o návrhu, budování, správě a efektivním využívání datových center nabídne odpovědi na aktuální a často řešené otázky, např Jaké jsou aktuální trendy v oblasti datových center a jak je využít pro vlastní prospěch? Jak zajistit pro firmu či jinou organizaci odpovídající služby datových center? Podle jakých kritérií vybrat dodavatele služeb? Jak volit součásti infrastruktury při budování či rozšiřování vlastního datového centra? Jak efektivně spravovat datové centrum? Jak eliminovat možná rizika? apod.
Přidat komentář

13.9.2017 8:00 /František Kučera
Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Zajímá tě DIY, CNC, SDR nebo morseovka? Přijď na sraz spolku OpenAlt – tentokrát netradičně v pondělí: 18. září od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5).
Přidat komentář

3.9.2017 20:45 /Redakce Linuxsoft.cz
PR: Dne 21. září 2017 proběhne v Praze konference "Mobilní řešení pro business". Hlavní tématy konference budou: nejnovější trendy v oblasti mobilních řešení pro firmy, efektivní využití mobilních zařízení, bezpečnostní rizika a řešení pro jejich omezení, správa mobilních zařízení ve firmách a další.
Přidat komentář

15.5.2017 23:50 /František Kučera
Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Zajímá tě DIY, CNC, SDR nebo morseovka? Přijď na sraz spolku OpenAlt, který se bude konat ve čtvrtek 18. května od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5).
Přidat komentář

12.5.2017 16:42 /Honza Javorek
PyCon CZ, česká konference o programovacím jazyce Python, se po dvou úspěšných ročnících v Brně bude letos konat v Praze, a to 8. až 10. června. Na konferenci letos zavítá např. i Armin Ronacher, známý především jako autor frameworku Flask, šablon Jinja2/Twig, a dalších projektů. Těšit se můžete na přednášky o datové analytice, tvorbě webu, testování, tvorbě API, učení a mentorování programování, přednášky o rozvoji komunity, o použití Pythonu ve vědě nebo k ovládání nejrůznějších zařízení (MicroPython). Na vlastní prsty si můžete na workshopech vyzkoušet postavit Pythonem ovládaného robota, naučit se učit šestileté děti programovat, efektivně testovat nebo si v Pythonu pohrát s kartografickým materiálem. Kupujte lístky, dokud jsou.
Přidat komentář

2.5.2017 9:20 /Eva Rázgová
Putovní konference československé Drupal komunity "DrupalCamp Československo" se tentokrát koná 27. 5.2017 na VUT FIT v Brně. Můžete načerpat a vyměnit si zkušenosti z oblasti Drupalu 7 a 8, UX, SEO, managementu týmového vývoje, využití Dockeru pro Drupal a dalších. Vítáni jsou nováčci i experti. Akci pořádají Slovenská Drupal Asociácia a česká Asociace pro Drupal. Registrace na webu .
Přidat komentář

1.5.2017 20:31 /Pavel `Goldenfish' Kysilka
PR: 25.5.2017 proběhne v Praze konference na téma Firemní informační systémy. Hlavními tématy jsou: Informační systémy s vlastní inteligencí, efektivní práce s dokumenty, mobilní přístup k datům nebo využívání cloudu.
Přidat komentář

   Více ...   Přidat zprávičku

> Poslední diskuze

15.12.2017 15:11 / Petit
freehold nj

15.12.2017 15:06 / Petit
nj freehold

5.12.2017 11:50 / Thomas
kitchen renovations

18.9.2017 14:37 / Rojas
high security vault

15.9.2017 7:33 / Wilson
new zealand childcare jobs

Více ...

ISSN 1801-3805 | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2017) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze