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.
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]](https://openttd-polska.pl/uploads/other/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:
(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.
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.

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]](https://openttd-polska.pl/uploads/other/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]
}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.
![OpenTTD #Polska - Polskie forum gry OpenTTD [ARCHIWUM] OpenTTD #Polska - Polskie forum gry OpenTTD [ARCHIWUM]](https://forum.openttd.pl/images/logo.png)
