Skocz do zawartości
  • 0
gunarkill

Problem ze zmienną prędkością i 2 różnymi wartościami frykcji friction

Pytanie

Sprawa dotyczy Gamemaker studio 1.4

 

powiedzmy że jeżeli prędkość obiektu>0 prędkość=3 jeżeli prędkość=0 prędkość=1 (z tym oczywiście nie mam problemu)

 

Jednak chciałbym przy jednym i drugim założeniu mieć inną frykcje, no i tu zaczynają się schody, jak użyje tego w stepie to frykcja nie działa poprawne jeżeli jest zmienna :(

 

Ogólnie w skrócie chodzi żeby coś takiego podobnego działało:

 

if player.speed>0 {speed=3 friction=0.3}

if player.speed=0 {speed=1 friction=0.1}

 

chodzi tu o taki rodzaj bullet timeu jeżeli obiekt jest wolniejszy frykcja musi się też zmniejszyć bo inaczej obiekt zatrzyma się za szybko.

 

Z góry dzięki za pomoc :)

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

21 odpowiedzi na to pytanie

Rekomendowane odpowiedzi

  • 0

Tarcie to tarcie, a friction to friction, jest to wartość wbudowana i to o nią dokładnie mi chodzi. Więc nigdy jej nie przetłumaczę mądralo, chyba że:

 

https://translate.google.pl/?hl=pl#en/th/friction

 

po tajlandzku friction to แรงเสียดทาน :] Jeżeli to ci pomoże żeby mi pomóc, czekam...

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

Hmm... Wszystkie bullet time, slow motion i zatrzymanie czasu ja zawsze rozwiązuje poprzez jedną zmienną odpowiadającą za szybkość czasu.

 

Jeżeli zrobisz sobie globalna zmienną i będziesz przez nią przemnażał wszystko to efekt potrafi być świetny.

GML (gdzie w create)
global.timeSpeed=1

 

GML (step obiektu)
speed=spd*global.timeSpeed

 

Dzięki temu ustawienie global.timeSpeed=0 zatrzyma poruszanie wszystkiego, global.timeSpeed=0.5 spowolni obiekty dwukrotnie, a global.timeSpeed=2 sprawi że czas będzie płynąć 2 razy szybciej.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
Hmm... Wszystkie bullet time, slow motion i zatrzymanie czasu ja zawsze rozwiązuje poprzez jedną zmienną odpowiadającą za szybkość czasu.

 

Jeżeli zrobisz sobie globalna zmienną i będziesz przez nią przemnażał wszystko to efekt potrafi być świetny.

GML (gdzie w create)
global.timeSpeed=1

 

GML (step obiektu)
speed=spd*global.timeSpeed

 

Dzięki temu ustawienie global.timeSpeed=0 zatrzyma poruszanie wszystkiego, global.timeSpeed=0.5 spowolni obiekty dwukrotnie, a global.timeSpeed=2 sprawi że czas będzie płynąć 2 razy szybciej.

 

Tak tak jasne, jednak interesuje mnie zmiana Friction, bo jak się jej używa w stepie to się namnaża i obiekty za szybko się zatrzymują, chcę żeby zatrzymywały się zgodnie z czasem nie używając zmian prędkości gry, chce żeby główna postać poruszała się niezależnie. Prędkość nie jest tu problemem tylko wyhamowanie jej w 2 wariantach.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

W takim razie co jest nie tak? Wszystko co pokazałeś powinno działać. Nie będziemy mogli pomóc rozwiązać problemu którego nie potrafisz przekazać.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

nie działa poprawnie, to znaczy jak działa ? No i mam nadzieję, zę kod który podałeś nie znajduje się w obiekcie "player", oraz w evencie step a nie create :)

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

Czysto logicznie, ten kod nie moze byc w stepie:

GML
if player.speed>0 {speed=3 friction=0.3}

if player.speed=0 {speed=1 friction=0.1}

 

Bo zgodnie z tym kodem speed zawsze bedzie wynosic 3 i friction zawsze bedzie wynosic 0.3.

