[c++] allegro i ustrzelenie obiektu

0

Piszę w dev-cpp z biblioteką allegro prostą strzelankę, w której na środku ekranu jest celownik i trzeba strzelać do poruszających się obiektów. Utknąłem właśnie na strzelaniu.

Obiekty na ekranie są dosyć nieregularne, nie mają prostokątnych kształtów, wykrywam że gracz nacisnął spust i musze sprawdzić czy trafił w coś.

Na pewno nie da się tego zrobić wykrywając kolor piksela nad którym jest celownik, bo obiekty i tło nie maja jednolitego kształtu.

Mój drugi pomysł jest bardziej sensowny ale trudny w realizacji a mianowicie:
Wykryć ze użytkownik trafił w prostokąt w którym znajduje się obiekt (proste - dwa if'y). A w dwuwymiarowej tablicy przechowywać coś na zasadzie mapy bitowej

000111111111000
001111111111100
001111111111100
000111111111000
000011111110000

i jak w konkretnej komórce było 1 to gracz trafił. Jednak tutaj trudne było by stworzenie takiej tablicy, a poza tym takie rozwiązanie mogło by być zbyt "obliczeniożerne"....

Czy ktoś ma inny pomysł?

0

jeżeli obiektów nie jest przesadnie dużo to możesz je <ort>po prostu</ort> podzielić na kilka wielokątów...

0

jeżeli obiektów nie jest przesadnie dużo to możesz je po prostu podzielić na kilka wielokątów...

Po pierwsze są to baloniki, które nie wiem jak by można podzielić na mniejesze wielkokąty (po prostu nie da rady). Po drugie w tym problem ze obiektów na ekranie moze być bardzo dużo, a allegro pod windowsem jest mało wydajne i zbytnie komplikowanie kodu może uczynić wymaganie sprzetowe mojej gry śmiesznie dużymi :/

0

Połącz obie techniki. Najpierw wykrywasz czy kolizja może w ogóle zajść na prostokątach opisanych na obiektach, a następnie jeżeli prostokąty celownika i balonika zachodzą na siebie to sprawdzasz już konkretnie pixele, oczywiście przez maski (czyli te 1 tam gdzie jest pixel obiektu). Sprawdzisz najwyżej tyle obiektów ile jest wokół celownika, a nie wszystkie. Dodatkowo można jeszcze bardziej podzielić obiekt na prostokąty (np. na 4, 2x2) i sprawdzać najpierw duży opisujący prostokąt, a jeśli kolizja jest to sprawdzić najwyżej 4 mniejsze... Można tak oczywiście robić dalej - każdy znowu na 4, itd.
Poczytaj coś o programowaniu gier 2D.
[A Allegro nie ma wykrywania kolizji czasem?]

0

to sprawdzasz już konkretnie pixele, oczywiście przez maski (czyli te 1 tam gdzie jest pixel obiektu).

ale jak ? :|

Poczytaj coś o programowaniu gier 2D.
[A Allegro nie ma wykrywania kolizji czasem?]

O grach 2D troche czytałem, a co do wykrywania kolizji w allegro to nie wiem, nie znam takiej funkcji :/.

0

skoro to mają być baloniki to możesz użyć sposobu linia->elipsa(okrąg)

0

Dziękuje marcinEc, twój link do forum mnie naporwadził na prawidłowy trop, zrobie tak...

if(hipotetyczny_strzal())
{
if(hipotetycznie_miesci_sie_w_jednym_z_prostokatow())
{
tmp = getpixel(bitmapa, x, y);
if(tmp != 63519) //63519 to kolor przezroczysty w allegro czyli 255,0,255
hiptetyczna_funkcja_trafiony();
}
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1