{Allegro, C++} - Kolizje

{Allegro, C++} - Kolizje
0

Siema!
Mam problem. Robię sobie w Allegro 4.2.2 grę, w której biega się wojownikami i walczy mieczami. W końcu doszedłem do momentu, gdzie trzeba dodać życie wojownikom i tu moje pytanie: jak to zrobić?
Gra działa w ten sposób:
Biega się ludzikiem za pomocą strzałek lub W,A,S,D- i do tego mam zrobione dwie bitmapy, które przedstawiają ludzików w różnych pozycjach. Da się też atakować przeciwnika za pomocą klawiszy LEFT+L (RIGHT+L) lub A+SPACE (D+SPACE)- do tego mam zrobione oddzielne bitmapy, które przedstawiają ludzików w pozycji atakującej. (To, że da się atakować tylko jeśli jest zarówno wciśnięta strzałka i L lub A(D) i Spacja wynika z tego, że coś mi nie chciało to działać i dałem sobie z tym spokój postanawiając, że będzie się dało atakowac tylko w biegu.)
No i teraz najważniejsze: jak dodać życie? Próbowałem robić to za pomocą kolizji: gdy postacie atakujące się (czyli te z bitmapy "atakującej") wejdą na siebie to wtedy wyświetli się obrazek ze zmniejszoną ilością życia ale to nie działa, a poza tym obrazek wyświetla się tylko wtedy, gdy postacie są na sobie. Później znika.
Mógłby mi ktoś pomóc? Jakaś wskazówka, przykładowy kod, cokolwiek? Z góry dzięki :D

K5
Czyli kod na sprawdzanie kolizji ??
0

Niestety nadal nie działa. Ta funkcja jest podobna do tej którą miałem, a wzorowałem się na kodzie z Easykodera. Wrzuciłem cały projekt tutaj http://www25.zippyshare.com/v/14174780/file.html
Może wtedy będzie łatwiej Wam jakoś mi pomóc.
Sterowanie:
Ludzik z toporem- bieganie: WASD, atak: Spacja
Ludzik z mieczem- bieganie: Strzałki, atak: L

I chodzi o to żeby jak jeden drugiego zaatakuje to żeby ten rysunek z napisem pozostał na ekranie i np. skracał się z każdym uderzeniem. Póki co ten rysunek ma za zadanie symulować pasek z życiem :D.

dampe
  • Rejestracja:prawie 13 lat
  • Ostatnio:5 miesięcy
  • Lokalizacja:SK
1

Użyj wektorów (algebra, nie struktura danych) do obliczania odległości postaci. Jeżeli przy uderzeniu będzie ona wynosić mniej niż jakiś tam zasięg (promień), masz kolizję. Tyle, żadnych cudów na kiju w postaci kilkunastu/kilkudziesięciu if'ów.
Pasek energii powinien reprezentować energię postaci, a nie widzę byś miał tam pole je opisujące - odpowiednim update'owaniem (rysowaniem) pasku życia zajmujesz się osobno.


int main( int, char** ) try { throw std::logic_error( myCode() ); }
catch( const std::exception& e ) { puts( e.what() ); } ///:~
n0name_l
AABB jest skuteczny i wymaga w najgorzym wypadku sprawdzenia 4 warunkow, w najlepszym 1. Nie wiem czy odleglosc dwoch obiektow sie szybciej wykona niz te 4 warunki. Ale i tak plusik bo rozwiazanie jak na razie najlepsze z tych zamieszczonych w postach.
dampe
Wektory są uniwersalne. W łatwy sposób wyliczymy kąt i inne czynniki, które zmodyfikują siłę zadanego uderzenia. Co do wydajności, to wektory chyba wypadną gorzej. Natomiast z punktu przejrzystości kodu zdecydowanie lepiej :]
0

A jak korzystać z AABB? Szukałem w necie dosyć długo i nie za wiele znalazłem. Nie wiem w ogóle o co chodzi z tym. To jest jakaś wbudowana funkcja czy trzeba ją sobie stworzyć? Proszę o jakiś przykładowy kawałek kodu pokazujący jak to mniej więcej działa i jakieś wyjaśnienie, jeśli można. Może też być jakiś artykuł z Internetu, może ominąłem coś, nie wiem.

_13th_Dragon
Wklejałem już tu - jakiś kretyn postawił minusa, więc usunąłem.
n0name_l
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 4 lata
  • Postów:2412
0

To co wrzucilem jakis czas temu w tym temacie: http://ideone.com/Lo4AGS.
Wyjasnienie o co w tym wszystkim chodzi po polsku: http://pl.wikipedia.org/wiki/Bry%C5%82a_brzegowa
Tutorial jak z tego korzystac po angielsku: http://www.opentk.com/node/869

n0name_l
ad: Teraz dopiero zauwazylem, ze po polsku jest dosc sporo materialow na ten temat, wiec pozostaje poszukac "AABB kolizje", "AABB gamedev", etc, etc.
0
Kopiuj
struct Position
{
    int x;
    int y;
};
 
