Skocz do zawartości

problem z place_meeting


Nirvan

Rekomendowane odpowiedzi

Mam problem z place_meeting, chce zrobić naskakiwanie od dołu i wszystko działa ale gdy gracz stoi na jednej platformie i dotyka drugą na poziomie tułowiu to gracz reaguje tak jakby stał w niej, jakby w nią wniknął i nie może się ruszyć. Wydaje mi się że to place meeting czyta x,y z obiektem przy zetknięciu z maską i liczy je od tej maski właśnie. Jak to naprawić?

Odnośnik do komentarza
Udostępnij na innych stronach

Zapewne gdzieś masz kod wyglądający w dużym uproszczeniu tak:

GML
if !( place_free( x, y + predkosc_spadania ) )

predkosc_spadania = 0;

To właśnie w tym miejscu musisz zapobiec dziwnemu "wdrożeniu" w platformę, na którą chcesz naskoczyć od dołu. Rozwiązać to możesz na wiele sposobów. Jednym z nich jest sprawdzanie, czy jakaś instancja znajduje się na tobie. Jeśli tak, to powyższy warunek nie powinien zostać spełniony. I gotowe.

 

Jeśli chcesz, to mogę podesłać przykład.

 

Edit: W pełni funkcjonalny kod. Nie prześlę przykładu, gdyż nie mam zamiaru się teraz bawić w upload przy tak słabym necie. Przyrzekam, że kod działa w 100% ;) .

GML
if ( keyboard_check( vk_left ) )

v -= a;

else if ( keyboard_check( vk_right ) )

v += a;

else

{

if ( v > 0 )

v = max( v - a, 0 );

else

v = min( v + a, 0 );

}

 

if ( !place_meeting( x + v, y, Block ) || place_meeting( x, y, Block ) )

x += v;

else

{

if ( v > 0 )

move_contact_all( 0, 0 );

else if ( v < 0 )

move_contact_all( 180, 0 );

v = 0;

}

 

if ( gv >= 0 )

{

if ( !place_meeting( x, y + 1, Block ) || ( place_meeting( x, y, Block ) && gv >= 0 && instance_place( x, y, Block ) == instance_place( x, y + gv, Block ) ) )

gv += g;

else

{

gv = 0;

if ( keyboard_check( vk_up ) && !place_meeting( x, y, Block ) )

{

gv = -10;

y += gv;

}

}

}

else

{

y += gv;

gv += g;

}

 

if ( !place_meeting( x, y + gv, Block ) || place_meeting( x, y, Block ) )

y += gv;

else if ( !place_meeting( x, y, Block ) )

{

while( place_meeting( x, y + 1, Block ) )

y += 1;

gv = 0;

}

Jutro wrzucę pewnie.

Odnośnik do komentarza
Udostępnij na innych stronach

Poruszanie się muszę mieć tak zrobione i mam problem z rozwiązaniem problemu.

 

GML
{

yy=0; ok=0;

while(yy<=max_y&&ok=0)

{

if ( place_meeting(x+v,y-yy,par_plat) )

{

x+=v;

if (place_meeting(x,y+1,par_plat) &&vspeed=0)

y-=yy;

ok=1;

}

yy+=1;

}

if (place_meeting(x,y+max_y, par_plat)&&vspeed=0)

move_contact_all(270,max_y);

}

 

Kombinowałem z instance_place bo nie znałem tego wcześniej, ale już dzisiaj nie mam czasu żeby dalej kombinować :P W każdym bądź razie nic sęsownego jeszcze nie zrobiłem.

Odnośnik do komentarza
Udostępnij na innych stronach

dotyka drugą na poziomie tułowiu to gracz reaguje tak jakby stał w niej, jakby w nią wniknął i nie może się ruszyć.

Wynika to z tego, że gracz właśnie znajduje się na platformie, czyli piksel pod nim jest platforma, piksel nad nim jest platforma itd. A to wtedy tworzy komplikacje, ponieważ nie współgra z kodem:

place_meeting(x,y+1,par_plat)
Odnośnik do komentarza
Udostępnij na innych stronach

Ja zawsze w platformówkach robiłem tak, że bohater ma "y" platformy, na której stoi minus wysokość sprite'a bohatera. Tylko jeden collision_point w Stepie. Zero place_meeting.

 

Oczywiście działa tylko z poziomymi platformami.

Odnośnik do komentarza
Udostępnij na innych stronach

  • 5 tygodni później...

Problem cały czas pozostaje nierozwiązany, postać musi umieć poruszać się nie tylko po płaskich platformach, u mnie kod poruszania wygląda tak:

 

GML
Step:

 

yy=0; ok=0;

while(yy<=max_y&&ok=0)

{

if!( ( place_meeting(x+v,y-yy,par_solidobj) ) || ( place_meeting(x+v,y-yy,par_plat)) )

{

x+=v;

if( (place_meeting(x,y+1,par_plat) ) &&vspeed=0)

y-=yy;

ok=1;

}

yy+=1;

}

if ((place_meeting(x,y+max_y, par_plat))&&vspeed=0)

move_contact_all(270,max_y);

}

 

GML
Kolizja platformy z graczem:

 

if other.y+60 < y+sprite_get_yoffset(sprite_index)/2

{

 

with(other)

{

if (vspeed>0) && trough=false

{

if(place_meeting(x,y+vspeed, par_platGT)){move_contact_all(270,vspeed);}

//i tu dalej blablabla

}

}

 

}

 

Gracz i przeciwniczy ciągle utykają gdy trafią na platforme np na wysokości swojej głowy.

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