Yoda Opublikowano 28 Marca 2008 Udostępnij Opublikowano 28 Marca 2008 Napisałem sobie funkcję place_free, która sprawdza czy na danej pozycji X i Y nie znajduje się jakiś obiekt ( w tym wypadku jest to tablica obiektów-przeszkód :P ). No ale nie do końca działa, tzn wygląda na to że zwraca fałsz, gdyż nie mogę poruszyć się innym obiektem, ale do rzeczy: bool place_free ( int _x, int _y, cBlock __objB[] ) { int bbox_left, bbox_right, bbox_top, bbox_bottom; for ( int i=0; i<blocks_number; i++ ) { bbox_left = __objB[i].x; bbox_right = __objB[i].x+__objB[i].w; bbox_top = __objB[i].y; bbox_bottom = __objB[i].y+__objB[i].h; if ( !((bbox_left > _x || bbox_right < _x) && (bbox_top > _y || bbox_bottom < _y)) ) return false; } return true; } Tak wygląda owa funkcja, a teraz wywołanie w kodzie: __key_state = SDL_GetKeyState( NULL ); if ( __key_state[SDLK_LEFT] ) { if (place_free( objPlayer.x-1, objPlayer.y, *objBlocks )) { objPlayer.x -= 1; objPlayer.direction = 0; } } if ( __key_state[SDLK_RIGHT] ) { if (place_free( objPlayer.x+1, objPlayer.y, *objBlocks )) { objPlayer.x += 1; objPlayer.direction = 1; } } I jeszcze tworzenie obiektów objBlocks[]: cBlock *objBlocks[100]; objBlocks[0] = new cBlock( 64, 64, true, 16, 16 ); objBlocks[1] = new cBlock( 64, 80, true, 16, 16 ); objBlocks[2] = new cBlock( 80, 64, true, 16, 16 ); objBlocks[3] = new cBlock( 96, 64, true, 16, 16 ); Wydaje się być wszystko OK, ale muszę jeszcze przyznać żę miałem problem z przekazaniem tablicy obiektów objBlocks[] do owej funkcji udało mi się to podając ją tak jak jest teraz ( *objBlocks wtf? ). jeżeli ktoś wie gdzie jest przyczyna i mógłby przybliżyć mi nieco zasady przekazywania tych tablic to byłbym wdzięczny ;) Z góry dzięki! Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
RaistlinBlackRobe Opublikowano 28 Marca 2008 Udostępnij Opublikowano 28 Marca 2008 if ( (bbox_left < _x && bbox_right > _x && bbox_top > _y && bbox_bottom < _y) ) return false; Ja bym tak proponował. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
kryniak Opublikowano 28 Marca 2008 Udostępnij Opublikowano 28 Marca 2008 Wydaje się być wszystko OK, ale muszę jeszcze przyznać żę miałem problem z przekazaniem tablicy obiektów objBlocks[] do owej funkcji udało mi się to podając ją tak jak jest teraz ( *objBlocks wtf? ). jeżeli ktoś wie gdzie jest przyczyna i mógłby przybliżyć mi nieco zasady przekazywania tych tablic to byłbym wdzięczny ;) Z góry dzięki! typ *wskaznik = &tab[0]; Wskazanie na tablicę odbywa się poprzez wskazywanie na jej pierwszy element. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Yoda Opublikowano 28 Marca 2008 Autor Udostępnij Opublikowano 28 Marca 2008 Dobra już widzę że wina jest w warunku sprawdzania kolizji :P Hmm teraz czy ten będzie dobry? if ( ((bbox_left < _x && bbox_right > _x && bbox_top < _y && bbox_bottom > _y)) ) return false; Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
RaistlinBlackRobe Opublikowano 28 Marca 2008 Udostępnij Opublikowano 28 Marca 2008 Dobra już widzę że wina jest w warunku sprawdzania kolizji :P Hmm teraz czy ten będzie dobry? if ( ((bbox_left < _x && bbox_right > _x && bbox_top < _y && bbox_bottom > _y)) ) return false; Przy pionach znaki nierówności są odwrotnie tj. powinno chyba być: bbox_top > _y && bbox_bottom < _y Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Yoda Opublikowano 28 Marca 2008 Autor Udostępnij Opublikowano 28 Marca 2008 Hmmm tak czy siak teraz nie do końca działa, bo nie sprawdza wszystkich bloków :mellow: Tak jakby ta pętla nie jechała po wszystkich ;/ Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Will Opublikowano 28 Marca 2008 Udostępnij Opublikowano 28 Marca 2008 Włóż wszystkie elementy do wektora z STL i przechodząc iteratorem masz pewność , że przejdzie po wszystkich elementach... Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Yoda Opublikowano 28 Marca 2008 Autor Udostępnij Opublikowano 28 Marca 2008 @Will: Ok, już czytam o STLu, ale czemu ta pętla która jest teraz nie działa ;P jak na moje rozumowanie to powinna. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Will Opublikowano 28 Marca 2008 Udostępnij Opublikowano 28 Marca 2008 Powodów może być wiele.. w zasadzie lepiej zawsze korzystać z STL w takich sytuacjach.. nie trzeba tak bardzo dbać o przepełnienie chociaż to też oczywiście jest możliwe kiedy wyczerpie się dostępna pamięć, łatwa obsługa wyjątków, łatwe operacje na obiektach.. a powodem nie działania twojej pętli może być np: w ogule nie zainicjowna wartość zawierająca informacje o ilości elementów w tablicy.. lub niewłaściwa jej wartość.. nie można wyczytać z kilku lini kodu błędu który może nawet tkwić w innym module.. p.s ty tworzysz 100 elementów wpisując do wszystkich konstruktorów ręcznie wartości? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Yoda Opublikowano 28 Marca 2008 Autor Udostępnij Opublikowano 28 Marca 2008 p.s ty tworzysz 100 elementów wpisując do wszystkich konstruktorów ręcznie wartości? Nie :P Sam nie wiem czemu zainicjowałem tę tablicę na 100. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Will Opublikowano 28 Marca 2008 Udostępnij Opublikowano 28 Marca 2008 Właśnie dlatego lepiej używac stl.. pozwala zaoszczędzić pracy i zająć się ważniejszymi rzeczami :] A te kilkanaście minut poświęcone na nauke szybko się zwróci.. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto
Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.
Zarejestruj nowe konto
Załóż nowe konto. To bardzo proste!
Zarejestruj sięZaloguj się
Posiadasz już konto? Zaloguj się poniżej.
Zaloguj się