-
Postów
320 -
Dołączył
-
Ostatnia wizyta
-
Wygrane w rankingu
1
Typ zawartości
Profile
Forum
Wydarzenia
Odpowiedzi opublikowane przez pankracy
-
-
W dniu 4.07.2021 o 16:51, gnysek napisał:
Bardzo możliwe, aczkolwiek polecam też używanie move_contact_solid lub jakąś pętlę while, zeby idealnie o 1px dotknąć podłoża.
Co do funkcji move_contact_solid to widzę,że ona jest tylko dostępna w gms 2x chyba,że się mylę
Ok testuje...dałem warunek zaraz za wybiciem się gracza z trampoliny i zrobiłem to po with aby mieć pewność,że odwołam się do par_entity i jednak nie chce resetować mi dalej grawitacji do wartości domyślnych.
kod wygląda tak
obj_trampolina
step
if player_can_bounce == true && place_meeting(x,y,par_entity) { with instance_place(x,y,par_entity) { g = 0.5; //poczatek spowolnionej animacji hspd = lengthdir_x(1,other.image_angle+25)*other.pwr; vspd = lengthdir_y(1,other.image_angle+25)*other.pwr; if !place_free(x, y+1) and inAir = false { g = 1; //resetowanie grawitacji } } }
-
11 godzin temu, gnysek napisał:
To jest naprawdę za dużo kodu, żeby go analizować zwłaszcza, że może czegoś brakować.
Ale masz przykłady gier platformowych i tam jest jak resetować grawitację gdy dotkniesz podłoża (sprawdzasz czy jest obiekt solid poniżej y+speed, i uzywasz moce contact solid, żeby idealnie dotknąć).
Słusznie to jest za dużo kodu do analizowania.Nawet nie ma takiej potrzeby.
Przyszedł Mi do głowy taki pomysł.
A jakby dodać warunek
if !place_free(x, y+1) and inAir = false { g = 1; //resetowanie grawitacji }
i ustawić go w step trampoliny ale w części gdzie używa się with par_entity to odwoływałby się bezpośrednio do tej instancji.
-
W dniu 19.06.2021 o 20:41, Konrad-GM napisał:
Nie rozumiem, a to nie odtwarza się w całości czy jak, a ta animacja trwa aż 5 sekund?
Może wystarczy tylko sprawdzanie, czy stoi na ziemi? `if !place_free(x, y+1) g = 1.0;`
No dobrze...Trampolina już działa.Osiągnąłem taki efekt jaki chciałem.
Jednak trzeba było użyć alarmu i usunąć też kod z animation end który powodował zakończenie animacji.
Jednak dalej zastanawiam się,gdzie powinien znajdować się kod który resetowałby grawitacje bohatera jak już dotknie ziemi.
Nie chce w całej grze zmieniać tej grawitacji,bo jest ona prawidłowa chce tylko wyjątkowo dla tego JEDNEGO obiektu jakim jest trampolina zmienić grawitacje podczas skoku i zresetować ją jak już znajdzie się gracz na ziemi.
Chłopaki pomóżcie bo pomysły moje już wyczerpałem.
Za nic nie chce się zresetować animacja jak gracz dotknie ziemi.
kod trampoliny wygląda teraz tak
obj_trampolina
create
player_can_bounce = false; //startuje w spoczynku sprite_index = sprite1; //ustaw sprite odpowiadającego player_can_bounce pwr = 30; alarm[0] = room_speed * 5; //timer
Alarm[0]
if (sprite_index = spr_trampolina_idle) // aktualny stan bezczynnosc { sprite_index = spr_trampolina; // ustaw odbijający się sprite player_can_bounce = true; //„powiadomienie”, że gracz może się odbić alarm[0]=room_speed * 1; // sprawdź alarm0 ponownie po 1 sekundzie } else if (sprite_index = spr_trampolina) // aktualny stan odbicie { sprite_index = spr_trampolina_idle; // ustaw sprite spoczynku player_can_bounce = false; // „powiadomienie”, że gracz NIE może się odbić alarm[0]=room_speed * 3; // sprawdź alarm0 ponownie po 3 sekundach }
Step
if player_can_bounce == true && place_meeting(x,y,par_entity) { with instance_place(x,y,par_entity) { g = 0.5; // ustawiam spowolniona grawitacje podczas skoku bohatera hspd = lengthdir_x(1,other.image_angle+25)*other.pwr; vspd = lengthdir_y(1,other.image_angle+25)*other.pwr; } }
par_entity (obiekt rodzic z którego dziedziczy bohater ,wrogowie i obiekty w grze)
End step
///Fizyka if bbox_left+sign(hspd) < 0 || bbox_right+sign(hspd) >= room_width { hspd = 0; x = clamp(x,x-bbox_left,room_width-1-(bbox_right-x)); } if unstick(4) > 8 { instance_destroy(); } hspd += hspdB; for(i=0;i<abs(hspd);i++) { if solid_place(x+sign(hspd),y) { if solid_place(x+sign(hspd),y-1) || inAir == true { if solid_place(x+sign(hspd),y-2) || inAir == true { hspd = 0; } else { x += sign(hspd); y -= 2; hspd -= sign(hspd)/2; } } else { x += sign(hspd); y -= 1; hspd -= sign(hspd)/3; } } else { x += sign(hspd); if inAir == false && !solid_place(x,y+1) && solid_place(x,y+2) { y += 1; g = 1;// } else if inAir == false && !solid_place(x,y+2) && solid_place(x,y+3) { if !solid_place(x,y+1) { y += 1; g = 1;// } if !solid_place(x,y+1) { y += 1; g = 1;// } } } } hspd -= hspdB; hspdB = 0; if inWater == false { //Tarcie if hspd > 0 { hspd = max(0,hspd-f*multiF); } else if hspd < 0 { hspd = min(0,hspd+f*multiF); } //Vertykalne tarcie if vF == true { if vspd > 0 { vspd = max(0,vspd-f*multiF); } else if vspd < 0 { vspd = min(0,vspd+f*multiF); } } //Grawitacja vspd += g*multiG; } else { //Tarcie w wodzie hspd = lerp(hspd,0,.1); if abs(hspd) < .2 { hspd = 0; } vspd = lerp(vspd,0,.1); if abs(vspd) < .2 { vspd = 0; } } multiF = 1; multiG = 1; inAir = true; vspd += vspdB; for(i=0;i<abs(vspd);i+=1) { if solid_place(x,y+sign(vspd)) { if vspd > 0 { var slope = getSlopeInclination(); if slope <= -2 && slope >= -8 { x -= 1; hspd -= 1; i -= 1; } else if slope >= 2 && slope <= 8 { x += 1; hspd += 1; i -= 1; } else { vspd = 0; inAir = false; } } else { vspd = 0; } } else { y += sign(vspd); } } vspd -= vspdB; vspdB = 0; if inWater != place_meeting(x,y-sprite_height/3,obj_water) { inWater = !inWater; if inWater == true { vspd /= 2; hspd /= 2; } }
Dziękuję
-
1 godzinę temu, gnysek napisał:
Ja generalnie jestem za tworzeniem tzw. flag, czyli zmiennej, która stwierdza, czy coś jest czy nie. I tak bym zrobił kod. Tzn. całość w tym stylu, żeby było czytelniej:
// pseudokod // 1. najpierw ustal stany postaci if (costam lub costam lub costam) { plywanie = true; } else { plywanie = false; } // 2. potem reaguj na nie // logika od ruchu, animacji itd. var predkosc_poruszania = plywanie ? 0.5 : 4; // 0.5 jak pływamy, 4 jak nie pływamy var ruch_poziomo = -keyboard_check(vk_left) + keyboard_check(vk_right); // zwróci -1, 0 lub 1 x += predkosc_poruszania * ruch_poziomo; if (plywanie = true) { if (sprite_index != spr_plywa) { sprite_index = spr_plywa; image_index = 0; image_speed = 0.2; } } else { ... // itd. }
W ten sposób trudniej się pogubić, poza tym mając zmienną od stanów, łatwiej je wymuszać i zmieniać w innych przypadkach, a nie zmieniamy zachowania (można np. włączyć pływanie podchodząc do drabinki, czy drzwi, czy wymusić na początku etapu - spoza step tego obiektu).
Dzięki chłopaki za pomoc.
Twój kod jest bardziej czytelniejszy dla mnie.
-
Dzięki Chłopaki to było to.
a powiedzcie mi jak najprościej rozdzielić ten kod aby były dwa stany animacji bohatera.
1. Jak w wodzie jest w spoczynku i nie wykonuje żadnego ruchu
2 Jak w wodzie wykonuje ruch
-
Używalem już.
I tylko działa to kiedy graczem bedąc w wodzie nie wykonuje ruchów lewo prawo góra dół.Jak się poruszę w wodzie obojetnie w jakim kierunku to wtedy przyspiesza animacja sprita.To jest ten problem
-
Witam serdecznie wszystkich:-)
Kod działa ok ale nie wiem gdzie ustawić animację bohatera kiedy pływa w wodzie.
Kiedy jest bohater w wodzie nieruchomy(idle) to jest ok bo ustawiam tam image_speed z konkretną wartością ale jak poruszam się z nim w wodzie to wtedy jest ta animacja sprita za szybka i to właśnie chciałbym spowolnić.
Poniżej kod
obj_player
Step
//Plywanie swimDir = point_direction(0,0,keyboard_check(kRight)-keyboard_check(kLeft),keyboard_check(kDown)-keyboard_check(kUp)); if abs(keyboard_check(kRight)-keyboard_check(kLeft))+abs(keyboard_check(kDown)-keyboard_check(kUp)) != 0 { hspd += lengthdir_x(.5,swimDir); if !(swimDir > 0 && swimDir < 180) || place_meeting(x,y-sprite_height/3-1,obj_water) { vspd += lengthdir_y(.5,swimDir); } } if keyboard_check(kUp) && !place_meeting(x,y-sprite_height/1.5,obj_water) && vspd <= 0 { vspd = -12; } }
End Step
if sprite_index != spr_hero_water { sprite_index = spr_hero_water; image_index = 0; image_speed = 1; //ustawiam animacje plywania kiedy gracz jest w bezruchu w wodzie } if keyboard_check(kRight) && !keyboard_check(kLeft) && image_xscale = -1 { image_xscale = 1; drawAngle -= 180; } else if keyboard_check(kLeft) && !keyboard_check(kRight) && image_xscale = 1 { image_xscale = -1; drawAngle += 180; } if abs(keyboard_check(kRight)-keyboard_check(kLeft))+abs(keyboard_check(kDown)-keyboard_check(kUp)) != 0 { image_index += 2; if image_xscale > 0 { drawAngle -= angle_difference(drawAngle,swimDir)/16; } else { drawAngle -= angle_difference(drawAngle,180+swimDir)/16; } } }
Dziękuję za każdą pomoc
-
12 godzin temu, Konrad-GM napisał:
Nie rozumiem, a to nie odtwarza się w całości czy jak, a ta animacja trwa aż 5 sekund?
Może wystarczy tylko sprawdzanie, czy stoi na ziemi? `if !place_free(x, y+1) g = 1.0;`
Ta animacja ma się odtwarzać w całości co 5 sekund.
Ona nie trwa 5 sekund.Ma tylko odtwarzać się co 5 sekund.
Coś jak na zasadzie przycisku wł i wył
Reasumując
Trampolina zaczyna od stanu spoczynku i w stanie spoczynku ma się nie odtwarzać animacja następnie mija 5 sekund i animacja trampoliny powinna wtedy w całości się odtworzyć i jak skończy w całości się odtwarzać to znów przechodzi w stan spoczynku i tak wkółko:-)
edycja 1
Jak wyłączę kod w zdarzeniu Animation END to animacja trampoliny działa jest odtwarzana,ale jakby w pętli,a powinna odtworzyć się w całości następnie 5 sekund powinna być w stanie spoczynku i na początkowej klatce i znów po 5 sekundach w całości się odtworzyć.
Stąd właśnie był ten pomysł aby można było odbić się z trampoliny dopiero po 5 sekundach w chwili kiedy jest odtwarzana animacja.Jak nie jest odtwarzana animacja trampoliny to nie można się od niej odbić.
Co do grawitacji..place_free nie wiem czemu nie działa a ustawiam go w zdarzeniu step obiektu par_entity
Kod w całości wygląda teraz tak
obj_trampolina
create
start = false; pwr = 152; image_speed = 2;//bo chcemy żeby animacja była odtwarzana
Alarm[0]
start = false;
Step
if start == false && place_meeting(x,y,par_entity) { alarm[0] = room_speed * 5 start = true; with instance_place(x,y,par_entity) { g = 0.5;//zmniejszona grawitacja podczas odbicia się gracza od trampoliny hspd = lengthdir_x(1,other.image_angle+25)*other.pwr; vspd = lengthdir_y(1,other.image_angle+25)*other.pwr; } image_speed = 1; // tu nie wiem czy to jest potrzebne }
Animation END
///wylaczylem ten kod bo jak jest wlaczony to nie chce sie animacja trampoliny odtwarzac /* image_index = 0; image_speed = 0;
par_entity
create
g = 1; //grawitacja hp = 999999999; maxHp = 999999999; vspd = 0; hspd = 0; inAir = false; inWater = false;
par_entity
Step
if !place_free(x, y+1) { g = 1; //resetowanie grawitacji }
-
21 godzin temu, Konrad-GM napisał:
`if obj_trampolina == false && place_meeting(x,y,par_entity)` serio?
Nie tu jest błąd
Tak miało być
`if start == false && place_meeting(x,y,par_entity)
21 godzin temu, Konrad-GM napisał:`if obj_trampolina == false && place_meeting(x,y,par_entity)` serio?
Mam tak ale nadal trampolina co pięc sekund nie uaktywnia się jej animacja i gracz może cały czas od niej się odbić a ma się odbić tylko wtedy kiedy odtwarza się jej animacja
obj_trampolina
create
start = false; pwr = 152; image_speed = 2;//bo chcemy żeby animacja była odtwarzana
Alarm[0]
start = false
Step
if start == false && place_meeting(x,y,par_entity) { alarm[0] = room_speed * 5 start = true; with instance_place(x,y,par_entity) { g = 0.5; hspd = lengthdir_x(1,other.image_angle+25)*other.pwr; vspd = lengthdir_y(1,other.image_angle+25)*other.pwr; } image_speed = 1; }
Animation End
image_index = 0; image_speed = 0;
Edycja 1
Ok działa teraz co 5 sekund możliwość odbicja się od trampoliny,ale nie działa:
- animacja która powinna być odtwarzana co 5 sekund w całości
- zresetować grawitacje mam bezpośrednio w instancji par_entity ok ale jak konkretnie ma to wyglądać?
-
Godzinę temu, Konrad-GM napisał:
To dodaj zmienną `start` w Create obj_trampolina. Jeżeli ten obiekt dziedziczy z innego obiektu Create, to na początku skryptu użyj event_inherited() to wtedy Create rodzica również zostanie wywołany.
Nie, bo zmienna `start` będzie widoczna tylko i wyłącznie w tym bloku kodu, jak tylko go opuści to zostanie usunięta - nie będzie miała żadnej wartości, ani true ani false, przestanie kompletnie istnieć.
Polecam przejrzeć:
https://docs.yoyogames.com/source/dadiospice/002_reference/001_gml language overview/variables/index.html - w tym podartykuły instance variables oraz local variables.Już dodawałem w trampolinie w zdarzeniu create zmienna start to nie pomaga zarówno jak ja ustawie na false czy true.
Chyba że musze ją wtedy z bloku kodu step trampoliny usunąć?
-
31 minut temu, Konrad-GM napisał:
W kodzie Step nie masz ustawianej flagi `start = true` więc technicznie flaga nigdy się nie zmienia. Wstaw `start = true` zaraz pod `alarm[0] = room_speed * 5`. Dodatkowo w Step nie sprawdzasz czy `start == false` żeby uruchomić blok odpowiedzialny za skok. Np. `if start == false && place_meeting(x,y,par_entity) {`.
tak nie zadziała,bo nie będę miał zdeklarowanej zmiennej w create trampoliny i wywali mi komunikat o braku zmiennej start.
Chyba,że użyć var w step zdarzenia i dodać zmienną start?
stepif obj_trampolina == false && place_meeting(x,y,par_entity) { alarm[0] = room_speed * 5 start = true; with instance_place(x,y,par_entity) { g = 0.5; hspd = lengthdir_x(1,other.image_angle+25)*other.pwr; vspd = lengthdir_y(1,other.image_angle+25)*other.pwr; } image_speed = 1; }
-
3 godziny temu, Konrad-GM napisał:
Tak, jest to jak najbardziej poprawne.
obj_trampolina zmienia grawitację tylko wyłącznie kiedy dotknie par_entity, imo najlepiej byłoby przywrócić wartość w Step par_entity kiedy opadnie już na ziemię.
No właśnie...a jak oblicze moment kiedy gracz znajdzie się na ziemi?
a może dodać obiekt który jest solidem? mam obj_wall on jest solidem
dodać w zdarzeniu step w trampolinie warunek,że jak dotknie obj_wall to grawitacja będzie wynosiła wartość 1?
kod nie działa. Nadal animacja trampoliny nie jest odtwarzana co 5 sekund i w trakcie trwania animacji gracz może odbić się od trampoliny.
może jeszcze flaga start musi być gdzieś zdefiniowana a nie tylko w alarmie0?
obj_trampolina
create
pwr = 152; image_speed = 2;//bo chcemy żeby animacja była odtwarzana
Alarm[0]
start = false
step
if place_meeting(x,y,par_entity) { alarm[0] = room_speed * 5 with instance_place(x,y,par_entity) { g=0.5; //ustawiamy podczas skoku grawitacje wolniej aby gracz się przemieszczał hspd=lengthdir_x(1,other.image_angle+45)*other.pwr; vspd=lengthdir_y(1,other.image_angle+45)*other.pwr; audio_play_sound(snd_trampolina, 10, false); } image_speed = 1; }
Animation End
image_index = 0; image_speed = 0;
-
?
6 godzin temu, Konrad-GM napisał:Słuszne jest zmiana grawitacji po bloku with par_entity prawda? Bo wtedy odwołamy się bezpośrednio do tej instancji
if place_meeting(x,y,par_entity) { alarm[0] = room_speed * 5 with instance_place(x,y,par_entity) { g=0.5; hspd=lengthdir_x(1,other.image_angle+45)*other.pwr; vspd=lengthdir_y(1,other.image_angle+45)*other.pwr; audio_play_sound(snd_trampolina, 10, false); } image_speed = 1; }
Teraz pytanie gdzie powinno się resetować grawitacje do wartości 1
-
52 minuty temu, Konrad-GM napisał:
Dlatego nie ustawiaj tej wartości w create
Wiesz w ogóle do czego służy blok with i dlaczego właśnie tam ustawiasz hspd i vspd instancji par_entity? Czy nagle wszystkie obiekty na ekranie skaczą wraz z graczem?Oczywiście, że wiem
With tyczy się konkretnej instancji do ktorej chcemy się odwołać bedąc w innej:-)
Chyba mówimy o dwóch róznych rzeczach:-)
Poprzedzajac with plus instancja do której chcemy się odwołać w innej instancji ma to wtedy sens zmiana wartości jakiejś zmiennej bo nie zmienimy tej wartości dla wszystkich obiektów tylko dla tej jednej do której się odwołaliśmy.
-
6 minut temu, Konrad-GM napisał:
Ale nie dziedziczą tych samych stanów, każda instancja tworzy własną wersję zmiennej `g` (jedynie na podstawie obiektu par_entity).
Hmmm na to wygląda,ale jeśli ja zmienie w par_entity w zdarzeniu create wartość grawitacji
g=1; na g=0.5; to będę jak Amstrong na Księżycu Konradzie.
Może inaczej co musiałbym teraz zrobić aby nie popsuć grawitacji?
a jednocześnie mógł skorzystać z wolniejszej grawitacji przy tej trampolinie co wyżej a jak wyląduje powinno się zresetować do grawitacji jaką mam obecnie.
-
45 minut temu, Konrad-GM napisał:
A to zmienna `g` jest zmienną globalną?
Konradzie zmienną globalną nie jest,ale z obiektu dziedziczącego par_entity korzysta praktycznie każdy obiekt bo dziedziczą z niego.
Dlatego jak tam zmienię wartość
g=1; na g=0.5; to gracz i obiekty wrogowie będą zachowywać się jakby wykonywali spacer na księżycu ?
-
16 godzin temu, Konrad-GM napisał:
W takim razie musisz dodać Alarm w obiekcie obj_trampolina, np. dodaj zdarzenie Alarm[0] i w nim wstaw blok kodu resetujący flagę `start = false`. Generalnie polega to na tym, że teraz Animation End nas nie interesuje, tylko czas, więc w Animation End możesz zatrzymać animację `image_speed = 0` ale nie zmieniaj flagi `start` - to zrobi Alarm[0] po 5 sekundach.
No ok, ale teraz ustawiasz zmienną `g = 0.5` w instancji obj_trampolina, zamiast w par_entity, dlatego to nie zadziała. Ustaw grawitację w instancji par_entity, przecież od tego masz blok `with instance_place(x,y,par_entity)` który tak jak hspd i vspd ustawi również zmienną `g` tylko wyłącznie w instancji par_entity dotykającej trampoliny. Natomiast resetować grawitację musisz w kodzie par_entity, bo obj_trampolina nie ma pojęcia o stanie obiektu par_entity po X czasie, jak np. czy po dwóch sekundach par_entity stoi na ziemi, czy jeszcze fruwa.
Dodatkowo w bloku `if place_meeting(x,y,par_entity)` (ale nie w `with instance_place(x,y,par_entity)`) ustawiaj Alarm, jeżeli cooldown ma trwać 5 sekund - `alarm[0] = room_speed * 5`. Mnożymy room_speed (1 sekunda) z wartością 5, to otrzymamy 5 sekund.Obj_trampolina
Create
pwr = 152; image_speed = 2;//bo chcemy żeby animacja była odtwarzana
Alarm[0]
start = false
Tyle zrozumiałem;-) powyżej jest dobrze?
teraz tak ustawienie grawitacji muszę
Step
if place_meeting(x,y,par_entity) { alarm[0] = room_speed * 5 with instance_place(x,y,par_entity) { hspd=lengthdir_x(1,other.image_angle+45)*other.pwr; vspd=lengthdir_y(1,other.image_angle+45)*other.pwr; audio_play_sound(snd_trampolina, 10, false); } image_speed = 1; }
Animation end
image_index = 0; image_speed = 0;
I teraz grawitacja.
w par_entity mam ją ustawioną na 1 więc tu mam ją ustawić za przełącznikiem with instance_place(x,y,par_entity)? bo jak wspomniałem jak grawitacje zmienię na 0.5 w samej instancji par_entity to mi się zmieni w całej grze a tego nie chce :-)
No i pozostaje kwestia zresetowania grawitacji na wartość 1 jak już wyląduje gracz dotknie ziemi.
-
18 minut temu, Konrad-GM napisał:
A to masz na myśli cooldown? Że gracz może ponownie użyć trampoliny PO 5 sekundach jej użycia, czy jedynie podczas trwania animacji, ale która jest odtwarzana CO 5 sekund?
No grawitacją steruj już w Step par_entity, w kodzie gdzie sprawdzasz czy obiekt stoi na ziemi ustawiaj pierwotną wartość grawitacji `gravity = 1.0`. A ustawienie połowy grawitacji ustawiaj w kodzie, gdzie sterujesz trampoliną i ustawiasz graczowi prędkość odbicia, czyli w Step obj_trampolina, w bloku if place_meeting.
Jak masz if place_meeting w obj_trampolina, to tam przy okazji możesz też odtworzyć dźwięk.
Dokładnie tak mam na myśli cooldown.
Co do grawitacji fakt w obiekcie dziedziczacym par_entity tam musze grawitacje zostawić na wartości g = 1; bo inaczej zmieni mi się w całej grze.Natomiast mam ją jak napisałeś sterować w trampolinie w zdarzeniu step
If place_meeting(x,y,par_entity) {
g = 0.5;
with instance_place(x,y,par_entity) {
hspd=lengthdir_x(1,other.image_angle+45)*other.pwr;
vspd=lengthdir_y(1,other.image_angle+45)*other.pwr; audio_play_sound(snd_trampolina, 10, false); }
image_speed = 1; }
Tylko teraz dobrze ustawić w bloku kodu grawitacje z powrotem na wartość 1 jak dotknie podłoża.
-
-
4 godziny temu, Konrad-GM napisał:
Przejrzałem dokumentację i faktycznie nie ma tego zdarzenia, to musisz w takim razie ustawiać flagę w miejscu, gdzie uruchamiasz animację.
To już zależy jak będzie działać w tym wypadku, w if z place_meeting możesz ustawiać grawitację i resetować ją w kodzie Step par_entity jak "stoi" na ziemii.
return nie musi przyjmować wartości, w tym wypadku przerwie całe zdarzenie Step. Jeżeli masz więcej bloków ze skryptami, to możesz użyć break, to powinno przerwać pojedynczy blok.
A dałbyś radę pomóc mi to w całość złożyć?
Bo chodzi o to przypomne że gracz powinien mieć możliwość odbicia się od trampoliny dopiero jak animacja trampoliny się pokaże.
I ta animacja powinna np co 5 sekund się pokazywać potem stan spoczynku i wtedy nie może się gracz odbić i po 5 sekundach animacja się wyswietli to wtedy może się odbić od trampoliny.
Grawitacja wtedy powinna zwolnić o połowę a jak wyladuje to wrócić do pierwotnego stanu.
Dźwięk trampoliny powinien być odtwarzany w chwili wyświetlania animacji.
-
58 minut temu, Konrad-GM napisał:
Przejrzałem dokumentację i faktycznie nie ma tego zdarzenia, to musisz w takim razie ustawiać flagę w miejscu, gdzie uruchamiasz animację.
To już zależy jak będzie działać w tym wypadku, w if z place_meeting możesz ustawiać grawitację i resetować ją w kodzie Step par_entity jak "stoi" na ziemii.
return nie musi przyjmować wartości, w tym wypadku przerwie całe zdarzenie Step. Jeżeli masz więcej bloków ze skryptami, to możesz użyć break, to powinno przerwać pojedynczy blok.
Jak nie dam żadnej wartości w return to wyrzuci błąd.
Stąd moje pytanie odnośnie dodania wartości.
Ok mogę dodać na koniec warunku break;
Chociaż nie wiem czy to nie powinno być używane ze switch;
Teraz tak:
Mój kod jest tak skonstruowany że animacja uruchamia się dopiero z zetknięciem gracza z trampoliną a kończy się w zdarzeniu Animation End.
Kurcze nie mam pomysłu na to.
-
-
Dobra teraz widzę,że nie mam eventu Animation Start.jest tylko Animation End,update,event
-
2 godziny temu, Konrad-GM napisał:
Kod w Step obj_trampolina zostaw, dodaj flagę `start` w Create trampoliny, ustaw ją na `true` w zdarzeniu Animation Start a `false` po zakończeniu animacji (w zdarzeniu Animation End). Dodatkowo kod w Step wzbogać o sprawdzanie flagi start np. dodając na początku `if (start == false) return;`.
Jeżeli ma wolniej opadać, to tak, pozostaje modyfikacja grawitacji. Możesz też np. zresetować grawitację (z np. 0.5 do 1.0) po dotknięciu podłoża.
Obj_trampolina
Create
image_speed = 0;
start = true;
pwr = 152;
Step
if (start == false) return 0;// jaka powinna być tu wartość?
if place_meeting(x,y,par_entity) {
with instance_place(x,y,par_entity) {
hspd=lengthdir_x(1,other.image_angle+45)*other.pwr;
vspd=lengthdir_y(1,other.image_angle+45)*other.pwr; audio_play_sound(snd_trampolina, 10, false); }
image_speed = 1; }
Animation start
start = true;
Animation end
start = false;
image_index = 0;
image_speed = 0;
Pisze z telefonu.
Teraz grawitacje musiałbym ustawić w zdarzeniu step? I dodać warunek przy place_meeting że jak odbije się gracz to grawitacja zwolni na 0.5 a jak dotknie podłoża zresetuje się do wartości początkowej 1.
Nie używałem funkcji return tam powinna być wartość 0??
Trampolina paraboliczna
w GM:Studio 1.x
Opublikowano
Gnysku,a jakby to wszystko wyrzucić z trampoliny i na nowo stworzyć ten kod.
Jakbyś zaproponował swoje rozwiązanie?