Skocz do zawartości
KDK ZamDragon

[#1]Obiekt raz ruszony jedzie przez parę lokacji?

Rekomendowane odpowiedzi

Wstęp: Piszę ten poradnik, gdyż pewnie wiele osob chciałoby wiedzieć jak zrobić, by obiekt po dojechaniu do pierwszej lokacji jechał do drugiej bez koniecznośći wpisywania kolejnych komend. Więc nie przedłużajmy i zaczynajmy! LET'S GO!!!...

Rozwinięcie: Potrzebne nam będą - funkcja MoveObject oraz callback/public OnObjectMoved!!!

Zacznijmy od tego, co to jest za funkcja oraz omówmy jej parametry...

Funkcja ta służy do przesuwania już stworzonych obiektów.
 

MoveObject(objectid, Float:X, Float:Y, Float:Z, Float:Speed, Float:RotX, Float:RotY, Float:RotZ);

Parametry:

- objectid - Id przesuwanego obiektu
- Float:X - koord X obiektu po przesunięciu
- Float:Y - koord Y obiektu po przesunięciu
- Float:Z - koord Z obiektu po przesunięciu
- Float:Speed - Szybkośc z jaką przesuwa się dany obiekt (wyrażana w sekundach!)
- Float:RotX - Ostateczna rotacja X obiektu     //ostateczna? - tak, gdyż ta rotacja objektu zmiena się dopiero po jego dotariu do celu
- Float:RotY - Ostateczna rotacja Y obiektu
- Float:RotZ - Ostateczna rotacja Z obiektu

Najważniejsze są te pięć pierwszych parametrów, reszty rzadziej się używa, ale to nie znaczy, że wogóle! - Są równie istotne, ale nie trzeba ich używać!


Podpowiedź dla początkujących w PAWN (32-bitowy język skyptowy || PAWNO to edytor!)! - Pomiń to jeżeli jesteś trochę bardziej zaawansowany w PAWN!!!...

Koordynaty to liczby określające położenie punktu na płaszczyźnie lub w przestrzeni względem ustalonego punktu - w tym przypadku środka mapy - dokładny środek mapy to X = 0.0,  Y = 0.0,  Z = 0.0!

 

X - to szerokość (na mapie lewo, prawo)
Y - to wysokość  (na mapie góra, dół)

Z - to wysokość względem morza (poniżej poziomu wody jest ujemne, powyżej dodanie)

 

Float - liczba zmiennoprzecinkowa!
Zazwyczaj Float używa się w zmiennej, gdy ktoś chce zapisać w niej swoją pozycję!


Funkcja publiczna to taka funkcja, która jest poprzedzona frazą "public" i można się do niej odwołać z zewnętrznego kodu, który nie jest zawarty w tym samym skrypcie.

Co to jest zmienna? - zmienna jest to konstrukcja programistyczna, która względem wykonywania się kodu może przyjmować różne zmieniające się parametry, zarówno tekstowe jak i liczbowe.

 

RotX? - Co znaczy rotacja chyba nikomu tutaj nie muszę wyjaśniać... Co to jest "rotacja X" chyba wymaga wyjaśnienia dla początkujących. Spójrzmy w górę - wyżej! - przykładowo na definicję koordu X... Wyobraźmy sobie linie przeprowadzoną wzdłuż szerokości naszej mapy oraz przymocowany do tej lini nasz objekt. RotX - w tym parametrze możemy obrócić objekt wokół własnej osi - również wokół osi tej lini!

 

 

Teraz tworzymy zmienną(na górze gamemode'u!).  //Ta zmienna będzie nazwą naszego obiektu!

new nasz_objekt;

W callback'u OnGameModeInit (w naszej mapie) tworzymy teraz nasz objekt... || oraz definujemy naszą zmienną

nasz_objekt = CreateObject(modelid, Float:X, Float:Y, Float:Z, Float:rX, Float:rY, Float:rZ); //nasz_objekt = objectid naszego objektu(już stworzonego) || modelid - id modelu tego objektu || np.rX - rotacja koordu X - radziłbym tutaj ruszać tylko rZ!

Wkońcu przechodzimy do komendy!

Wyszukujemy callback OnPlayerCommandText!

public OnPlayerCommandText(playerid, cmdtext[])
{
     if(strcmp(cmdtext, "/moveobject", true) == 0) //strcmp - system pisania komend || true - czy ma ignorować wielkość znaków || 0 - ile znaków z obu stringów ma porównywać? - domyślnie wszystkie, więc zapis bez 0 jest też poprawny || cmdtext - tablica, która zawiera tekst ze znakiem "/" na początku!
     {
       MoveObject(nasz_obiekt, X, Y, Z, 5); // Przesuneliśmy nasz obiekt!
       return 1;
     }
}

[nie wszystko tu tłumaczę, ale wiadomość dla początkujących - jest tu wiele innym poradników, na których znajdziecie pomoc]

 

 

Wiemy już wszystko, to w takim razie teraz przechodzimy dalej.

 

Teraz przydałaby się zmienna, która informowałaby o tym w jakim stadium drogi jest nasz obiekt - właśnie do tego przechodzimy.

new topoint;

Przejdźmy teraz do naszego public'a
OnObjectMoved to funkcja publiczna wykonywana po zakończeniu przesuwania obiektu. Jedynym parametrem tutaj jest "objectid" - już wcześniej wyjaśniłem co to znaczy.

public OnObjectMoved(objectid)
{
    if(objectid == nasz_objekt) //sprawdzamy, czy to jest nasz objekt
    {
    if(topoint == 0) //sprawdzamy, czy objekt dojechał do pierwszej lokacji/czy wartość zmiennej wynosi 0
    {
        //MoveObject // wysłamy go do następnej  [nie musimy akurat tutaj go gdzieś wysyłać, możemy np. go obrócić, czy cokolwiek]
        topoint++; //podnosimy wartość zmiennej [tym razem do 1!]
    }
    if(topoint == 1) //sprawdzamy, czy objekt dojechał do drugiej lokacji
    {
        //MoveObject // wysłamy go do następnej
        topoint++;
    }
    if(topoint == 2) //sprawdzamy, czy objekt dojechał do trzeciej lokacji
    {
        //MoveObject // wysłamy go do następnej
        topoint++;
    }
    else if(topoint == 3) //czy objekt dotarł do ostatniej pozycji i go nigdzie już nie wysyłamy
    {    
        topoint=0; //dajemu zmiennej wartość ponownie 0!
    }
    return 1;
}

Dla ciekawych!!!
Przydatnymi funkcjami są też - "IsObjectMoving" i "StopObject"! // sprawdza, czy object jest w ruchu || zatrzymuje objekt

Przy ostatnim przykładzie może być to przydatne.

 

 

np.

if(IsObjectMoving(objectid)) // objectid - deklarujemy tutaj nazwę!
   {
       StopObject(objectid);
   }

lub

if(IsObjectMoving(nasz_objekt)) // objectid - deklarujemy tutaj nazwę!
{
    SendClientMessage(playerid, "Objekt ruszył, musisz poczekać aż wróci!!!...);
}

Podsumowanie:


OnObjectMoved to funkcja publiczna wykonywana wtedy, gdy objekt o danym id ukończył drogę. Jedynym parametrem tutaj jest "objectid".
Przy tego typu rzeczach radziłbym używać tego callback'a! Jakich rzeczach? Np. takich script'ach jak titanic lub no nwm - "tupolew" lub jakich tam chcecie (szczególnie przydatne będą tutaj parametry funkcji "MoveObject", które są rzadziej używane - rotacja)!

Cały kod pod koniec:
 

new topoint;
new nasz_objekt;

public OnPlayerCommandText(playerid, cmdtext[])
{
     if(strcmp(cmdtext, "/moveobject", true) == 0)
     {
      MoveObject(nasz_obiekt, 250.0, 125.25, 12.45, 5.0);
      return 1;
     }
}
public OnGameModeInit()
{
    nasz_objekt = CreateObject(125.0, 245.0, 120.0, 12.0, 0.0, .0., 150.0);  
    return 1;
}
public OnObjectMoved(objectid)
{
    if(objectid == nasz_objekt)
    {
    if(topoint == 0)
    {
        MoveObject(nasz_object, 260.0, 145.0, 15.1, 9.1);                      
        topoint++;
    }
    if(topoint == 1)
    {
        MoveObject(nasz_object, 261.5, 147.8, 15.3, 9.4);                       
        topoint++;
    }
    if(topoint == 2)
    {
        MoveObject(nasz_object, 269.5, 158.8, 16.3, 9.9, 0.0, 90.0, 0.0);
        topoint++;
    }
    else if(topoint == 3)
    {    
        topoint=0;
    }
    if(IsObjectMoving(nasz_objekt)) 
    {
           SendClientMessage(playerid, "Objekt ruszył, musisz poczekać aż wróci!...);
    }    
    return 1;
}

Zakończenie: Myślę, żę ten poradnik komuś się przyda! Opisuje tak dokładnie - jak pewnie wszyscy zauważyliście!- bo piszę nie tylko dla zaawansowanych, ale też dla tych, którzy dopiero zaczynają, dlatego też użyłem tu przykładu na strcmp! ;):);)
 

Edytowane przez KDK ZamDragon

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Może być, like :D

 

//Proponowałbym to jakoś ułożyć dla nowicjuszy, ponieważ nowicjusz nie będzie wiedział co z tym zrobić :D

Edytowane przez Dejv

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Koordy to czysta matematyka!!!... koord X - oś OX - czyli licząc od środka - Float: X =25.5 albo -125.5, itd. // dla ludzi, którzy niezałapią!

Float - oznaczenie pozycji - Float:X - Oznaczenie pozycji przez koord X!

Zazwyczaj Float używa się w zmiennej, gdy ktoś chce zapisać w niej swoją pozycję!

Wprowadzasz ludzi w błąd.

 

Koordynaty to liczby, które uwzględniają pozycje odnosząc się do konkretnego punktu - w wypadku GTA środka mapy, czyli koordynaty X = 0.0, Y = 0.0, Z = 0.0 to sam środek San Andreas.

 

X - to szerokość (na mapie lewo, prawo)

Y - to wysokość  (na mapie góra, dół)

Z - to wysokość względem morza (poniżej poziomu wody jest ujemne, powyżej dodanie)

Float w PAWN (PAWN - 32 bitowy język skryptowy) to liczba zmiennoprzecinkowa.

 

gdy objekt o danym id jest w ruchu (albo ewentualnie po wykonaniu danej drogi!)

Wykonywana po zakończeniu przesuwania obiektu.

 

Funkcja publiczna to jest po prostu funkcja, która wykonuje określone czynności w określonym czasie!

Funkcja publiczna to taka funkcja, która jest poprzedzona frazą "public" i można się do niej odwołać z zewnętrznego kodu, który nie jest zawarty w tym samym skrypcie.

 

 

 

I popierem zdanie przedmówcy. Nic tutaj nie jest czytelne. Usuń te kolorki, używaj maksymalnie dwóch, a kod dawaj w tagi [code.]

Edytowane przez Maku

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Wziąłem do serca wszystko co pisaliście i oto efekt! ;):)  Mam nadzieję, że teraz jest to bardziej czytelne oraz bardziej przydatne dla początkujących! ^_^

 

//EDIT:

 

@down

 

Spoko mi tego typu "czepianie się" nie przeszkadza, wręcz przeciwnie. Dzięki za rady, mam nadzieję, żę teraz już wszystko gra...

Edytowane przez KDK ZamDragon

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Po pierwsze zminimalizuj używanie wykrzykników a zwłaszcza tych potrójnych. Ktoś kiedyś powiedział, że jak się używa więcej niż dwóch wykrzykników w co drugim zdaniu to ma się zaburzenia własnej osobowości :) Ile w tym prawd - sami oceńcie.

 

