Nie zrobiłem na razie przesuwania w określonym kierunku jednak:
TYTUŁ: Ścieżka przesunięcia obiektów.
Wprowadzenie
Ostatnia lekcja dotyczyła sterowania przesunięciami ruchu. To jest jednak jej uzupełnieniem. W bardzo wielu grach chcemy aby któraś z postaci chodziła po określonym terenie. Zajmijmy się klasą przesunięć danego obiektu.
Klasa przesunięć obiektu
Najpierw musimy stworzyć typ wyliczeniowy (enumeration type), który będzie zawierał informacje co do kierunku danego obiektu.
enum eKierunek
{
K_UP,
K_DOWN,
K_LEFT,
K_RIGHT
};
Nasz typ wyliczeniowy "eKierunek" posiada 4 kierunki. Można oczywiście dobrowolnie zmieniać to, ale zajmiemy się tym później.
Teraz bardzo ważna jest klasa która nam dużo pomoże.
class CPrzesuniecie
{
public:
CPrzesuniecie( eKierunek _Kierunek, int _Dlugosc, int _Predkosc );
void Przesun( int & _x, int & _y );
void Reset();
int mPredkosc;
int mDlugosc;
int mPrzebyta;
eKierunek mKierunek;
bool mAktywny;
};
Teraz przyszło nam zdefiniować powyższe deklaracje metod klasy "CPrzesuniecie". Wpierw metoda Przesun(). Chcemy w niej przesunąć obiekt o określony mnożnik (w tym przypadku o liczbę mPrędkość). Posiada ona 2 argumenty - 1 to pozycja w osi x, 2 to pozycja w osi y.
void CPrzesuniecie::Przesun( int & _x, int & _y )
{
if( mPrzebyta + mPredkosc > mDlugosc )
{
if( mKierunek == K_LEFT ) _x -=( mPrzebyta + mPredkosc ) - mDlugosc;
else if( mKierunek == K_RIGHT ) _x +=( mPrzebyta + mPredkosc ) - mDlugosc;
else if( mKierunek == K_UP ) _y -=( mPrzebyta + mPredkosc ) - mDlugosc;
else if( mKierunek == K_DOWN ) _y +=( mPrzebyta + mPredkosc ) - mDlugosc;
}
else
{
if( mKierunek == K_LEFT ) _x -= mPredkosc;
else if( mKierunek == K_RIGHT ) _x += mPredkosc;
else if( mKierunek == K_UP ) _y -= mPredkosc;
else if( mKierunek == K_DOWN ) _y += mPredkosc;
}
}
Teraz mamy metode, która przesuwa obiekt, a zarazem zabezpiecza go przed "wypadnięciem" poza ścieżkę. Teraz przyszedł czas na funkcję Reset().
void CPrzesuniecie::Reset()
{
mPrzebyta = 0;
}
Tak więc jest to łatwe do wykonania. Wewnątrz tej metody resetujemy przebytą drogę i aktywność przesunięcia, tak aby droga mogłabyć ponownie użyta bez następnego ustawiania kierunku, prędkości i długości do przebycia.
Przyszedł czas na konstruktor który jest bardzo potrzebny, przy inicjalizowaniu całego przesunięcia:
CPrzesuniecie::CPrzesuniecie( eKierunek _Kierunek, int _Dlugosc, int _Predkosc )
: mKierunek( _Kierunek )
, mDlugosc( _Dlugosc )
, mPredkosc( _Predkosc )
{
Reset();
mAktywny = false;
}
Mamy więc całą klasę.
Ustalamy ścieżkę obiektu
Jest rzeczą banalnie prostą aby ją wykorzystać. Musimy sobie ustalić że nasz obiekt porusza się w powiedzmy... 4 kierunkach i zatacza jakby taki kwadrat bo kołem tego nie można nazwać. Zaczyna się z pozycji x=40, y=40. Pierw musimy ustalić jaki będzie początkowy kierunek. Niech to będzie kierunek na dól, później prawo, góra, lewo.
Pętla główna
Ustalmy że mamy klasę o nazwie Obiekt, jej konstruktor pobiera 2 argumenty: pozycje w osi x i pozycje w osi y.
Tak więc:
Obiekt naszObiekt( 40, 40 );
Następnie ustalamy nasz początkowy kierunek:
eKierunek kierunek = K_DOWN;
Teraz tworzymy obiekt przesunięć:
CPrzesuniecie przesuniecie( kierunek, 360, 1 );
przesuniecie.mAktywny = true;
W pętli głównej:
if( przesuniecie.mPrzebyta >= przesuniecie.mDlugosc )
{
przesuniecie.Reset();
if( kierunek == K_DOWN ) kierunek = K_RIGHT;
if( kierunek == K_RIGHT ) kierunek = K_UP;
if( kierunek == K_UP ) kierunek = K_LEFT;
if( kierunek == K_LEFT ) kierunek = K_DOWN;
przesuniecie.mKierunek = kierunek;
}
if( przesuniecie.mAktywny == true )
{
przesuniecie.Przesun( naszObiekt.x, naszObiekt.y );
}
Tak więc mamy już nasz obiekt, mamy nasze kierunki, przesuwa on się dobrze. Więc czego jeszcze tu chcieć?
Co o tym myślicie?
@EDIT:
Później chciałbym zrobić właśnie te przesuwanie w określonym kierunku. Też w tej samej lekcji. Nie zakładam z góry że sie komuś spodoba lecz mam taką nadzieję :P