Skocz do zawartości

pankracy

Użytkownicy
  • Postów

    323
  • Rejestracja

  • Ostatnia wizyta

  • Wygrane w rankingu

    1

Odpowiedzi dodane przez pankracy

  1. W dniu 6.07.2021 o 10:30, gnysek napisał:

    Dostępna jest co najmniej od GameMakera 5.0, bo pamiętam ją jeszcze z tutoriali platgormówi drag'n'drop z 2003 roku, gdy zaczynałem przygodę z GameMakerem.

     

    Nie bardzo rozumiem ten kod. Nie wiem dlaczego kod od skoku jest w trampolinie, a nie w obiekcie postaci, do tego:

    - player_bounce nigdy się nie zmienia, wiec jak rozumiem ten warunek jest zawsze spełniony

    - jeśli par_entity to jest to co skacze na trampolinie, to jak spadnie, zawsze będzie jej dotykać, wiec i ten warunek jest spełniony

    - jak dla mnie zatem zawsze spełnione są oba warunku i zawsze ustawiasz hspeed i vspeed

     

    Wydaje mi sie, że kod jest zupełnie nie w tym miejscu, a to czy trampolina jest pod graczem czy nie, powinno być uwzględniane tam, gdzie jest kod od zwykłego skakania (o ile takowy w ogóle jest).

     

    Btw. dlaczego normalna grawitacja to 1, a nie 0? Np. domyślne GMowe gravity przecież jak ma wartość większą od 1, to dodaje do x i y: lengthdir_x/y(gravity, gravity_direction), wiec tylko 0 powoduje ustanie grawitacji.

     

    Gnysku,a jakby to wszystko wyrzucić z trampoliny i na nowo stworzyć ten kod.

    Jakbyś zaproponował swoje rozwiązanie?

     

     

  2. 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 
      
      }    
    
        }
                
    }

     

  3. 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.

  4. 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ę

     

  5. 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.

    • Lubię (+1) 1
  6. 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

  7. 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 
      
      }

     

  8. 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ć?

  9. 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ąć?

     

  10. 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?

     


    step

     

    if 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;
    }

     

  11. 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;

     

  12. 🙂

     

    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

  13. 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.

     

     

  14. 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.

  15. 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. 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.

     

  17. 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.

  18. 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.

     

  19. 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.

  20. 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??

×
×
  • Dodaj nową pozycję...