Przeciez przy speed=0 ustawiasz speed=1.

A speed=1 jest także speed>0, wiec zmieni speed na 3 i friction na 0.3.

A ze speed=3 jest speed>0 to gra juz na tym zostanie.

 

Edit:

I brzmisz śmiesznie mówiąć "frykcja" więc mów friction, jak już "tarcie" nie odpowiada.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
Czysto logicznie, ten kod nie moze byc w stepie:

GML
if player.speed>0 {speed=3 friction=0.3}

if player.speed=0 {speed=1 friction=0.1}

 

Bo zgodnie z tym kodem speed zawsze bedzie wynosic 3 i friction zawsze bedzie wynosic 0.3.

Przeciez przy speed=0 ustawiasz speed=1.

A speed=1 jest także speed>0, wiec zmieni speed na 3 i friction na 0.3.

A ze speed=3 jest speed>0 to gra juz na tym zostanie.

 

Edit:

I brzmisz śmiesznie mówiąć "frykcja" więc mów friction, jak już "tarcie" nie odpowiada.

 

Tak przyznaje się, źle to wszystko wytłumaczyłem.

 

Ogólnie pisałem już 30 wersji tego kodu a ten był tylko poglądowy czyli o co chodzi w skrócie.

 

Mam obiekt player (czyli główna postać gry) ona porusza się normalnie, kiedy to robi inne obiekty zwalniają (imitacja szybkiego bieganie), póki obiekty się cały czas poruszają zmiana prędkości nie jest problemem. Problemem jest kiedy np. coś wybucha i chce żeby odłamki się zatrzymywały, ale jeżeli postać biegnie frykcja będzie inna, niż kiedy czas płynie normalnie.

 

Kod jest wpisany w odłamki

 

if force=1 {speed=3; friction=0.3 force=0} //nadanie prędkości i odpowiedniej frykcji

var spd=speed //ma służyć do pomiaru prędkości żeby potem przenieść tą wartość

 

if player.speed>0 {speed=1 friction=0.1}

if player.speed=0 {speed=(spd)*3; friction=0.3}

 

Nie ważne jak to pozmieniam, mam problem żeby obiekt (odłamek) miał zmienną prędkość i frykcje w zależności czy porusza się w zwolnionym tempie czy normalnie, na końcu ma wyhamować i zatrzymać się.

Frykcja oczywiście w tym przykładzie nie działa wcale.

 

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
Czysto logicznie, ten kod nie moze byc w stepie:

GML
if player.speed>0 {speed=3 friction=0.3}

if player.speed=0 {speed=1 friction=0.1}

 

Bo zgodnie z tym kodem speed zawsze bedzie wynosic 3 i friction zawsze bedzie wynosic 0.3.

Przeciez przy speed=0 ustawiasz speed=1.

A speed=1 jest także speed>0, wiec zmieni speed na 3 i friction na 0.3.

A ze speed=3 jest speed>0 to gra juz na tym zostanie.

 

Edit:

I brzmisz śmiesznie mówiąć "frykcja" więc mów friction, jak już "tarcie" nie odpowiada.

 

Nie, jeśli speed dotyczy innego obiektu, to nie będzie wynosić zawsze 3, tylko wtedy gdy gracz się porusza :) Czuję tutaj superhota.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

Tak, tez to zauwazylem po napisaniu posta.. Zresztą, gunarkill juz na to odpowiedzial.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
Tak, tez to zauwazylem po napisaniu posta.. Zresztą, gunarkill juz na to odpowiedzial.

 

Po pierwsze chciałem wyjaśnić że słowo frykcja niestety istnieje więc będę go używał i ma tu jak najlepsze zastosowanie, bo jest to język programowania a nie fizyka.

 

Oczywiście musiałem teraz dodać specjalnie moją zmienną frykcję, po to że nawet jak ktoś się z tym nie zgadza będzie musiał operować moją wartością "frykcja" :)

 

