Skocz do zawartości

Rysuj pole..


Gość

Rekomendowane odpowiedzi

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: onimaru.png.

Mapa jest zrobiona w izometrii, wygląda tak: onimaru2.png.

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

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

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

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

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

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

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

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

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

@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

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

83778796.png

GML
image_speed = 0.1;

object1

36351948.png

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ść:

77229073.png

Odnośnik do komentarza
Udostępnij na innych stronach

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

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

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

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

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ę
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...