Gość Opublikowano 7 Sierpnia 2010 Udostępnij Opublikowano 7 Sierpnia 2010 Cześć, tu znów ja "boże co za lama". Mam kolejny problem.. chcę zrobić, że kiedy zaznaczenie dla obiektu "HERO" jest TRUE, zostało narysowane pole, używając "sprite18". Wyglądać to ma mniej więcej tak: . Mapa jest zrobiona w izometrii, wygląda tak: . Chcę, aby to zaznaczenie było napisane w Scripts i było po prostu wyzwalane(rysowałoby niebieskie pole z małych niebieskich pól, o wymiarach 32x16, a środek byłby pod obiektem, który jest ZAZNACZONY). Początek skryptu zacząłem tak: GML if variable_local_get(zaznaczony) = true then ale już wiem, że to "variable_local_get(zaznaczony)==true" jest źle napisane, nie wiem jak mam napisać skrypt w stylu: IF variable(zaznaczony) is/== true then... Niestety, nie wiem też, co mam napisać, aby poukładało mi takie pole z mniejszych pól w izometrii :/ Jeśli ktoś mi pomoże, będę naprawdę wdzięczny. Z góry dzięki. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Uzjel Opublikowano 7 Sierpnia 2010 Udostępnij Opublikowano 7 Sierpnia 2010 GML if variable_local_exists("zaznaczony") = true { draw_sprite(nazwa_sprita,0,x,y+32) //np } Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Gość Opublikowano 7 Sierpnia 2010 Udostępnij Opublikowano 7 Sierpnia 2010 GML Error in code at line 7: variable_local_set(zaznaczony,yes) ^ at position 32: Unknown variable yes pff.. mam w bazę danych wpisać yes, czy co? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
GMTraker Opublikowano 7 Sierpnia 2010 Udostępnij Opublikowano 7 Sierpnia 2010 nie, masz dać 1 zamiast yes Unknown variable yes to oznacza że zmienna nie jest znana, musisz ją wcześniej zdefiniować, poza tym w gmlu jak chcesz coś potwierdzić dajesz 1, a gdy zanegować dajesz 0 Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
candy Opublikowano 7 Sierpnia 2010 Udostępnij Opublikowano 7 Sierpnia 2010 Komunikat ten oznacza, że nie zadeklarowałeś zmiennej yes. Zanim odwołasz się do zmiennej musisz ją zadeklarować. Co do tworzenia tego niebieskiego pola, z mniejszych kwadracików. Według mnie najlepiej jest skorzystać z, znienawidzonej przez wszystkich, rekurencji. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Gość Opublikowano 7 Sierpnia 2010 Udostępnij Opublikowano 7 Sierpnia 2010 A więc jak w gml'u użyć rekurencji? @edit A teraz kolejny problem, sprite18, owszem, rysuje się.. ale jest pod tilesetem.. da się jakoś zmienić priorytet, żeby sprite 18 był nad tilesetem, ale pod innymi obiektami? @edit2 Achh... coś się zdupcyło.. nie pojawia się sprite18, a jedynie grafika wskaźnika.. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
candy Opublikowano 7 Sierpnia 2010 Udostępnij Opublikowano 7 Sierpnia 2010 Załóżmy, że mamy funkcję f_dodaj(x). Dodaje ona do siebie kolejne liczby naturalne od 1 do x. X to wartość wpisana przez Ciebie. Dajmy, że x=5. GML a=0; a=f_dodaj(5);//pierwsze wywołanie funkcji</span> W script f_dodaj piszemy: GML if(argument0) argument0+=f_dodaj(argument0-1); /*else return argument0;*/ Pierwsza linijka sprawdza czy mamy wykonać kolejną rekurencję. W naszym przypadku chcemy dodawać do siebie liczby z przedziału [1,x], więc naszym warunkiem jest sprawdzenie czy kolejna liczba, którą chcemy dodać jest nieujemna. Gdy nie jest, wykonujemy dalej rekurencję, z tą różnicą, że nasz argument zmalał o 1. Gdybyśmy nie dali żadnego warunku sprawdzającego, rekurencja zachowywała by się jak pętla: GML while(true) a+=1; Argument0 to cyfra którą wpisaliśmy w pierwszym odwołaniu. Możesz maksymalnie wpisać 16 argumentów. Ostatnie dwie linijki nie są potrzebne, ale czasem łatwiej jest zwracać wartość funkcji poprzez return, ponieważ zatrzymuje to dalsze wykonywanie funkcji. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Gość Opublikowano 7 Sierpnia 2010 Udostępnij Opublikowano 7 Sierpnia 2010 Hmm.. faktycznie rekurencja by mi się przydała.. tylko muszę obczaić jak ją użyć i połączyć z draw.. jestem zielony z GML'a więc trochę mi to zajmie :P A tak przy okazji.. może ktoś mi pomóc ułożyć ten skrypt: GML if place_meeting(x,y,hero) { if keyboard_check_pressed(vk_enter) or keyboard_check_pressed(ord('Z')) { with (hero) if sprite_index=sprite0 with (hero) sprite_index=sprite11 with (hero) variable_local_set(zaznaczony,1) with (hero) draw_battle_field() if keyboard_check_pressed(vk_enter) or keyboard_check_pressed(ord('Z')) with (hero) if sprite_index=sprite11 with (hero) sprite_index=sprite0 with (hero) variable_local_set(zaznaczony,0) } } wiem, że to odrazu zmienia grafikę HERO, ale czy dałoby się ustawić to w jednym skrypcie? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Makary155 Opublikowano 8 Sierpnia 2010 Udostępnij Opublikowano 8 Sierpnia 2010 Te wszystkie with są niepotrzebne. Wystarczy raz, a reszte kodu objąć w {klamry}. Poza tym variable_local_set("zaznaczony", 1) możesz zapisać jako zaznaczony=1 Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Danielus Opublikowano 8 Sierpnia 2010 Udostępnij Opublikowano 8 Sierpnia 2010 po co Ci te wszystkie funkcje z variable... Wartośc nadajesz pisząc po prostu: GML zmienna=1 jeśli chcesz w warunku porównac coś to pisz GML if( zmienna==1 ) { //akcje } w tym skrypcie co dałeś zamiat tylu withow daj GML with (hero) { if( sprite_index=sprite0 ) then sprite_index=sprite11; zaznaczony=1; draw_battle_field(); } i analogicznie druga czesc withow. W warunkach jeśli masz tylko jedną akcje to możesz używac then, ale jeśli jest ich więcej musisz uzyc klamer np GML if( a=0 ) then a=1 GML if( a=1 ) { a=2; sprite_index=jakis_sprite; } Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Muuuuczek567 Opublikowano 8 Sierpnia 2010 Udostępnij Opublikowano 8 Sierpnia 2010 candy, wcale nie trzeba używać rekurencji. Skrypt rysuj_pole: GML if(zaznaczony) { for(i = -2.5; i <= 2.5; i += 1) draw_sprite(sprite18,0,x-i*32,y-i*16) for(i = -2; i <= 2; i += 1) draw_sprite(sprite18,0,x-i*32,y-i*16) } Żeby pola rysowało pod obiektami, trzeba zrobić obiekt, który ma wartośc depth pomiędzy tilesetem i obiektami, a w Draw tego obiektu: GML with(hero) rysuj_pole() Jeśli cos sknociłem, to daj znać :) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Morro Opublikowano 8 Sierpnia 2010 Udostępnij Opublikowano 8 Sierpnia 2010 Mały offtop Co to za gra na tym pierwszym obrazku? (podobna do tactics ogre: knight of lodis) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
candy Opublikowano 8 Sierpnia 2010 Udostępnij Opublikowano 8 Sierpnia 2010 Dobra, a co się stanie gdy najedziesz na przeszkodę. Zasięg gracza zmaleje. Tworząc pola za pomocą pętli może się wtedy okazać trudne. Nawet jeżeli przeskoczysz przeszkodę, nie wiesz czy gracz będzie mógł w ogóle wejść na to pole za nią (przed, obok, zależy od strony). Robiąc to za pomocą rekurencji nie musisz się o to martwić. Zaczynasz od pola, na którym stoi gracz. Potem sprawdzasz cztery sąsiednie pola czy są wolne. Jak tak, tworzysz obj_pole i sprawdzasz jego cztery sąsiednie pola. A jak nie jest, przerywamy działanie funkcji dla danego pola. Tym sposobem zaznaczymy wszystkie możliwe pola, na które może wejść postać. Chyba, że udało Ci się to zrobić za pomocą pętli (ja się tego nie podejmuję). Ale i tak wydaję mi się, że rekurencja w tym przypadku jest o wiele łatwiejsza do zrobienia niż zabawa z pętlami. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Muuuuczek567 Opublikowano 8 Sierpnia 2010 Udostępnij Opublikowano 8 Sierpnia 2010 Pomijając już, że rekurencja jest o wiele wolniejsza i że w pętli można po prostu sprawdzić, czy przypadkiem nie ma w linii prostej od bohatera przeszkody. Aha, i zmieniam kod: GML if(zaznaczony) { for(i = -2.5; i <= 2.5; i += 1) for(j = -2.5; j <= 2.5; j += 1) if(!collision_line(x,y,i*32,j*16,przeszkoda,1,1)) draw_sprite(sprite18,0,x-i*32,y-j*16) for(i = -2; i <= 2; i += 1) for(j = -2; j <= 2; j += 1) if(!collision_line(x,y,i*32,j*16,przeszkoda,1,1)) draw_sprite(sprite18,0,x-i*32,y-j*16) } To nie jest trudne. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Gość Opublikowano 8 Sierpnia 2010 Udostępnij Opublikowano 8 Sierpnia 2010 @Marro Onimusha Tactics ;) @Topic Nie umiem niestety użyć rekurencji, pomimo iż wyjaśniłeś to candy.. zobaczę na razie pentlówkę, jeśli nie będzie działać jak trzeba, to wrócę do rekurencji. Dzięki wszystkim za pomoc, jak coś nie będzie działać, to jeszcze napiszę ;) @edit Nie wiem już co mam robić... jeśli ma tylko rysować, to rysuje.. ale pod background'em.. jeśli natomiast ma wstawić obiekt, to ok.. działa, z tymże, nie umiem tego zasranego Depth ustawić, bo zmieniam wartości nawet na 1000.. ale co z tego, skoro nie ma różnicy? Usunąłem na razie "zaznaczenie". Pole rysuje tylko do przodu, na głowie bohatera, a zaznaczyć go można niestety nawet na małym skrawku głowy, więc muszę go pokawałkować i męczyć się, żeby ustawić wszystko jak trzeba.. http://www.speedyshare.com/files/23712841/onimusha.rar Wrzucam projekt, może ktoś go obejrzy.. :/ Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Danielus Opublikowano 8 Sierpnia 2010 Udostępnij Opublikowano 8 Sierpnia 2010 im mniejszy depth tym bardziej na górze jest rysowane ;) niestety nie mam gm8 wiec projektu nie zobacze^^ Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Gość Opublikowano 8 Sierpnia 2010 Udostępnij Opublikowano 8 Sierpnia 2010 To rozpiszę co i jak mam w tym projekcie: Scripts>draw_battle_field GML { for(i = -2.5; i <= 2.5; i += 1) instance_create(x-i*32,y-i*16,move_field) for(i = -2; i <= 2; i += 1) instance_create(x-i*32,y-i*16,move_field) } Objects>hero GML image_speed = 0.1; object1 GML if place_meeting(x,y,hero) { if keyboard_check_pressed(vk_enter) or keyboard_check_pressed(ord('Z')) { with (hero) sprite_index=sprite11 with (hero) draw_battle_field() } } Całość: Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Danielus Opublikowano 8 Sierpnia 2010 Udostępnij Opublikowano 8 Sierpnia 2010 No ale co Ci tu nie działa? tylko ten depth? Jeśli tak to tak jak mówiłem im mniejszy depth tym bardziej coś jest rysowane na górze czyli move_filed daj depth np -99 a hero -100 to hero będzie NAD move_field, jeśli dla hero dasz -50 to będzie POD move_field Analogicznie jesli nie będziesz tworzył nowych obiektów tylko będziesz wolał to rysowac to liczą się depthy tych obiektow w których jest to rysowanie Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Gość Opublikowano 8 Sierpnia 2010 Udostępnij Opublikowano 8 Sierpnia 2010 Depth już działa.. nie działa mi to, że pole tworzy się jako linia, i nie pod nogami bohatera, tylko kilka kratek wyżej: i to jest problemem :/ Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Danielus Opublikowano 8 Sierpnia 2010 Udostępnij Opublikowano 8 Sierpnia 2010 to w instance_create zmien zeby tworzylo o 1 do tylu albo o jeden w dol( albo x albo y, jak chcesz ) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Gość Opublikowano 8 Sierpnia 2010 Udostępnij Opublikowano 8 Sierpnia 2010 Jest jeszcze jeden problem.. wskaźnikiem mogę zaznaczyć postać, nawet po najechaniu na głowę, a zaznaczać ma tylko, kiedy najadę na nogi.. możesz coś mi doradzić, jak mam to zmienić? Z góry mówię, że nie chcę ciąć grafiki na kawałki.. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Danielus Opublikowano 8 Sierpnia 2010 Udostępnij Opublikowano 8 Sierpnia 2010 maska wez sobie skopiuj sprite bohater tylko zostaw tyle ile chcesz by mozna bylo klikac maske ustawiasz w obiekcie po lewej stronie Maski polegaja na tym że rysowany jest sprite normalnie ale kolizje i wszystko inne sprawdzane jest na masce. Ewentualnie możesz sprawdzic przy zaznaczaniu czy mouse_y nie jest za wysoko. postac ma wysokosc 20, a chcesz zeby mozna bylo klikac tylko do połowy to dajesz if( mouse_y>y-10 ){ //akcje } (tutaj orgin y musi byc ustawiony na nogach jesli jest gdzie indziej to trzeba to inaczej poustawiac ) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
candy Opublikowano 8 Sierpnia 2010 Udostępnij Opublikowano 8 Sierpnia 2010 Zrób postaci maskę. Robisz nowy sprite o tych samych rozmiarach co postaci. Rysujesz na nim pole, tak aby nakładało Ci się na nogi gracz. W okienku object gracz masz rozwijaną listę mask. Wybierz nowy stworzony sprite. Teraz wszystkie kolizje będą ograniczały się tylko do sprite'a maski, a nie do sprite'a postaci. E: Ups, za wolny jestem. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Gość Opublikowano 8 Sierpnia 2010 Udostępnij Opublikowano 8 Sierpnia 2010 Ok, działa :D Jeszcze tylko muszę skonfigurować ten durny skrypt na pole... Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto
Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.
Zarejestruj nowe konto
Załóż nowe konto. To bardzo proste!
Zarejestruj sięZaloguj się
Posiadasz już konto? Zaloguj się poniżej.
Zaloguj się