Administratorzy gnysek Opublikowano 19 Maja 2021 Administratorzy Udostępnij Opublikowano 19 Maja 2021 No to nie wystarcz zrobić tak jak masz na obrazku 2, a jedynie przy draw_surface dodwac/odejmować w pozycji x wartość przesunięcia? Wtedy obrazek się przecież nie zmieni i odbicie będzie widoczne. Np. jak masz teraz draw_surface(500,...) to robisz draw_surface(500 + paralaksa, ... ). Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Pogromca_kodu77 Opublikowano 19 Maja 2021 Autor Udostępnij Opublikowano 19 Maja 2021 Masz na myśli to? draw_surface(_surf,_xx+view_xview/7.5,_yy+view_yview/7.5); Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Pogromca_kodu77 Opublikowano 19 Maja 2021 Autor Udostępnij Opublikowano 19 Maja 2021 Hmmmm..po części to rozwiązuje problem..ale jest pewne zjawisko.. Co jest przyczyną,że używając tych samych wartości /7.5 na surface odbicie lustrzane bohatera próbuje go przegonić jak idę w prawo a jak idę w lewo próbuje go dogonić,a powinno poruszać się z taką samą wartością jak było bez parallaxy. Kod wygląda teraz tak.. Dodałem do draw surface parallaxe jest też dodana do bohatera i pocisku obj_lustro ///lustro // rysuje sprite lustra //draw_sprite(sprite_index,0,x,y); // lustro przesuwa sie z tą samą prędkością co tło na którym jest te lustro wtopione if instance_exists(obj_hero) { draw_sprite(sprite_lustro,image_index,x+view_xview/7.5,y+view_yview/7.5) } // pozycja lustra _xx = x; _yy = y; _surf = surface_create(300,200); // rozmiar lustra surface_set_target(_surf); draw_clear_alpha(c_black,0); draw_sprite_ext(obj_hero.sprite_index,obj_hero.image_index,obj_hero.x+view_xview/7.5 - _xx ,obj_hero.y+view_yview/7.5 - _yy - 70,obj_hero.image_xscale,obj_hero.image_yscale,0,image_blend,.5) // rysujemy pocisk na surface var _xx1 = x var _yy1 = y for (i = 0; i < instance_number(obj_pocisk); i += 1) { obj = instance_find(obj_pocisk, i); draw_sprite(spr_pocisk, 0, obj.x+view_xview/7.5 - _xx1, obj.y+view_yview/7.5 - _yy1 ); } //rysujemy sprite obiektu ktory nie znajdujesie w room edytorze if (instance_exists(obj_tlosurface)) { spriteToDraw = obj_tlosurface.sprite_index; } else { targetObject = instance_create(0,0, obj_tlosurface); spriteToDraw = targetObject.sprite_index; with (targetObject) { instance_destroy(); } } //rysujemy tlo na surface var Rysuj = 0; with (obj_hero){ if distance_to_object(obj_lustro) <= 20{ Rysuj = 1; } } if Rysuj { draw_sprite_ext(spriteToDraw,0,x+view_xview/7.5 ,300+view_yview/7.5,image_xscale,image_yscale,0,image_blend,.5) } surface_reset_target(); draw_surface(_surf,_xx+view_xview/7.5,_yy+view_yview/7.5); // rysuje lustro dodana parallaxa surface_free(_surf) // czyść lustro Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Administratorzy gnysek Opublikowano 19 Maja 2021 Administratorzy Udostępnij Opublikowano 19 Maja 2021 To są za duże ilości kodu aby ktoś chciał to analizować, zwłaszcza, że nie znamy reszty kodu. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Pogromca_kodu77 Opublikowano 19 Maja 2021 Autor Udostępnij Opublikowano 19 Maja 2021 Może na skróty uprościłem poniżej kod do i zobrazowałem to na rysunku poniżej o co mi chodzi parallaxa tła i obiektu lustra ma te same wartości czyli /7.7 dla x i y Natomiast na draw surface zmniejszyłem te wartości dzieląc x i y na /40 wiem wiem duża cyfra,ale teraz powiedzmy,że lustrzane odbicie stara się trzymać stałą odległość od gracza w pozycji x i y.Chociaż nie mam pewności czy tak to powinno być że musiałem użyć tak dużych wartości aby zachować stałą odległość gracza od lustrzanego odbicia gracza na lustrze. A co zrobić kiedy idę w prawo to odbicie bohatera kończy się za nim się obiekt lustro skończy.Może niewiele ale się kończy. O dziwo z lewej strony jest ok. Czy jest też inny sposób aby dodać z prawej strony taki nie wiem offset o ile dobrze myślę aby nie ucinało lustra i aby te odbicie bohatera zawsze zaczynało się zarówno z lewej jak i z prawej strony na krawędziach obiektu lustra? ///lustro // rysuje sprite lustra // lustro przesuwa sie z tą samą prędkością co tło na którym jest te lustro wtopione if instance_exists(obj_hero) { draw_sprite(sprite_lustro,image_index,x+view_xview/7.5,y+view_yview/7.5) } // pozycja lustra _xx = x; _yy = y; _surf = surface_create(300,200); // rozmiar lustra surface_set_target(_surf); draw_clear_alpha(c_black,0); draw_sprite_ext(obj_hero.sprite_index,obj_hero.image_index,obj_hero.x+view_xview/7.5 - _xx ,obj_hero.y+view_yview/7.5 - _yy - 70,obj_hero.image_xscale,obj_hero.image_yscale,0,image_blend,.5) // rysujemy pocisk na surface var _xx1 = x var _yy1 = y for (i = 0; i < instance_number(obj_pocisk); i += 1) { obj = instance_find(obj_pocisk, i); draw_sprite(spr_pocisk, 0, obj.x+view_xview/7.5 - _xx1, obj.y+view_yview/7.5 - _yy1 ); } surface_reset_target(); draw_surface(_surf,_xx+view_xview/40,_yy+view_yview/40); // rysuje lustro dodana parallaxa musiałem zwiększyć wartość aby odbicie //lustrzane gracza nie goniło gracza surface_free(_surf) // czyść lustro Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Pogromca_kodu77 Opublikowano 22 Maja 2021 Autor Udostępnij Opublikowano 22 Maja 2021 To może inaczej to wyjaśnie w czym problem. Kiedy nie ustawie parallaxy na lustrze i surface to wszystko jest w porządku i obiekt lustro zbajduje się dokładnie w tym miejscu w którym ustawiłem go w room edytorze a odbicie bohatera jest idealnie ustawione. Natomiast kiedy ustawie parallaxe na obiekcie lustro ponieważ te lustro jest wtopione w tło i oba poruszają się w tym samym kierunku z tą samą prędkością(używam xview i yview w grze) I taka samą parallaxe ustawie przy funkcji draw surface w obiekcie lustro to kiedy uruchomie gre pozycja obiektu lustra jest inna niż ustawiłem ten obiekt w room edytorze.Lustro od razu jest przesunięte w prawą stronę. Dlatego muszę je o spory kawałem w room edytorze przesunąć w lewo aby jego pozycja startowa w trakcie gry była w miejscu w jakim ustawiłem lustro przy wyłączonej parallaxy. Czy istnieje sposób może żeby wymusić stałą pozycje startową obiektu lustra tak abym przy włączonej parallaxy nie musiał go przesuwać w room edytorze w lewo?? Ktoś wie z was jak rozwiązać ten problem? Mam nadzieje,że teraz to w dość zrozumiały sposób opisałem. Dziękuję Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Administratorzy gnysek Opublikowano 26 Maja 2021 Administratorzy Udostępnij Opublikowano 26 Maja 2021 W dniu 22.05.2021 o 12:25, Pogromca_kodu77 napisał: Czy istnieje sposób może żeby wymusić stałą pozycje startową obiektu lustra To Ty decydujesz o wartościach X i Y. Musisz znaleźć odpowiednie, możesz przecież przesuwać obiekt za pomocą step, create, możesz przesuwać samą pozycję surface - wszystko zależy od tego jak to zaprogramujesz. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Pogromca_kodu77 Opublikowano 28 Maja 2021 Autor Udostępnij Opublikowano 28 Maja 2021 W dniu 26.05.2021 o 22:59, gnysek napisał: To Ty decydujesz o wartościach X i Y. Musisz znaleźć odpowiednie, możesz przecież przesuwać obiekt za pomocą step, create, możesz przesuwać samą pozycję surface - wszystko zależy od tego jak to zaprogramujesz. Wielki Inkwizytorze Gnysku Czyli mój kod musiałbym przenieść do zdarzenia Step żeby uzyskać ten efekt przesunięcia obiektu lustro i przesunięcia pozycji surface. No dobrze,ale funkcje draw i draw_surface powinny znajdować się w zdarzeniu draw tak? w Step co dokładnie powinno się znaleźć aby rozwiązać ten problem co opisałem powyżej aby lustro jak i surface równo poruszało się z graczem i nie ucinało odbicia w lustrze a ni nie wyjeżdżało po za lustro odbicie gracza obj_lustro draw ///lustro // rysuje sprite lustra // lustro przesuwa sie z tą samą prędkością co tło na którym jest te lustro wtopione if instance_exists(obj_hero) { draw_sprite(sprite_lustro,image_index,x+view_xview/7.5,y+view_yview/7.5) } // pozycja lustra _xx = x; _yy = y; _surf = surface_create(300,200); // rozmiar lustra surface_set_target(_surf); draw_clear_alpha(c_black,0); draw_sprite_ext(obj_hero.sprite_index,obj_hero.image_index,obj_hero.x+view_xview/7.5 - _xx ,obj_hero.y+view_yview/7.5 - _yy - 70,obj_hero.image_xscale,obj_hero.image_yscale,0,image_blend,.5) // rysujemy pocisk na surface var _xx1 = x var _yy1 = y for (i = 0; i < instance_number(obj_pocisk); i += 1) { obj = instance_find(obj_pocisk, i); draw_sprite(spr_pocisk, 0, obj.x+view_xview/7.5 - _xx1, obj.y+view_yview/7.5 - _yy1 ); } surface_reset_target(); draw_surface(_surf,_xx+view_xview/40,_yy+view_yview/40); // rysuje lustro dodana parallaxa musiałem zwiększyć wartość aby odbicie //lustrzane gracza nie goniło gracza surface_free(_surf) // czyść lustro Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Administratorzy gnysek Opublikowano 28 Maja 2021 Administratorzy Udostępnij Opublikowano 28 Maja 2021 Nie wiem co powinno znaleźć się w step, bo to nie ja dobieram wartości paralaksy i proporcji To już naprawdę albo musisz wyliczyć, albo metodą prób i błędów (zacząłbym od tego, żeby surface rysowało się gdzie trzeba i zapewne testowanie najlepiej zaczynać w połowie obszaru, wtedy lustro i odbicie powinny być w jednej osi jak mniemam, a potem iść w lewo/prawo i sprawdzać, czy paralaksa jest dobra). Powiedz jeszcze, jaka to wersja GM? W GMS 2.0 można użyć camera_apply(view_camera[0]);, które pozwoli na surface mieć takie same offsety jak w view, może to pomoże w rysowaniu. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Pogromca_kodu77 Opublikowano 1 Czerwca 2021 Autor Udostępnij Opublikowano 1 Czerwca 2021 Wersji póki co używam gms 1.4 a tam nie ma funkcji camera_apply(view_camera[0]) No dobra teraz do rzeczy bo zwątpiłem już całkiem;-) Zacząłem kod rozbijać na fragmenty i analizować co jest nie tak,że kiedy zaimplementuje parallaxe na obiekcie lustro i na pozycji surface,to odbicie lustrzane zaczyna się trochę przed lustrem i kończy się zanim skończy się krawędź lustra. To jest dziwna sytuacja,bo takiego zjawiska nie mam kiedy wyłączę parallaxe na lustrze i na surface wtedy odbicie lustrzane bohatera zaczyna się na krawędziach lustra. Ktoś mógłby mi pomóc rozwiązać ten problem? Wiadomo,że ma to miejsce z tym,że pozycja lustra po włączeniu parallaxy jest inna niż przy wyłączonej parallaxy i to musi powodować,że odbicie zaczyna się przed lustrem a nie w lustrze i kończy zanim lustro się skończy. Gnysek wspomniałeś że kod mógłby znajdować cię w zdarzeniu step tylko,że jak mam coś narysować nie używając zdarzenia draw? Ok zamieszczę jeszcze raz tu kod lustra jeden bez parallaxy który działa idealnie i dobicie jest na swoim miejscu,a drugi z parallaxą gdzie pomimo włączenia jej na surface i lustrze odbicie lustrzane bohatera jest przesunięte. obj_lustro bez parallaxy draw ///lustro // rysuje sprite lustra draw_sprite(sprite_lustro,image_index,x,y) // pozycja lustra _xx = x; _yy = y; _surf = surface_create(935,378); // rozmiar lustra surface_set_target(_surf); draw_clear_alpha(c_black,0); draw_sprite_ext(obj_hero.sprite_index,obj_hero.image_index,obj_hero.x - _xx+32 ,obj_hero.y - _yy - 70,obj_hero.image_xscale,obj_hero.image_yscale,0,image_blend,.5) // rysujemy pocisk na surface var _xx1 = x var _yy1 = y for (i = 0; i < instance_number(obj_pocisk); i += 1) { obj = instance_find(obj_pocisk, i); draw_sprite(spr_pocisk, 0, obj.x - _xx1+32, obj.y - _yy1-70 ); } surface_reset_target(); draw_surface(_surf,_xx,_yy); // surface_free(_surf) // czyść lustro obj_lustro z parallaxą draw ///lustro // rysuje sprite lustra // lustro przesuwa sie z tą samą prędkością co tło na którym jest te lustro wtopione if instance_exists(obj_hero) { draw_sprite(sprite_lustro,image_index,x+view_xview/7.5,y+view_yview/7.5) } // pozycja lustra _xx = x; _yy = y; _surf = surface_create(935,378); // rozmiar lustra surface_set_target(_surf); draw_clear_alpha(c_black,0); draw_sprite_ext(obj_hero.sprite_index,obj_hero.image_index,obj_hero.x+view_xview/7.5 - _xx+32 ,obj_hero.y+view_yview/7.5 - _yy - 70,obj_hero.image_xscale,obj_hero.image_yscale,0,image_blend,.5) // rysujemy pocisk na surface var _xx1 = x var _yy1 = y for (i = 0; i < instance_number(obj_pocisk); i += 1) { obj = instance_find(obj_pocisk, i); draw_sprite(spr_pocisk, 0, obj.x+view_xview/7.5 - _xx1+32, obj.y+view_yview/7.5 - _yy1-70 ); } surface_reset_target(); draw_surface(_surf,_xx+view_xview/40,_yy+view_yview/40); // rysuje lustro dodana parallaxa musiałem zwiększyć wartość aby odbicie //lustrzane gracza nie goniło gracza surface_free(_surf) // czyść lustro Dziękuję 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ę