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
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.

- Rejestracja:ponad 12 lat
- Ostatnio:4 miesiące
- Lokalizacja:SK
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.


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.


- Rejestracja:ponad 12 lat
- Ostatnio:ponad 4 lata
- Postów:2412
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

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

checkCollision
to zwykla globalna funkcja, nic wiecej.


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..

- Rejestracja:ponad 12 lat
- Ostatnio:ponad 4 lata
- Postów:2412
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.
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ć?

- Rejestracja:ponad 12 lat
- Ostatnio:ponad 4 lata
- Postów:2412
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.
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?
