Skocz do zawartości

Latanie bokiem - drift


Rekomendowane odpowiedzi

Cześć, siedzę sobie teraz nad możliwością używania pojazdów w grze, napotkałem w sumie dwa problemy. Pierwszy polega na tym, że chciałbym dać możliwość polatania bokiem, przy wciśnięciu spacji, czyli po zarzuceniu rękawa pojazd nieznacznie zwalnia, ale można klawiszami kierunkowymi ustawiać jego kąt(przy zaciągniętym ręcznym wartości wychylenia będą większe, niż przy zwykłym skręcaniu) Niestety niezależne od tego czy zaciągnę rękaw, czy nie, auto nie zachowuje się tak jakbym chciał(zachowuje tę samą wartość skręcania) oto kod z klawisza "A"

  if speed>1{ direction += 1}
    if speed>4{ direction += 2}
      if speed>8{ direction += 3}
      if keyboard_check(vk_space) and keyboard_check(ord('W')) {
      speed-=0.3
      image_angle+=18
      trace_create(x+lengthdir_x(36,image_angle+180),y+lengthdir_y(36,image_angle+180),image_angle)
      }
    

Drugi problem tyczy się kolizji, kiedy rozpędzam wóz i w coś przywalę, to auto owszem odbija się, tracąc prędkość(nadałem friction przy dzwonie), ale później nie mogę nim ruszyć, gdzie jest błąd? Kod z kolizji wozu z przeszkodą:

if speed>1{
move_bounce_all(1)
speed-=5
friction=3

}

 

Odnośnik do komentarza
Udostępnij na innych stronach

No cóż, z pierwszym Ci nie pomogę ale powinienem mieć rozwiązanie na drugi problem. W twoim kodzie jak już w coś "przydzwonisz", to ustawiasz friction obiektu na 3, dlatego nie możesz dalej ruszyć pojazdem. Musisz ustawić friction z powrotem na 0. Proponuje alarmy, np:

Create:
 

alarm[0] = -1;

Kolizja:
 

if(speed > 1)
{
  move_bounce_all(1)
  speed-=5
  friction=3
  alarm[0] = 0.5*room_speed;
}

Alarm[0]:
 

friction = 0;

W takim wypadku, po pół sekundy od kolizji znowu będziesz mógł prowadzić pojazd - czysto teoretycznie, bo nie sprawdzałem w praktyce, ale zapewne coś tą metodą osiągniesz :thumbsup:

Odnośnik do komentarza
Udostępnij na innych stronach

Jak jest przypisane w ten sposób: image_angle = direction to nigdy nie będzie się ślizgać.

 

Jakbyś zrobił lekka interpolację obrotu to by było wrażenie ślizgania ale to nie jest idealne:

// obracanie sprita
var diff = angle_difference(image_angle, direction);
direction += diff*clamp(tireGrip, 0, 1);

 

tireGrip sobie zdefiniuj w create, ta zmienna przyjmuje wartości od zera do jeden. Ale wpisz tam bardzo małe wartości np 0.01

Odnośnik do komentarza
Udostępnij na innych stronach

Ok, to ogarnąłem po swojenu, pytanie z innej beczki, zrobiłem, aby po dodaniu gazu wózek kopcił. Sprawa niezwykle trywialna, ale nie pamiętam dobrze wszystkiego z Gma. Podczas jazdy dym ucieka gdzieś bokiem, mimo że ustawiłem aby tworzył się z pozycji np. x+5 y+10, oto kod:

 

DODAWANIE GAZU: 

if ( wsiadanie == true ) {
speed +=0.9

effect_create_below(ef_smokeup,x-50,y,1,c_blue)
}
if speed>=25{
speed=25
}

 

Odnośnik do komentarza
Udostępnij na innych stronach

Coś tam pomogło, ale nadal się krzaczy, dym leci inaczej, w zależności od kąta samochodu, gdzie jest babol?

 

if ( wsiadanie == true ) {
speed +=0.9

effect_create_below(ef_smokeup,x+lengthdir_x(-40,image_angle),y+lengthdir_y(0,image_angle),0.2,c_blue)
}
if speed>=25{
speed=25
}

 

Odnośnik do komentarza
Udostępnij na innych stronach

Ale jeżeli samochód jest podłużny to pozycja wylotu też porusza się po elipsie. Może wartości są złe, ale niekoniecznie dlatego, że są nierówne.

 

Edit: Wartości podaj w pikselach od origina samochodu. Zakładam że jest wycentrowany na środku, więc pewnie te wartości są nie tak.

Odnośnik do komentarza
Udostępnij na innych stronach

Obrót samochodu i tak jest po okręgu. Więc i ta pozycja powinna być, chyba że w trakcie obrotu zmieniałby się origin. Przystaw sobie cyrkiel do dowolnego podłużnego obiektu, niech jedna noga cyrklu będzie originem tego obiektu a druga tym wylotem dymu i zacznij sobie ten przedmiot obracać. :)

Odnośnik do komentarza
Udostępnij na innych stronach

1 godzinę temu, I am vader napisał:

Ale jeżeli samochód jest podłużny to pozycja wylotu też porusza się po elipsie. Może wartości są złe, ale niekoniecznie dlatego, że są nierówne.

 

Edit: Wartości podaj w pikselach od origina samochodu. Zakładam że jest wycentrowany na środku, więc pewnie te wartości są nie tak.

Akurat ogrin jest bardziej z przodu(złudzenie napędu na tył). Czyli musi być jednakowa wartość? A jeśli orgin Y jest w centrum, to jak wyliczyć tę wartość w kodzie ?

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli origin masz na np. 17,13 a wydech na np. 14,20 to chcesz zrobić lengthdir_x(-3,image_angle) lengthdir_y(7,image_angle). To kwestia Pozycja-Origin

 

Edit: Zakladajac czysto teoretycznie ze mam racje, czego sam nie jestem pewien bo robie to na sucho

Odnośnik do komentarza
Udostępnij na innych stronach

Lengthdir.png.5af0a01450b7441354a22f6686634290.png

 

Musisz znać odległość w poziomie od originu do wydechu ( tutaj 125 pixeli ), oraz w pionie ( tutaj 20 pixeli )

I wyliczyć length "L" oraz kąt "a"

Z twierdzenia pitagorasa to zrobisz:  L = sqrt(125*125+20*20) = 126pix w przyblizeniu

a kąt możesz obliczyć z dowolnej funkcji trygonometrycznej bo znasz już wszystkie boki. np: atan(20/125) = 9 stopni http://www.wolframalpha.com/input/?i=atan(20%2F125)

 

Jak masz L i a to wpisujesz to do funkcji lengthdir():

effect_create_below(ef_smokeup,x+lengthdir_x(126,image_angle+9),y+lengthdir_y(126,image_angle+9),0.2,c_blue)

a jak dym się będzie obracał na odwrót to wtedy image_angle daj na minus:

effect_create_below(ef_smokeup,x+lengthdir_x(126,-image_angle+9),y+lengthdir_y(126,-image_angle+9),0.2,c_blue)

 

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