{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

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.

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.

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.

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

0
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 ";"?

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

2. Co wpisać w miejsce

first

oraz second

**3.** No i w końcu jak tego użyć? :)
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?:

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?:

checkCollision(rzymianin, rycerz);

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

0

Ekhm...

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:

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ć?

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?

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.

0

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

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

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

// ...
// ...

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

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