Huri Opublikowano 2 Października 2013 Udostępnij Opublikowano 2 Października 2013 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 Więcej opcji udostępniania...
Threef Opublikowano 2 Października 2013 Udostępnij Opublikowano 2 Października 2013 A nie wystarczy: GML if(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 Więcej opcji udostępniania...
Huri Opublikowano 2 Października 2013 Autor Udostępnij Opublikowano 2 Października 2013 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 Więcej opcji udostępniania...
Lechu4444 Opublikowano 2 Października 2013 Udostępnij Opublikowano 2 Października 2013 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 Więcej opcji udostępniania...
Huri Opublikowano 2 Października 2013 Autor Udostępnij Opublikowano 2 Października 2013 @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 Więcej opcji udostępniania...
ereg Opublikowano 2 Października 2013 Udostępnij Opublikowano 2 Października 2013 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 Więcej opcji udostępniania...
Rekomendowane odpowiedzi
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ę