SerwusX Posted May 28, 2011 Report Share Posted May 28, 2011 Proszę się nie przerażać, ale potrzebuję pomocy w napisaniu pomocy w napisaniu gry w rzutki. Chodzi o coś takiego: Rysuje się na ekranie o rozdzielczości 1280x1024 pięć, sześć kół o coraz mniejszym promieniu, wszystkie mają swój środek w w tym samym miejscu w centrum ekranu. Po górze ekranu tzn. przy górnej krawędzi jeździłaby tam i z powrotem taka kreska i jak kliknie się jakiś klawisz to zapisze się współrzędna x. Po lewej krawędzi ekranu to samo, tylko ta kreska jeździ w pionie. Te 2 współrzędne w zależności na którym okręgu by się znalazła daje nam punkty. Po 10 rzutach wynik jest sumowany i wyświetlany na ekranie. Żadne menu ani nic takiego nie jest wymagane. Ot, tylko ten program, kompilujesz i już jeżdżą te kreski. Muszę takie coś zrobić w allegro, tylko problem w tym, że zupełnie nie wiem jak się do tego zabrać. Byłbym wdzięczny za każdą pomoc. Umiałbym może narysować te koła na ekranie, ale nie wiem jak napisać te "jeżdżące kreski". Link to comment Share on other sites More sharing options...
wies.niak Posted May 28, 2011 Report Share Posted May 28, 2011 Gra to nieskończona pętla, nie? Więc przy każdym przejściu musisz rysować wszystko na ekran, jak również wykonywać różne obliczenia związane z tym, co wyświetlasz. Weźmy na tapetę kreskę poziomą. Dla przykładu, porusza się ona przez całą szerokość ekranu, więc od piksela 0 do 1279, w prawo lub w lewo oczywiście. W jakiejś zmiennej zapisujesz sobie aktualną pozycję kreski (na starcie 0) oraz kierunek poruszania. Załóżmy, że kreska ma się przesuwać o 1 piksel na 1/100 sekundy. Co za tym idzie, przy każdym przejściu pętli gry, pobierasz aktualny czas i porównujesz go z czasem poprzedniego przebiegu. Mając różnicę, z proporcji obliczasz o ile pikseli przesunęła się kreska (wynik ofkoz musisz zaokrąglić do całkowitej liczby). Mając poprzednią pozycję oraz kierunek ruchu "przesuwasz kreskę" zapisując sobie nową pozycję. Teraz jeszcze musisz sprawdzić, czy kreska doszła do krawędzi - jeśli tak, to trzeba przeliczyć odbicie oraz zmienić informację o kierunku ruchu. Kreska ma się zatrzymać po kliknięciu, a więc musisz dodatkowo zapisywać informację czy było kliknięcie. Jeśli było, to całe poprzednio opisane przeliczenia po prostu pomijasz - pozycja kreski się nie zmienia. Musisz też sprawdzać, czy było kolejne kliknięcie dla drugiej kreski - wtedy pewnie będziesz musiał zresetować położenie kresek i rozpocząć zabawę od nowa. Ogólnie rzecz biorąc nie jest to trudne. Zacznij od oprogramowania tego co potrafisz, a później można powalczyć dalej Link to comment Share on other sites More sharing options...
bartexsz Posted May 29, 2011 Report Share Posted May 29, 2011 Dla uproszczenia można nie robić nieskończonej pętli dla całej gry, ale tylko dla tych lini. w skrócie int wynik; pętla(10) { int x = 0, y = 0, wynik = 0; while(!naciśnięcie klawisza) { czyścisz ekran; rysujesz koła; rysujesz linie pionową na szerokości x i y z przedziału <0,1023>; x++; } while(!naciśnięcie klawisza) { czyścisz ekran; rysujesz koła; rysujesz linie pionową na x i y z przedziału <0,1023>; rysujesz linie poziomą na x z przedziału <0,1279> i y; y++ } sprawdzasz ile punktów dla tego zestawu x, y; wynik += punkty; } wyświetlasz liczbe punktów. linie pionową rysujesz: vline(bitmapa na której rysujesz, x, y początkowe, y końcowe, kolor ); poziomą: hline(bitmapa, x1, y, x2, kolor); Poucz się o pętlach głównych gier. Polecam książke game programming all in one by Jonathan Harbour , third edition. Link to comment Share on other sites More sharing options...
SerwusX Posted May 31, 2011 Author Report Share Posted May 31, 2011 I te kreski będą jeździły? Link to comment Share on other sites More sharing options...
bartexsz Posted June 1, 2011 Report Share Posted June 1, 2011 Tak, przecież po każdym narysowaniu zmieniasz współrzędne kreski. Musisz jeszcze tylko zrobić, aby kreska po wyjściu za ekran wracała na góre/lewo. Link to comment Share on other sites More sharing options...
SerwusX Posted June 1, 2011 Author Report Share Posted June 1, 2011 Chcę żeby wynik był zależny od pola i mam takie coś: if(x>=637 && x<=643 && y>=509 && y>=515) Jaki powinien być kolejny warunek, żeby ująć same takie koło o promieniu 3? Bo jeśli spełnione zostaną tylko powyższe warunki, to program weźmie pod uwagę kwadrat o boku 6, a ja chcę koło. EDIT: Jak wyświetlić tekst na ekranie? Chodzi mi o wyświetlanie tekstu jakiegoś, ale w takim sensie: "Twój wynik to: "i tu się wpisuje wartość zmiennej np. wynik. Jak to się robiło? Wiedziałem, nie pamiętam; szukałem, nie znalazłem... Link to comment Share on other sites More sharing options...
bartexsz Posted June 1, 2011 Report Share Posted June 1, 2011 na alleg.sourceforge.net masz dokumentacje całej biblioteki. Najlepsze będzie wyświetlenie tekstu sformatowanego. nie pamiętam teraz nazwy niestety Co do sprawdzania w którym kółkó, polecałbym funkcje getpixel i przejechanie nią ekranu na całej wysokości y od lewej do punltu trafienia.liczysz ile razy będzie kolor kółka . jesli wychodzi wiecej niz jest kółek to od wyniku podejmujesz liczne kółek. Link to comment Share on other sites More sharing options...
SerwusX Posted June 3, 2011 Author Report Share Posted June 3, 2011 Na tej stronie znalazłem takie coś: void draw_explosion_ring(BITMAP *bmp, int x, int y, int d) { ... } do_circle(screen, SCREEN_W/2, SCREEN_H/2, SCREEN_H/16, flame_color, draw_explosion_ring); http://www.liballeg.org/stabledocs/en//all....html#do_circle I jak tego użyć? Link to comment Share on other sites More sharing options...
SerwusX Posted June 4, 2011 Author Report Share Posted June 4, 2011 To cały kod mojej gry: #include <allegro.h> BITMAP *buffer; int x = 0, y = 0, punkty = 0, wynik = 0; int a = 400, b = 380, c = 300, d = 250, e = 100, f = 50, g = 15, h = 3; void game(){ for (int i = 0; i <= 10; i++) { while(!key[KEY_SPACE]) { release_screen(); circlefill ( buffer, 500, 500, a, makecol( 0, 100, 0)); circlefill ( buffer, 500, 500, b, makecol( 255, 0, 0)); circlefill ( buffer, 500, 500, c, makecol( 70, 130, 180)); circlefill ( buffer, 500, 500, d, makecol( 255, 0, 0)); circlefill ( buffer, 500, 500, e, makecol( 70, 130, 180)); circlefill ( buffer, 500, 500, f, makecol( 0, 0, 0)); circlefill ( buffer, 500, 500, g, makecol( 255, 255, 255)); circlefill ( buffer, 500, 500, h, makecol( 255, 255, 255)); line(buffer, x, 0, x, 1280, makecol (255, 0 ,0)); //rysujesz linie pionową na szerokości x i y z przedziału <0,1023>; x++; if(x>1280) {x=0;} } while(!key[KEY_SPACE]) { release_screen(); circlefill ( buffer, 500, 500, 430, makecol( 0, 100, 0)); circlefill ( buffer, 500, 500, 400, makecol( 255, 0, 0)); circlefill ( buffer, 500, 500, 300, makecol( 70, 130, 180)); circlefill ( buffer, 500, 500, 250, makecol( 255, 0, 0)); circlefill ( buffer, 500, 500, 100, makecol( 70, 130, 180)); circlefill ( buffer, 500, 500, 50, makecol( 0, 0, 0)); circlefill ( buffer, 500, 500, 15, makecol( 255, 255, 255)); line(buffer, x, 0, x, 1280, makecol (255, 0 ,0)); line(buffer, 0, y, 1024, y, makecol (255, 0 ,0)); //rysujesz linie pionową na x i y z przedziału <0,1023>; //rysujesz linie poziomą na x z przedziału <0,1279> i y; y++; if(y>1024) {y=0;} } if(x>=637 && x<=643 && y>=509 && y>=515) {wynik+100;} //sprawdzasz ile punktów dla tego zestawu x, y; //wynik += punkty; } textout_ex( screen, font, "Your score: ", 320, 240, makecol(0, 0, 255), makecol(0, 0, 0)); //textprintf_ex( buffer, font, 10, 10, makecol( 200, 200, 200 ), "%s", wynik.c_str() ); //textout_ex(screen, font, "Q"<<wynik, 10, 100, makecol(225,200,200), 0) ; //textout_ex( screen, font, "Your score: "<<wynik, 10, 10, makecol( 255, 80, 0), makecol( 50, 50, 50) ); //linie pionową rysujesz: //vline(bitmapa na której rysujesz, x, y początkowe, y końcowe, kolor ); //poziomą: //hline(bitmapa, x1, y, x2, kolor); } int main(){ allegro_init(); install_keyboard(); set_color_depth(16); set_gfx_mode( GFX_AUTODETECT, 1280, 1024, 0, 0); buffer = create_bitmap( 1280, 1024); while( !key[KEY_ESC]){ game(); } return 0; } END_OF_MAIN(); Chcę, żeby textout_ex( screen, font, "Your score: ", 320, 240, makecol(0, 0, 255), makecol(0, 0, 0)); wyświetlało jeszcze wartość zmiennej wynik. Jak to zrobić i jeszcze jak do warunku wpisać, żeby brano pod uwagę pole koła? Link to comment Share on other sites More sharing options...