INNE Tworzenie NewGRF w NML #1 - drezyna WM-15A.
#1
Cool 
Poniższy tutorial jest perwszym z cuklu tutoriali opisujących tworzenie dodatków NewGRF z wykorzystaniem specjalnie stworzonego w tym celu języka programowania - NML (NewGRF Meta Language). Pełną specyfikację tego języka można znaleźć w wiki: http://newgrf-specs.tt-wiki.net/wiki/NML:Main . Tam też opisane są wszystkie programy i narzędzia potrzebne do rozpoczęcia pracy: http://newgrf-specs.tt-wiki.net/wiki/NML...ng_started . Wszystkie tutoriale będą zgodne ze specyfikacją GRFv8, obsługiwaną od wersji 1.2.0 OTTD.

Zaczynamy!
W pierwszym tutorialu opiszę sposób tworzenia małego dodatku NewGRF, zawierającego dwa nowe pojazdy kolejowe. Wybór padł na... drezynę motorową WM-15A oraz jej przyczepę PWM-15. Są to małe pojazdy szynowe, które oczywiście nie będą miały większego znaczenia ekonomicznego w grze, niemniej stanowią one fajną wprawkę w programowaniu GRF-ów. Tongue
Na przykładzie tej drezyny pokażę podstawowe reguły tworzenia pojazdów, a także nieco bardziej zaawansowane metody, pozwalające np. na dodanie prostej logiki, kontrolującej zachowanie pojazdów w grze.

Szablony graficzne
Projektowanie każdego nowego pojazdu najlepiej zacząć od przygotowania podstawowych grafik i zakodowania ich w postaci sprite-ów. Bez względu na planowaną ilość obrazków, sprite-y te powinno się kodować z wykorzystaniem tzw. template-ów języka NML. Wynika to z faktu, że późniejsze "odpluskwianie" GRF-a i ręczne korygowanie offsetów dla pojedynczych sprite-ów może się okazać zdecydowanie bardziej pracochłonne niż poświęcenie paru minut na dopasowanie swoich grafik do gotowego szablonu.
W Internecie można znaleźć różne przykłady szablonów, niestety nieco różniących się między sobą. Dlatego na ich podstawie oraz na podstawie różnych testów z OpenTTD opracowałem własny szablon, moim zdaniem najwygodniejszy w użyciu. Szablon uwzględnia różne długości taboru - od długości maksymalnej (8 jednostek) aż do wersji skróconej do 5 jednostek. Poprzez analogię można utworzyć także szablony dla taboru o jeszcze mniejszej długości (1 - 4 jednostek), jednak projektowanie tak krótkich pojazdów mija się już chyba z sensem...
W starej specyfikacji (GRFv7 i wcześniejszych) długości pojazdów podawało się jako części ułamkowe standardowego pojazdu, stąd na moich rysunkach często występują jeszcze opisy: 8/8, 7/8, 6/8, itp., co po prostu oznacza odpowiednio długość 8, 7 i 6 jednostek.

[Obrazek: 480template8_7_6_5.png]

Kolorowe bryły, widoczne na poszczególnych rzutach to granice, w których musi zmieścić się rysunek taboru. Aby zaprojektowane wagony stały później na torze w jednej linii i nie odstawały na boki, należy uwzględnić także kilka dodatkowych zasad. W przedstawionym szablonie najniższy rząd pixeli jest przewidziany na koła bądź inną formę podwozia (mono-rail, maglev). Drugi rząd pixeli może stanowić ramę podwozia wagonu (wagony towarowe, np. platformy) lub pierwszy rząd ściany wagonu osobowego. W rzucie z boku należy też uwzględnić na obu końcach wagonu po jednym wolnym pixelu na zderzaki lub gumowe przejścia międzywagonowe. Natomiast w rzutach skośnych należy uwzględnić odpowiednie obniżenia krawędzi dachu dla wagonów z zaokrąglonym dachem.

Zaletą powyższego szablonu graficznego jest to, że kod template-u w języku NML do definiowania sprite-ów jest wspólny dla wszystkich długości taboru. Wygląda on następująco:

Kod:
template template_sprite_train(x, y) {
// [left_x,   upper_y,    width,    height,    offset_x,    offset_y]
    [x,          y,         12,        28,          -5,        -16]
    [x+ 16,      y,         26,        28,         -17,        -18]
    [x+ 46,      y,         36,        20,         -17,        -14]
    [x+ 86,      y,         26,        28,          -7,        -18]
    [x+120,      y,         12,        28,          -5,        -16]
    [x+136,      y,         26,        28,         -17,        -18]
    [x+166,      y,         36,        20,         -17,        -14]
    [x+206,      y,         26,        28,          -7,        -18]
}

template template_sprite_purchase(x, y) {
// [left_x,   upper_y,    width,    height,    offset_x,    offset_y]
    [x,          y,         50,        12,         -25,         -8]
}
(x, y) - współrzędne lewego górnego narożnika szablonu w pliku graficznym.

Obcięcie zbędnego nadmiaru tła, występującego w przedstawionym szablonie, można dokonać automatycznie, dodając dyrektywę "-c" podczas kompilacji.

c.d.n.


Wiadomości w tym wątku
Tworzenie NewGRF w NML #1 - drezyna WM-15A. - przez TadeuszD - 27-10-2011, 12:28

Skocz do:

[-]
Zamknięcie forum OpenTTD Polska
Forum OpenTTD Polska zostało wyłączone. Obecnie znajduje się tu archiwum dyskusji o dodatkach tworzonych przez naszą społeczność.
Po aktualne treści i dyskusje zapraszamy na nasz discord! :)

[-]
Discord