Skocz do zawartości

Rysowanie sprita pocisku na powierzchni (apliation_surface)


Rekomendowane odpowiedzi

  • Administratorzy

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

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

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

 

 

przyklad 2.png

Odnośnik do komentarza
Udostępnij na innych stronach

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

  • Administratorzy
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

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

  • Administratorzy

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

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

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