| Pimp mah Script |
| Redaktor: Rezydent | Dodano: 01/07/2009 - 14:22 |
|
Interpreter jest ważną częścią skryptów w RPG Makerze XP. Pozwala on na zmianę poleceń zdarzeniowych na komendy w RGSS. Ma także pewną przydatność w nauce pisania skryptów – nie wiesz, jak coś można zrobić, ale jest to wykonalne w zdarzeniach, szukasz w interpreterze. Z niego można się wiele nauczyć. Często są tematy typu „Potrzebuję skryptu na…” i jest to skrypt na coś banalnego – lepiej zrobić to samemu, używając jedynie niewielkich umiejętności skrypterskich i swojej głowy. Pokażę tu jak można zastosować w grze kilka ulepszeń no i dam przykłady użycia Interpretera na naszą korzyść. Self Switches trochę inaczej… Zajrzyjmy do Interpreter 4, w linijce 175 widzimy wyraźnie „Control Self Switch”, to jest to. Teraz spoglądając na kod… key = [$game_map.map_id, @event_id, @parameters[0]] $game_self_switches[key] = (@parameters[1] == 0) Objaśnienia: @parameters[0] to nasza zmienna, w przypadku self switchów są ich 4 – “A”, “B”, “C” i “D’. @parameters[1] oznacza wartość, jaką przymuje. Nietrudno się domyślić, że $game_map.map_id i @event_id to te dane, które są nam potrzebne do zmiany… $game_map.map_id oznacza, że zmiana następuje na mapie na której jesteśmy. @event_id to ID zdarzenia w którym przełącznik jest zmieniany. Ostateczna komenda może wyglądać tak: $game_self_switches[[$game_map.map_id, @event_id, “A”]] = true Pomyślmy dalej, @event_id możemy zastąpić czym chcemy. $game_self_switches[[$game_map.map_id, 4, “A”]] = true Teraz używając takiej komendy w Script, nawet gdy jest to w evencie nr 2, przełącznik A zostanie zmieniony w zdarzeniu 4. Można też wykorzystać to w warunkach. Conditional Branch, strona 4, Script – wpisujemy dla przykładu $game_self_switches[[$game_map.map_id, 4, “A”]] == true lub $game_self_switches[[$game_map.map_id, 4, “A”]] == false Jeżeli ktoś robi skomplikowany ABS, a szkoda mu jakiś przełączników, to pewnie mu się to przyda. Mapa na panoramie Tak dla odpoczynku coś prostszego. Cel: Spriteset_Map, linijka 121 o 122. @panorama.ox = $game_map.display_x / 8 @panorama.oy = $game_map.display_y / 8 Te liczby 8 trzeba zamienić na 4 aby panorama była przylegająca do mapy. @panorama.ox = $game_map.display_x / 4 @panorama.oy = $game_map.display_y / 4 Proste? Przejdźmy dalej. Move toward Player Enterbrain nigdy nie pomyślał o wszystkim i zrobił większość tego co standardowe zbyt prosto… A gdybyśmy mogli przerobić istniejącą funkcję? Wielu twórców chciałoby mieć prosty system w którym jedno zdarzenie porusza się za drugim. Jak wykonać coś takiego? To nie jest takie trudne. Szukanie w Interpreterze pod „Set move route” to niestety nie to, ale prowadzi nas to do Game_Character. W Game_Character 3 są zawarte wszelkie interpretacje komend ruchu. Od 192 linijki rozpoczyna się „Move toward Player”. 197 i 198 linijka to: sx = @x - $game_player.x sy = @y - $game_player.y Jak widać, pobierają one współrzędne gracza. Co za ograniczone cholerstwo. Trzeba to zmienić. Zamieńmy to na: if @follow != 0 sx = @x - $game_map.events[@follow].x sy = @y - $game_map.events[@follow].y else sx = @x - $game_player.x sy = @y - $game_player.y end Już wyjaśniam… @follow będzie lokalną zmienną która przechowuje ID zdarzenia za którym podąża, jeśli wynosi 0 to celem jest bohater, w innym przypadku jest to któreś z eventów. Teraz zabezpieczmy ten system. W razie gdybyśmy nie przydzielili zmiennej @follow żaden błąd nam nie wyskoczy. W Game_Character 1 pod linijką 31 („def initialize”) wklejmy @follow = 0 A teraz, jak użyć tego systemu? Gdzieś w zdarzeniu lub komendzie „Set move router” które nim porusza wklejamy w komendzie Script „@follow = X”, gdzie zamiast X wpisujemy nasze ID (przykład: 0, 3, 10 itd.). Kiedy tylko na zdarzeniu zostanie użyta komenda „Move toward Player” to zobaczysz efekt ;) Więcej klatek ruchu To dość łatwe, pokażę jak to zrobić na przykładzie 6 klatek. Cel pierwszy: Sprite_Character. Linijka 47. @cw = bitmap.width / 4 To podział charsetu według szerokości, czyli animacji ruchu. Według naszego przykładu powinno być ich 6, tak więc to zmienimy. @cw = bitmap.width / 6 Cel drugi: Game_Character 2. Linijka 31. @pattern = (@pattern + 1) % 4 No i znowu to niewdzięczne 4, zmieńmy je na 6. @pattern = (@pattern + 1) % 6 No i to by było na tyle, ale niestety dla mnie to za mało i dodam coś jeszcze… Kolejność wyświetlania klatek. Omówię to jak najszybciej jak tylko się da. Nasz cel #2 (Game_Character 2. Linijka 31) ulegnie w tym przypadku lekkiej zmianie… Aby zrobić jakąś pogmatwaną kolejność potrzebujemy nowej zmiennej, która przejmie nad tym kontrolę – w moim przykładzie będzie to lokalna @anim. A więc zamiast linii 31 dajemy coś na ten wzór (przykład z mojego The Thinga): @anim = @anim % 8 @anim = @anim + 1 case @anim when 0 @pattern = 1 when 1 @pattern = 2 when 2 @pattern = 3 when 3 @pattern = 2 when 4 @pattern = 1 when 5 @pattern = 4 when 6 @pattern = 5 when 7 @pattern = 4 when 8 @pattern = 1 end "@anim = @anim % 8" - 8 to ilość klatek w całym cyklu. "@pattern = 1" Pamiętajcie o tym, że liczba 1 nie oznacza w tym przypadku pierwszej klatki, lecz drugą. W takim razie tą pierwszą byłoby 0, nie dając jej w naszej animacji możemy mieć efekt charsetu z klatką postoju ;3 I w ten sposób mamy dowolną kolejność w animacji. Teraz wystarczy dodać jedną rzecz… W Game_Character 1 pod linijką 31 („def initialize”) wklejmy “@anim = 0”. Na koniec słów kilka: Ludzie często potrzebują wielu prostych rzeczy (wynika to z działu pomocy xP) a w rzeczywistości wszystko jest w zasięgu naszej ręki. Jeśli wiesz gdzie szukać, częściowe zastąpienie Multiple Frames DerVVulfmana to nie problem. Do tych metod doszedłem sam, wyszukując to co potrzebne w Script Editorze i zmianianiem tego na mój zysk. Rezydent |
|