Skocz do zawartości

Trampolina paraboliczna


pankracy
 Udostępnij

Rekomendowane odpowiedzi

50 minut temu, pankracy napisał:

tak nie zadziała,bo nie będę miał zdeklarowanej zmiennej w create trampoliny i wywali mi komunikat o braku zmiennej start.

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.

 

50 minut temu, pankracy napisał:

Chyba,że użyć var w step zdarzenia i dodać zmienną start?

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.

  • Lubię (+1) 1
Odnośnik do komentarza
Udostępnij na innych stronach

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

 

Odnośnik do komentarza
Udostępnij na innych stronach

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

Odnośnik do komentarza
Udostępnij na innych stronach

W dniu 15.06.2021 o 21:34, pankracy napisał:

animacja która powinna być odtwarzana co 5 sekund w całości

Nie rozumiem, a to nie odtwarza się w całości czy jak, a ta animacja trwa aż 5 sekund?
 

W dniu 15.06.2021 o 21:34, pankracy napisał:

zresetować grawitacje mam bezpośrednio w instancji par_entity ok ale jak konkretnie ma to wyglądać?

Może wystarczy tylko sprawdzanie, czy stoi na ziemi? `if !place_free(x, y+1) g = 1.0;`

  • Lubię (+1) 1
Odnośnik do komentarza
Udostępnij na innych stronach

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 
  
  }

 

Odnośnik do komentarza
Udostępnij na innych stronach

  • 2 tygodnie później...
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ę

 

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

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ąć).

Odnośnik do komentarza
Udostępnij na innych stronach

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.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Bardzo możliwe, aczkolwiek polecam też używanie move_contact_solid lub jakąś pętlę while, zeby idealnie o 1px dotknąć podłoża.

  • Lubię (+1) 1
Odnośnik do komentarza
Udostępnij na innych stronach

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 
  
  }    

    }
            
}

 

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy
12 godzin temu, pankracy napisał:

Co do funkcji move_contact_solid to widzę,że ona jest tylko dostępna w gms 2x chyba,że się mylę

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.

 

12 godzin temu, pankracy napisał:

nie chce resetować mi dalej grawitacji do wartości domyślnych

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.

Odnośnik do komentarza
Udostępnij na innych stronach

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?

 

 

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Ja bym skorzystał z jakiegoś dostępnego w sieci przykładu, na pewno są z trampoliną czy skrzynką od której można się odbijać, i to bym wziął za bazę.

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ę
 Udostępnij

  • Ostatnio przeglądający   0 użytkowników

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