Skocz do zawartości
PsichiX

FAQ - XenoN Core

Rekomendowane odpowiedzi

Lista najczęściej zadawanych pytań:

 

1. Jak uzależnić prędkość, animacje, itp. od DeltaTime (czasu trwania klatki)?

float Speed = 0;
Speed += XE_EVENTS::Use().DeltaTime;

 

2. Jak przesuwać wektor w danym kierunku na daną odległość?

XE_VECTOR Position( 100, 100 );
XE_ANGLEVECTOR Direction( 45 );
Position += XeLengthdirLen( Direction, 100 );

 

3. Jak obliczyć kierunek pomiędzy dwoma punktami?

XE_VECTOR a( 100, 100 );
XE_VECTOR b( 200, 300 );
XE_ANGLEVECTOR Direction = XeDirectionDir( a, b );

 

4. Jak zapisywać dane z i do pliku?

Ważne!:

Nie wolno zapisywać całych struktur/klas w których jest jakaś zmienna będąca wskaźnikiem itp. takie dane ze wskaźnika trzeba do osobnej struktury kopiować i dopiero zapisywać/odczytywać. Tak wiec bezpośrednio aktora nie zapiszesz, możesz tylko skopiować jego wartości do osobnej struktury i dopiero zapis

  1. Zapis:

    // tablica wektorow (np. pozycje bonusow itp.)
    XE_VECTOR data[ 128 ];
    // obiekt bufora pliku
    XE_FILE file;
    // wpisz do bufora pliku ilosc elementow tablicy
    int count = 128;
    file.Write( &count, // wskaznik na dane
    sizeof( int ); // rozmiar danych w bajtach
    );
    // wpisz zawartosc tablicy do bufora pliku
    file.Write( data, sizeof( XE_VECTOR ) * count );
    // zapisz bufor do pliku
    file.Save( "save.sav" );
    // zwolnij bufor pliku z pamieci
    file.Free();

  2. Odczyt

    // dynamiczna tablica wektorow (np. pozycje bonusow itp.)
    XE_VECTOR* data = NULL;
    // obiekt bufora pliku
    XE_FILE file;
    // zaladuj plik
    file.Load( "save.sav" );
    // odczytaj ilosc elementow tablicy z bufora pliku
    int count = 0;
    file.Read( &count, // wskaznik na bufor docelowy
    sizeof( int ) // rozmiar danych do odczytu
    );
    // odczytaj zawartosc danych tablicy
    data = new XE_VECTOR[ count ];
    file.Read( data, sizeof( XE_VECTOR ) * count );
    // zwolnij bufor pliku z pamieci
    file.Free();

 

5. Jak wykonywać funkcję po określonym czasie (alarmy/timery)?

  • Funkcja alarmu:

    void Alarm()
    {
    Game.Message( "bum :D" ); // wyswietlamy wiadomosc
    Game.Alarms( "alarm" )->Time = 10; // nastawiamy alarm znowu na 10 sekund aby wykonal sie ponownie
    }

  • W procedurze sceny dodajemy alarm:

    Game.Alarms( "alarm" )->Time = 10; // ustawiamy alarm na 10 sekund
    Game.Alarms( "alarm" )->Action = Alarm; // podpinasz funkcje Alarm jako akcje danego alarmu

 

6. jak używać aktorów?

Prawidłowa kolej rzeczy z aktorami jest następująca:

  • 1. mając gotową klasę CPlayer chcemy utworzyć aktora tej klasy więc robimy to tylko i wyłącznie rejestrując go tak:

    Game.RegisterActor( "aktor", new CPlayer() );

    bo jeśli bezpośrednio dodamy aktora w trakcie postępu gry tak:

    Game.Actors.Access( "aktor" ) = new CPlayer();

    to nie zostanie on zarejestrowany i wykrzaczy program.

  • 2. gdy już jesteśmy pewni że aktor istnieje możemy śmiało go używać:

    XE_VECTOR pos = Game.Actors.Access( "aktor" )->Position;

  • 3. gdy zechcemy usunąć aktora z gry, musimy go wyrejestrować. Wyrejestrowanie aktora w jakiejś jego metodzie (Update chociażby, np. po odliczaniu czasu itp.):

    Game.UnregisterActor( this ); // do listy ToUnregister dodaje sie wskaznik na aktora ktorego mamy wyrejestrowac.

    Jeśli chcemy "zewnętrznie" (czyli nie wewnątrz metody danego aktora) wyrejestrować aktora który spełnia jakieś kryteria, robimy to przelatując aktorów w pętli foreach tak:

    // petla foreach przechodzi wszystkie elementy kontenera Game.Actors (ktory jest typu XE_ACTOR*) i przypisuje elementowi actor bierzacy element
    XE_FOREACH( XE_ACTOR*, Game.Actors, actor )
    {
    if( actor()->Position.Y < 0 || actor()->Position.Y > 600 ) // sprawdzamy czy Y aktora jest mniejsze niz 0 lub wieksze niz 600 i jesli tak...
    Game.UnregisterActor( actor() ); // ...to usuwamy danego aktora
    }

 

7. jak sortować aktorów?

  • 1. Aby można było sortować aktorów, należy nadać im kolejność w konstruktorze (lub gdziekolwiek):

    Order = 10;

    Zmienna Order klasy XE_ACTOR ustala kolejność aktora w kolejce renderowania. Im mniejsza wartość tym później aktor jest rysowany, a im większa tym wcześniej.

  • 2. Potem w PROGRESS przed Game.Progress() dajemy:

    Game.SortActors();

 

8. Jak pobrać pozycję myszki względem okna?

XE_VECTOR MousePos = Game.MouseGetPos( "main" ); // zwraca pozycje myszki względem okna o nazwie "main"

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

czym sie rozni XE_ANGLEVECTOR od XE_VECTOR?

tylko tym ze jest znormalizowany?

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

niet, XE_ANGLEVECTOR jest to wektor obrotu (kierunki Alpha, Beta, Gamma) + opcjonalna długość. plus można na niego rzutować z pojedynczej wartości float/double.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

ahm, zmylila mnie nazwa obiektu direction

rozumiem ze do pliku mozesz zapisywac w ten sposob wszystkie swoje typy z silnika

 

wgl widze duzo nalecialosci z gma ^^

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

nie wszystkie, dodałem notkę jak zapisywać szczególne przypadki, jak skończę uzupełniać FAQ to dopiszę listę typów zdolnych do zapisu bezpośredniego oraz listę typów do zapisu poprzez wyłuskanie konkretnych danych.

 

a z racji że silnik pierwotnie robiony był z myślą portu na GM to i funkcjonalność GMowa się znalazła ;P

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

  • Przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników, przeglądających tę stronę.

×