Dobra wiem już czego dokładnie potrzebuje, zrobiłem sobie obiekt sys w którym trzymam wszystkie wartości, frykcja zmienia się tam kiedy player się porusza to działa teraz poprawnie.

 

jedynie tego czego potrzeba to żebym otrzymywał wartość spd/3 niestety jak to tak wpisuje to wartość jest stale dzielona, a ja potrzebuje 1/3 wartości prędkości po pomiarze.

 

znaki ??? to oczywiście mój brak kompetencji bo nie wiem jak to uzyskać.

 

var spd=speed

 

friction=sys.frykcja

if force=1 {speed=sys.speedo force=0}

if player.speed>0 {speed=???}

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
Po pierwsze chciałem wyjaśnić że słowo frykcja niestety istnieje
W pełni się zgadzam.

frykcja

1. «wcieranie leku w skórę»

2. «w niektórych urządzeniach: różnica między prędkościami obwodowymi pary współpracujących walców»

3. «utrudnienie w przebiegu procesów gospodarczych»

Ale niestety nie o to Ci chodziło. GameMakerowa zmienna friction oznacza właśnie tarcie, a tak na prawdę to opór jaki jest przeciwstawiany pędowi.

Są jeszcze ruchy frykcyjne o innym znaczeniu ale nie będę ich przytaczał.

 

I chyba cały twój problem jest w tym że nie widzisz że jest to tarcie i próbujesz wykorzystywać to w jakiś inny sposób. :)

 

Jest to wbudowana funkcja która zmniejsza wartość innej wbudowanej zmiennej speed o swoją wartość dążąc w kierunku 0. Coś takiego:

GML
speed=max(0,speed-friction*sign(speed))

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
W pełni się zgadzam.

 

Ale niestety nie o to Ci chodziło. GameMakerowa zmienna friction oznacza właśnie tarcie, a tak na prawdę to opór jaki jest przeciwstawiany pędowi.

Są jeszcze ruchy frykcyjne o innym znaczeniu ale nie będę ich przytaczał.

 

I chyba cały twój problem jest w tym że nie widzisz że jest to tarcie i próbujesz wykorzystywać to w jakiś inny sposób. :)

 

Jest to wbudowana funkcja która zmniejsza wartość innej wbudowanej zmiennej speed o swoją wartość dążąc w kierunku 0. Coś takiego:

GML
speed=max(0,speed-friction*sign(speed))

 

Ok jak już widzę pierwszy temat stał się ważniejszy :) Przykro mi stwierdzić i teraz będzie ogólny szok że nawet słownik w internecie może się mylić, frykcja (łac. frictio - tarcie, wcieranie) ale wiem to wielkie zaskoczenie że frykcja znaczy friction i też tarcie.

 

A jeżeli o GMLu mówimy, to chodzi dokładnie o Friction co już w moim kodzie działa poprawnie, chcę teraz tylko uzyskać 1/3 wartości prędkości obiektu po pomiarze.

 

jak wpisuje np speed=spd/3 to wtedy jest ona stale dzielona a jak chce mieć zapamiętane dwie wartości

 

czyli

 

speed=3 jeżeli się będę poruszał będzie to 1/3 prędkości czyli speed=1, dodatkowo występuje Friction dlatego muszę robić pomiar i wtedy chcę dzielić tą wartość i też chcę wracać do tej drugiej mógłbym chyba użyć mnożenia, czyli * 3

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
jak wpisuje np speed=spd/3 to wtedy jest ona stale dzielona a jak chce mieć zapamiętane dwie wartości

Nie jest stale dzielona. Przypisujesz do wartości speed 1/3 wartości spd. Możesz mieć problemy jeżeli gdzieś indziej modyfikujesz spd albo speed (np przez friction)

speed=3 jeżeli się będę poruszał będzie to 1/3 prędkości czyli speed=1, dodatkowo występuje Friction dlatego muszę robić pomiar i wtedy chcę dzielić tą wartość i też chcę wracać do tej drugiej mógłbym chyba użyć mnożenia, czyli * 3

