Skocz do zawartości
  • 0
LolikZabijaka

Latanie bokiem - drift

Pytanie

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

}

 

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

15 odpowiedzi na to pytanie

Rekomendowane odpowiedzi

  • 0

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:

Udostępnij tego posta


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

A w jaki sposób rysujesz samochód? I czy masz gdzieś przypisany image_angle do direction?

Udostępnij tego posta


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

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

Udostępnij tego posta


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

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
}

 

Udostępnij tego posta


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

pojazd jest różnie obrócony, prawda? Użyj lengthdirów

Udostępnij tego posta


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

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
}

 

Udostępnij tego posta


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

Babol jest taki że zmieniasz pozycję dymu po elipsie a nie po okręgu. Wartość length musi być w obu osiach taka sama by obracał się po okręgu.

Udostępnij tego posta


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

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.

Udostępnij tego posta


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

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

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach
  • 0
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 ?

Udostępnij tego posta


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

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

Udostępnij tego posta


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

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)

 

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

×