Skocz do zawartości

Ściana staje się przezroczysta gdy gracz znajduje się w pobliżu


Huri

Rekomendowane odpowiedzi

Cześć :)

Natrafiłem na pewien problem, który rozwiązuje na dwa sposoby ale żaden z nich nie jest taki jakbym tego chciał.

W grze top-down mam ściany i zrobiłem tak, że gdy gracz się do nich zbliży to stają się przezroczyste. Pierwszy sposób to distance_to_object. Działa niemal idealnie z tym, że jak słusznie zauważył ereg powinno być tak, że tylko te ściany, które zasłaniają gracza powinny stawać się przezroczyste. To też zrobiłem za pomocą IF. Oto kody poszczególnych rozwiązań. Ten drugi sposób działa fajnie ale chciałbym żeby obiekty ścian znajdujące się w pobliżu (2 po lewej i 2 po prawej) też stawały się przezroczyste bo w ten sposób to gracz będzie się tylko wkurzał, że nie widział np. wroga (chociaż to może się zmienić bo jak dopiszę SI to przeciwnik wcześniej się ruszy).

 

GML
if (distance_to_object(obj_player)<16)

{

image_alpha=0.65;

}

else

image_alpha=1;

 

 

GML
if (place_meeting(x-16,y+0, obj_player) || place_meeting(x+0,y-16, obj_player))

{

image_alpha=0.65;

}

 

else

{

image_alpha=1;

}

Odnośnik do komentarza
Udostępnij na innych stronach

EDIT:

Chyba sobie poradziłem. Zrobię jeszcze tylko zasięg góra-dół i napiszę :)

 

 

Niestety nie :) .. Tego też już próbowałem. Są wtedy przypadki, że ściana nad graczem na ukos w prawo staje się przezroczysta :) . Więc przykro mi ale nie działa.

Próbowałem też kombinować z instance_place, instance_nearest itp. ale nie ogarniam jeszcze tego.

 

A nie wystarczy:

GMLif(distance_to_object(obj_player)<16 and (y>o_player.y or x>o_player.x)

{

image_alpha=0.65;

}

else

image_alpha=1;

Odnośnik do komentarza
Udostępnij na innych stronach

to graczowi stwórz zmienną dotyk która jest ustawiona na true jeśli dotyka ściany, a jeśli nie to ma false wtedy:

if(gracz.dotyk==true) place_meeting

else distance_to_object

 

nie wiem czy o to dokładnie chodzi, ale gdy gracz będzie blisko ścian to wszystkie ściany w pobliżu będą przezroczyste ale jak będzie się z którąś stykał to tylko ta ściana będzie przezroczysta.

 

Oczywiście graczowi w step musisz napisać kod:

GML
if(place_meeting(x,y,sciana)) dotyk=true else dotyk=false
Odnośnik do komentarza
Udostępnij na innych stronach

@Lechu4444

Niestety nie o to mi chodzi :).

------------------------------------

 

 

Trochę już głupieje ale najbliższe ideałowi jest takie rozwiązanie. Częściowym rozwiązaniem jest dodanie place_meeting (obj_wall.x+32,obj_wall.y-16, obj_player). Jednak przez to kiedy gracz idzie w lewo ściany robią się przezroczyste dopiero gdy gracz znajduje się bezpośrednio nad nimi (tak mi się wydaje). Wydaje mi się, że tą metodą, którą wybrałem nie da się tego zrobić. Póki co jest ok. Zajmę się czymś innym :) Ale jeśli ktoś znajdzie rozwiązanie będę wdzięczny na nakierowanie na rozwiązanie problemu :)

 

GML
if (distance_to_object(obj_player)<32)

{

if (place_meeting(x+0,y+32, obj_player) || place_meeting(x-32,y+32, obj_player) || place_meeting(x+32,y+32, obj_player))

{

image_alpha=1;

}

else{

image_alpha=0.65;

}

}

 

else

image_alpha=1;

Odnośnik do komentarza
Udostępnij na innych stronach

uzyj tego

GML
if (distance_to_object(obj_player)<32){

// if (place_meeting(x+0,y+32, obj_player) || place_meeting(x-32,y+32, obj_player) || place_meeting(x+32,y+32, obj_player) ) {

if ((obj_player.x+31<x && obj_player.y+31<y)

|| (obj_player.x+15<x && abs(obj_player.y+32-y)<80 && !place_meeting(x-32,y,obj_wall) )

|| (obj_player.y+15<y && abs(obj_player.x+32-x)<80 && !place_meeting(x,y-32,obj_wall) ) ) { image_alpha=0.65; }

else{ image_alpha=1; };

}

else {image_alpha=1; };

obj_wall w mym przykladu ma 48x48pix origin 16,16 kolision mask rectangle 16,16,47,47

obj_player sprite 32x32 origin 0,0

 

- 80 prezentuje 32*2,5 by wall prezswital tez jakis blok okolo a nie v linii prostej.

- place_meeting jest po to by przeswityval wall tylko na rogach. jak wytniesz z kodu to zobaczys :)

zresto poexperimentuj :)

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