Najważniejsze są te pięć pierwszych parametrów! Reszta jest rzadziej używana, więc raczej nie będziemy się nimi teraz zajmować...

 

Nie lubię gdy zaczyna się jakiś temat a nie kończy się danego wątku. Gwarantuję, ze pozostałe 3 funkcje są równie ważne. Dobrze by było abyś chociaż częściowo o nich wspomniał.

Co to jest zmienna? - W zmiennej są przechowywane dane i mogą być zmienione i odczytywane zgodnie z wymaganiami.

 

Ja bym powiedział raczej, że zmienna jest to konstrukcja programistyczna, która względem wykonywania się kodu może przyjmować różne zmieniające się parametry, zarówno tekstowe jak i liczbowe.

 

Teraz tworzymy zmienną!(na górze mapy!)  //Ta zmienna to nazwa naszego obiektu!

 

Jeśli chodzi o ścisłość to nie mapa tylko gamemode ale jak kto woli.

 

Wyszukujemy public OnPlayerCommandText!!!...

 

Nie public tylko callback + kolejne wykrzykniki.

 

 

np.if(IsObjectMoving(objectid))
   {
       StopObject(objectid);
   }


lub
    if(IsObjectMoving(nasz_objekt)) // objectid - deklarujemy tutaj nazwę!
          {
           SendClientMessage(playerid, "Objekt ruszył, musisz poczekać aż wróci!!!...);
    }

 

Nie mieszaj w kod tekstu bez komentarzy, bo znajdzie się osoba początkująca, która będzie mieć problemy z takim kodem motywując to występującym błędem numer 017...

 

Wiem czepiam się ale jak piszesz dla początkujących to nie ucz ich złych praktyk - taka mała polemika ode mnie.

Pozdrawiam :)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

 

 

nasz_objekt = CreateObject(modelid, Float:X, Float:Y, Float:Z, Float:rX, Float:rY, Float:rZ); //modelid = objectid właśnie tworzonego objektu! || np.rX - rotacja koordu X - radziłbym ruszać tylko rZ!

Nie sądzę żeby modelid = objectid

Modelid to id MODELU. Objectid to id stworzonego obiektu. 

Objectid = nasz_objekt

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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

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

×