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 . |
|
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)
|
|
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: 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). |
|
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 |
|
malan |
» 2011-04-11 22:01:31 @ison: Nie lepiej wykonać dwa kroki zamiast trzech? |
|
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
if( ludek.x + ludek.ruch >= granica ) (...) else ludek.x += ludek.ruch;
mysle, ze masz dosc przykladow, aby cos samemu zmajstrowac, jakby co to pytaj |
|
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 |
|
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 |
|
« 1 » 2 |