To na prawdę brzmi jakbyś nie wiedział jak działa friction. Nie sprawia ona że o tyle jest dzielona prędkość. Tu chodzi o ruch liniowy.

 

Więc wystarczą Ci 2 stany (które już masz) oraz wyeliminowanie friction ze wzoru. Może coś takiego? Niezależnie od ustawionej friction prędkość będzie albo sys.speedo albo 1/3 sys.speedo.

GML
if force=1 {speed=sys.speedo+friction force=0}

if player.speed>0 {speed=(sys.speedo/3)+friction}

 

 

Ok jak już widzę pierwszy temat stał się ważniejszy :) Przykro mi stwierdzić i teraz będzie ogólny szok że nawet słownik w internecie może się mylić, frykcja (łac. frictio - tarcie, wcieranie) ale wiem to wielkie zaskoczenie że frykcja znaczy friction i też tarcie.
I nie mogę się oprzeć pokusie. Jakoś ludzie upierający się przy błędzie niesamowicie mnie fascynują. Słowotwórstwo jest fajne ale tylko gdy słowo jest akceptowane przez społeczeństwo i nie redundantne.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
Nie jest stale dzielona. Przypisujesz do wartości speed 1/3 wartości spd. Możesz mieć problemy jeżeli gdzieś indziej modyfikujesz spd albo speed (np przez friction)

 

To na prawdę brzmi jakbyś nie wiedział jak działa friction. Nie sprawia ona że o tyle jest dzielona prędkość. Tu chodzi o ruch liniowy.

 

Więc wystarczą Ci 2 stany (które już masz) oraz wyeliminowanie friction ze wzoru. Może coś takiego? Niezależnie od ustawionej friction prędkość będzie albo sys.speedo albo 1/3 sys.speedo.

GML
if force=1 {speed=sys.speedo+friction force=0}

if player.speed>0 {speed=(sys.speedo/3)+friction}

 

 

I nie mogę się oprzeć pokusie. Jakoś ludzie upierający się przy błędzie niesamowicie mnie fascynują. Słowotwórstwo jest fajne ale tylko gdy słowo jest akceptowane przez społeczeństwo i nie redundantne.

 

Ok więc żeby zamknąć pierwszy temat, jeżeli jesteś w błędzie to ty jesteś taką fascynującą osobą (a to jest ciekawy paradoks) to że kilku ludzi nie używa jakiegoś słowa nie znaczy że nie istnieje, jestem starym prykiem który słyszał użycie tego słowa a nie mam 100lat http://www.synonimiczny.pl/slownik-synonimow/ta/tarcie http://www.jezykowce.pl/synonim/slownik-wy...nacznych/tarcie http://synonim.net/synonim/tarcie

 

najlepsze na koniec http://sjp.pwn.pl/sjp/ruchy-frykcyjne;2517992.html i tak owszem, wiem iż trudno uwierzyć że te egzotyczne słowo może znaczyć tarcie, ale jeżeli nie tylko ja tak piszę znaczy że jeszcze te słowo żyję i jednak nie jest to takie błędne.

 

Ważniejsza sprawa, w kodzie którym podałeś nie będzie działać friction, obiekty nigdy się nie zatrzymają bo stale nadajemy prędkość. Dodatkowo jeżeli zwalniasz czas friction musi być też mniejsze bo inaczej obiekt za szybko się zatrzyma. W zwolnionym tempie czy też normalnym obiekt ma zatrzymać się w tej samej odległości.

 

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

speed = 0;

 

 

O KUR*A ZATRZYMAŁY SIE!!!

 

 

A tak na serio, to chyba wiem gdzie jest błąd - speed jest stały i obiekty nie stają mimo ustawienia friction, bo resetujesz speed na 3 lub 1 co klatkę :)

 

GML
if player.speed>0 and speed < 3 {speed=3; friction=0.3}

if player.speed=0 {

if speed > 1 {

speed=1;

}

friction=0.1

}

 

Edit: a w ogóle to powinieneś speed i friction przemnrażać / dzielić w momencie jak zmieniasz speed playera i tyle. Bo tak to za dużo warunków się pojawia :)

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

