Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Allegro - Blokowanie ludka

Ostatnio zmodyfikowano 2011-04-12 19:10
Autor Wiadomość
Daavis
Temat założony przez niniejszego użytkownika
Allegro - Blokowanie ludka
» 2011-04-11 20:36:37
Więc od razu przejdę do rzeczy. Chodzi mi o to żeby ustalić co się będzie działo z ludkiem kiedy natrafi na ścianę.
Coś takiego:
ściana + ludek = block(nie da się przejść)
ludek + kolce = życie - 1
Jestem początkujący więc proszę o dokładny przykład i wyjaśnienie ;)

Z góry dziękuje i pozdrawiam Daavis .
P-30626
dmx81
» 2011-04-11 20:46:58
proponuje wziac do reki kartke w kratke i olowek - aby dobrze zrozumiec problem i samemu moc go w przyszlosci rozpisac, a nie uzywajac gotowego kodu.

a sytuacja bedzie wygladala tak:

ludek,sciana,klocek - zapewne bitmapy - prostokaty (w tym tekscie bitmapa - struktura zawierajaca obrazek)
kazda z bitmap ma swoje wspolrzedne x,y oraz szerokosc i wysokosc
teraz narysuj sobie rozne kombinacje polozen tych obiektow, a zauwazysz ze kolizja nastapi wtedy, gdy:
- ludek.x+ludek.szerokosc >sciana.x && ludek.x < sciana.x+sciana.szerokosc - zgadza sie?

jesli tak, to powinienes zauwazyc, ze ten warunek bedzie oznaczal kolizje, ale nie w kazdym przypadku.
powiedzmy, ze rzeczywiscie ludek przecina wspolrzedne x sciany, ale znajduje sie na calkiem innej wysokosci - i tu zadanie dla ciebie, rozpisz poprawnie warunek takze dla wspolrzednych y - kiedy wystepuje kolizja (pamietaj, ze w allegro w dol rosnie y, w gore maleje)

P-30628
malan
» 2011-04-11 20:52:26
Dokładnego przykładu nie dostaniesz, bo podałeś za mało szczegółów. Trochę inaczej to będzie wyglądało dla mapy kafelkowej, trochę inaczej dla mapy izomerycznej, trochę inaczej dla zwykłej bitmapy, na której wyświetlasz... inne bitmapy ;p. Ogólnie rzecz biorąc to pytasz to tak zwane kolizje. Tematów, na Naszym forum o tym znajdziesz całe multum ;)
Załóżmy, że ściana to pionowa kreska na pozycji (100,0) (x,y) i nie można przejść na jej prawą stronę. Ta "blokada", tzn. sprawdzenie, czy "zablokować" ludzika będzie wyglądało mniej więcej tak:
C/C++
if( playerPositionX <= 100 )
     ++playerPositionX;
Sprawdzamy tutaj, czy pozycja ludzika nie przekroczyła 100. Jeżeli nie, to przesuwamy ludzika w prawo, w przeciwnym wypadku nie robimy nic (czyli ludzik stoi w miejscu).
P-30629
ison
» 2011-04-11 21:45:27
najlepsze rozwiązanie wg mnie:
*wykonujesz ruch
*sprawdzasz ze wszystkimi obiektami czy nastąpiła kolizja (sprawdzasz czy 2 prostokąty na siebie nachodzą)
*jeśli tak to cofasz ruch
P-30632
malan
» 2011-04-11 22:01:31
@ison: Nie lepiej wykonać dwa kroki zamiast trzech?
P-30636
dmx81
» 2011-04-11 22:50:35
kod malana, chociaz pogladowy, tez mozna konkretniej "rozrysowac" ;P
najlepiej sobie ustal dla postaci wartosc przesuniecia i sprawdzaj
C/C++
if( ludek.x + ludek.ruch >= granica ) //znaczy sie przekroczy granice w nastepnym ruchu
(...) //tutaj mozesz podsunac ludka pod sama sciane, mozesz nie robic nic, mozesz wyswietlic napis, ze kolizja itd
     else ludek.x += ludek.ruch;

mysle, ze masz dosc przykladow, aby cos samemu zmajstrowac, jakby co to pytaj
P-30644
ison
» 2011-04-12 12:29:27
@ison: Nie lepiej wykonać dwa kroki zamiast trzech?
w jakim sensie?
jak będziesz miał 10 przeszkód to będziesz pisał 10 ifów i dla każdej strzałki (kierunku chodzenia) sprawdzał osobno kolizje? jak kto woli :p
P-30649
malan
» 2011-04-12 14:18:36
@ison: Nie o to mi chodzi ;p
*wykonujesz ruch
*sprawdzasz ze wszystkimi obiektami czy nastąpiła kolizja (sprawdzasz czy 2 prostokąty na siebie nachodzą)
*jeśli tak to cofasz ruch
Ja mówię o tym:
*sprawdzasz, czy doszło do kolizji
*jeśli nie, to wykonujesz ruch
Po co chcesz się gdzieś cofać? ;p Oczywiście zakładam tu, że przy kolizji postać powinna pozostać w miejscu ;p
P-30658
« 1 » 2
  Strona 1 z 2 Następna strona