Jump to content

Archived

This topic is now archived and is closed to further replies.

SerwusX

(C++[allegro]) Gra w rzutki

Recommended Posts

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

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

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

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

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

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



  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...