992c81c26dae5.jpg

 

 

 

Istnieje frykcja jako synonim tarcia, tak mówią słowniki.Tylko że trochę to tutaj wygląda jakbyś pisał "Twórca gier 1.4" zamiast "Game maker 1.4" szczegolnie kiedy upierasz sie ze to wcale nie jest "tarcie" nie jest "friction" tylko jakas tajemnicza "superhot" zmienna

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

Przede wszystkim, opieranie sią na pseud-słownikach które mają opcję "dodaj" i kazdy może tam wstawić dowolne słowo - nie ma sensu. Jeśli coś nie jest potwierdzone przez naukowe źródło, w więc PWN, bądź jakąś uczelnianią stronę, bądź radę języka polskiego - to można to między bajki włożyć. Zwłaszcza, że za tymi stronami to nawet nie wiadomo kto stoi...

 

http://sjp.pwn.pl/sjp/frykcja;2558640.html - to jest jedyna sprawdzona definicja.

 

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

Ja tak sie staralem byc dobrym userem i nei ciagnac tematu, ale jak wy to robicie to czemu nie?

Popieram wypowiedz Gnyska.

 

Co wiecej, to ze "ruchy frykcyjne" znacza co znacza, nie oznacza ze sama "frykcja" oznacza tarcie. Kazdy lingwista Ci to powie.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
speed = 0;

 

 

O KUR*A ZATRZYMAŁY SIE!!!

 

 

A tak na serio, to chyba wiem gdzie jest błąd - speed jest stały i obiekty nie stają mimo ustawienia friction, bo resetujesz speed na 3 lub 1 co klatkę :)

 

GML
if player.speed>0 and speed < 3 {speed=3; friction=0.3}

if player.speed=0 {

if speed > 1 {

speed=1;

}

friction=0.1

}

 

Edit: a w ogóle to powinieneś speed i friction przemnrażać / dzielić w momencie jak zmieniasz speed playera i tyle. Bo tak to za dużo warunków się pojawia :)

 

First temat.

Strony z synonimami były wybrane tylko po to żeby udowodnić że jakaś część społeczeństwa używa tak tego słowa, może ta głupsza ale jednak.

 

Moim zamiarem cały czas jest użycie friction żeby obiekt wyhamował, z tym kodem który podałeś obiekt za każdym razem kiedy player się poruszy odłamki zaczną się poruszać.

 

poradziłem sobie z tym że zmieniam friction poprawnie, mam problem z tym że kiedy player.speed>0 ta akcja stale jest odpalana i odłamki nigdy się nie zatrzymają.

 

Mam już prawie rozwiązanie jedynie potrzebuje informację jak zrobić taki myk, jeżeli np. speed=1 a friction=0.1 to po jednym kroku speed=0.9 jak zrobię sobie var spd=speed otrzymam dokładnie taką wartość z pomiaru,

powiedzcie mi proszę jak mam uchwycić wartość z spd w tym wypadku spd=0.9 podzielić ją na 3 żeby otrzymać spd=0.3 bo jeżeli zrobie spd/3 ona stale będzie dzielona, czyli chce mieć wartość z danego kroku podzieloną na 3

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0

jak już powiedziałem, musiałbys to robić w momencie jak gracz się zatrzymuje, bo inaczej to jest full rzeźbienia.

 

Ewentualnie, jeśli chcesz rzeźbić - zrobić to samemu ale mieć speed i friction na własnych zmiennych:

 

GML
// create

spd = 3

fri = 0.3;

 

// step

var multipler = 1/3 + (player.speed != 0) * 2/3; //w GMS2: var multipler = (player.speed != 0) ? 1 : 1/3;

if (spd > 0) {

x += lenghtdir_x(spd * multipler, direction);

y += lenghtdir_y(spd * multipler, direction);

}

 

spd = max(0, spd - fri);

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Tylko 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ę tutaj.

Zaloguj się tutaj

  • Przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników, przeglądających tę stronę.

×