class AABB
{
public:
    AABB(Position min, Position max):
        min(min),
        max(max)
    {
        ;
    }
 
    friend bool checkCollision(const AABB& first, const AABB& second)
    {
        return (!(first.min.x > second.max.x || first.min.y > second.max.y ||
                  first.max.x < second.min.x || first.max.y < second.min.y));
    }
    
private:
    Position min;
    Position max;
}; 

Trochę mi głupio pytać ale cóż, w końcu kto pyta nie błądzi :D. Mam kilka pytań co do tego kodu:
1. Czemu tu pomiędzy klamrami jest sam ";"?

Kopiuj
AABB(Position min, Position max):
        min(min),
        max(max)
    {
        ;
    }

2. Co wpisać w miejsce

Kopiuj
first

oraz second

Kopiuj
**3.** No i w końcu jak tego użyć? :)
n0name_l
1. Wizja artystyczna, 2. Nie wiem o co pytasz, najlepiej nie modyfikuj tego, 3. Tak samo jak kazdej innej funkcji przyjmujacej referencje do obiektu. To checkCollision to zwykla globalna funkcja, nic wiecej.
Patryk27
@n0name: a nie raczej "metoda"? ;P
n0name_l
Nie, zwykla globalna funkcja zaprzyjazniona z klasa, dlatego tez odwoluje sie do niej jak do globalnej funkcji, patrz 2x post nizej. Metoda by byla jakby tam nie bylo friend
0

Czyli chcąc użyć tej funkcji, muszę w miejsce first i secnod wstawić nazwy bitmap, które mają typ AABB, tak? I jeszcze muszę nadać tym bitmapom typu AABB wartości x i y, tak? Czyli żeby użyć tej funkcji muszę najpierw stworzyć sobie takie zminne?:

Kopiuj
AABB rzymianin;
AABB rycerz;
rzymianin.x = 800
rzymianin.y = 100
rycerz.x = 100
rycerz.y = 100

I teraz żeby użyć tej funkcji, musze napisać coś takiego?:

Kopiuj
checkCollision(rzymianin, rycerz);

Nie, na pewno nie. Coś mi tu nie pasuje. Chyba..

n0name_l
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 4 lata
  • Postów:2412
0

Ekhm...

Kopiuj
int main()
{
    AABB rzymianin({10, 10}, {30, 30});
    AABB dupanierzymianin({25, 25}, {40, 40});
    checkCollision(rzymianin, dupanierzymianin);
    return 0;
}

Zanim zadasz nastepne tego typu pytanie, polecam choc przeczytac to z czego chce sie korzystac.

0

No dobra. Mam jeszcze jedno pytanie. Co zrobić żeby po nastąpieniu kolizji wyświetliło bitmapę i żeby ona była cały czas wyświetlana? No bo jeśli dam warunek i napiszę, że jeśli nastąpi kolizja to wyświetl bitmapę to ta bitmapa zostaje wyświetlona tylko podczas kolizji. Gdy te dwa ludziki zejdą z siebie to bitmapa przestaje być wyświetlana. Próbowałem zrobić coś takiego:

Kopiuj
if(nastąpi kolizja)
{
    while(1)
    {
        wyświetlaj bitmapę;
    }
}

Ale po pierwsze to nie działa, bo program się zawiesza, a po drugie to w ogóle to nie powinno tak wyglądać. Co zrobić?

n0name_l
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 4 lata
  • Postów:2412
0

Czemu nie siegniesz do znanej i lubianej literatury, skoro nie masz zielonego pojecia o tym jak gra ma chociazby wygladac?
http://lazyfoo.net/articles/article04/index.php <- Podzial gry na "czesci" i petla glowna.

0
n0name_l napisał(a):

Czemu nie siegniesz do znanej i lubianej literatury, skoro nie masz zielonego pojecia o tym jak gra ma chociazby wygladac?
http://lazyfoo.net/articles/article04/index.php <- Podzial gry na "czesci" i petla glowna.
A jaki to, co napisałeś ma zwiążek z pytaniem które zadałem?

n0name_l
Skoro twierdzisz, ze nie ma to napisz jeszcze raz jasno i prosto o co chodzi, bo najwidoczniej nie zrozumialem.
0

Zapytałem co zrobić żeby po wykryciu kolizji program wyswietlił bitmapę na stałe, czyli żeby nie znikała po tym jak postacie zejdą z siebie.

n0name_l
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 4 lata
  • Postów:2412
0

Ustaw flage informujaca o tym czy wyswietlac ta bitmape, czy nie, np.

Kopiuj
bool isVisible = false;
// ...
// ....

checkCollision()
{
	if(true)
		isVisible = true;
}

// ...
// ...

render()
{
	if(isVisible)
		renderBitmap();
}

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.