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

Wytwarzanie Gier 2D - o czym chcielibyście poczytać artykuły?

Ostatnio zmodyfikowano 2021-03-04 16:52
Autor Wiadomość
DejaVu
Temat założony przez niniejszego użytkownika
» 2013-01-11 17:20:03
Parser skleił znaki :P napisz bez spacji to zauważysz, że to minus :P (Java, Oracle PL/SQL)
P-73603
RazzorFlame
» 2013-01-11 17:25:45
Hehe OK już czaje :P
P-73608
RazzorFlame
» 2013-01-25 16:53:33
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.
C/C++
enum eKierunek
{
    K_UP, //kierunek do gory
    K_DOWN, //kierunek w dol
    K_LEFT, //kierunek w lewo
    K_RIGHT //kierunek w prawo
};
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.
C/C++
class CPrzesuniecie
{
public:
    //konstruktor
    CPrzesuniecie( eKierunek _Kierunek, int _Dlugosc, int _Predkosc );
    //metody
    void Przesun( int & _x, int & _y );
    void Reset();
    //"czlonkowie" klasy
    int mPredkosc; //predkosc przesuniecia
    int mDlugosc; //dlugosc przesuniecia
    int mPrzebyta; //przebyta droga
    eKierunek mKierunek; //kierunek przesuniecia
    bool mAktywny; //nazwa mowi sama za siebie
};
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.
C/C++
void CPrzesuniecie::Przesun( int & _x, int & _y )
{
    if( mPrzebyta + mPredkosc > mDlugosc ) //zeby przypadkiem obiekt nie chodzil koslawo!
    {
        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().
C/C++
void CPrzesuniecie::Reset()
{
    mPrzebyta = 0;
    //reszty nie trzeba resetowac
}
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:
C/C++
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:
C/C++
Obiekt naszObiekt( 40, 40 ); //nasza pozycja z ktorej wychodza nasze przesuniecia
Następnie ustalamy nasz początkowy kierunek:
C/C++
eKierunek kierunek = K_DOWN;
Teraz tworzymy obiekt przesunięć:
C/C++
CPrzesuniecie przesuniecie( kierunek, 360, 1 ); //bedzie sie przesuwal o 360 pixeli w strone ze zmiennej "kierunek" z predkoscia 1 pix.
przesuniecie.mAktywny = true; //nasze przesuniecie jest teraz aktualne

W pętli głównej:

C/C++
//obsluga zdarzen

if( przesuniecie.mPrzebyta >= przesuniecie.mDlugosc ) //uaktualniamy kierunek
{
    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 ); //przesuwamy nasz obiekt
}

//wyswietlamy nasz obrazek
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
P-74981
DejaVu
Temat założony przez niniejszego użytkownika
» 2013-01-25 17:26:26
Ten Twój rozdział powinien się chyba nazywać 'Sterowanie obiektami przez użytkownika' :)
P-74983
RazzorFlame
» 2013-01-25 17:33:39
Troche nie zrozumiałem? Chodzi ci o użytkownika aplikacji?  Przecież nigdy nie wczytuje jego decyzji x)? A jeśli to wskaż to. Ogólnie co jest źle?
P-74985
DejaVu
Temat założony przez niniejszego użytkownika
» 2013-01-25 17:35:32
Tytuł warto przemyśleć. Treść po prostu nie ma nic wspólnego ze ścieżką, tylko co najwyżej z kierunkiem ruchu :)
P-74986
RazzorFlame
» 2013-01-25 17:38:35
Hehe właśnie mi to uświadomiłeś. Jeśli w ogóle chcesz aby to tam zaistniało, to pozostawiam Tobie wymyślenie nazwy :)
P-74987
DejaVu
Temat założony przez niniejszego użytkownika
» 2013-01-25 17:43:42
Najlepiej pisać artykuły - łatwiej się je publikuje. ten cały kurs wytwarzania gier 2D pewnie będę przepisywał za rok/dwa, bo mam na niego zupełnie inną koncepcję :) Najpierw jednak muszę dokończyć kurs C++ i kurs SFML 2.0 :P
P-74988
1 2 3 4 5 6 7 8 9 10 11 12 13 14 « 15 » 16 17 18 19 20 21
Poprzednia strona Strona 15 z 21 Następna strona