Gra sterowana kamerą - pomaluj płot
19.05.2013 - Filip Mróz
Drugi graczPora wprowadzić do gry drugą osobę. Okaże się to dość proste, ponieważ nie zakładamy między graczami dużej interakcji. Z grubsza wystarczy zdublować wszystkie wykonane wcześniej czynności.
Zaczniemy od przystosowania protected: () int _liczbaGraczy; public: StanGracza gracze[2];
Ustalmy liczbę graczy w metodzie _graTrwa = true; _liczbaGraczy = gracze[1].nazwa.size() != 0 ? 2 : 1; }
Chcemy pionowo podzielić ekran na dwie części i kazać obydwu graczom pracować tylko nad jego kawałkiem. Ponieważ metody klasy protected: Mat oknoGracza1(Mat obraz); Mat oknoGracza2(Mat obraz); Okno gracza pierwszego będzie, w zależności od liczby graczy, całym ekranem lub lewą połówką, drugi gracz to zawsze prawa połowa: Mat StanGry::oknoGracza1(Mat obraz) { if(_liczbaGraczy == 1) return obraz; else return Mat(obraz,Range(0,obraz.rows),Range(0,obraz.cols/2)); } Mat StanGry::oknoGracza2(Mat obraz) { return Mat(obraz,Range(0,obraz.rows),Range(obraz.cols/2,obraz.cols)); }
Musimy teraz poprawić większość metod klasy gracze[0].uaktualnijStanGracza(_pozostalyCzasGry - nowyPozostalyCzasGry,oknoGracza1(obraz)); if(_liczbaGraczy==2) gracze[1].uaktualnijStanGracza(_pozostalyCzasGry - nowyPozostalyCzasGry,oknoGracza2(obraz)); gracze[0].wyswietlStanGracza(oknoGracza1(gdzie)); if(_liczbaGraczy==2) gracze[1].wyswietlStanGracza(oknoGracza2(gdzie)); Uzytki::dodajWpisDoWynikow(gracze[0].nazwa,gracze[0].stanMalowania.wyznaczPomalowanaCzesc()); if(_liczbaGraczy==2) Uzytki::dodajWpisDoWynikow(gracze[1].nazwa,gracze[1].stanMalowania.wyznaczPomalowanaCzesc()); Kilkanaście linii i już udało nam się dostosować mechanikę gry do istnienia dwóch graczy. Pozostaje nam dopisać wczytywanie obu imion oraz wybór pędzla drugiego gracza. Na początku programu zapytamy o liczbę graczy i wczytamy ich imiona: int liczbaGraczy; printf("Podaj liczbe graczy (1 lub 2): "); scanf("%d",&liczbaGraczy); if(liczbaGraczy!=1 && liczbaGraczy !=2) { printf("Podano nieprawidlowa liczbe graczy (tylko 1 albo 2)."); getchar(); return -1; } char imionaGraczy[2][100]; for(int i=0;i<liczbaGraczy;i++) { printf("Podaj imie gracza %d: ",i+1); scanf("%s", imionaGraczy[i]); stanGry.gracze[i].nazwa = imionaGraczy[i]; } #ifdef _WIN32
Teraz musimy dodać kalibrację pędzla drugiego gracza. Aby uniknąć kopiowania dużego kawałka kodu, przeniesiemy istniejącą pętlę kalibracyjną do funkcji void kalibrujPedzelGracza(StanGracza &gracz) { kamera >> aktualnyObraz; flip(aktualnyObraz,aktualnyObraz,1); aktualnyObraz.copyTo(wyswietlanyObraz); Uzytki::wypiszTekst(wyswietlanyObraz, gracz.nazwa + "! Wybierz pedzel!",Point(0,25)); wyswietlZachowujacProporcje(wyswietlanyObraz); waitKey(3000); while(waitKey(100)!=' ') { kamera >> aktualnyObraz; aktualnyObraz.copyTo(wyswietlanyObraz); Rect polozenieOkna = Rect(aktualnyObraz.cols/2-ROZMIAR_OKNA_KALIBRACJI,aktualnyObraz.rows/2-ROZMIAR_OKNA_KALIBRACJI,ROZMIAR_OKNA_KALIBRACJI,ROZMIAR_OKNA_KALIBRACJI); Mat okno = Mat(aktualnyObraz,polozenieOkna); gracz.ustawParametryPedzla(okno); Mat pikselePedzla = gracz.stanMalowania.przetwarzanieObrazow.wybierzPiksele(aktualnyObraz); wyswietlanyObraz.setTo(Scalar(255,0,0),pikselePedzla); rectangle(wyswietlanyObraz,polozenieOkna,Scalar(0,255,0),3); wyswietlZachowujacProporcje(wyswietlanyObraz); int liczbaPikseliPedzlaOkno = countNonZero(Mat(pikselePedzla,polozenieOkna)); int liczbaPikseliPedzla = countNonZero(pikselePedzla); if(2*liczbaPikseliPedzlaOkno > liczbaPikseliPedzla) { break; } } } Wybór pędzli obydwu graczy za pomocą tej metody jest prosty: cvResizeWindow("Maluj plot!", screenX, screenY); kalibrujPedzelGracza(stanGry.gracze[0]); if(liczbaGraczy==2) kalibrujPedzelGracza(stanGry.gracze[1]); kamera >> aktualnyObraz; (2 ocen) |
Copyright © 2008-2010 Wrocławski Portal Informatyczny
design: rafalpolito.com