Skocz do zawartości

Modyfikacja sprite'ów


Jakim

Rekomendowane odpowiedzi

Mam problem - niestety jest to kluczowy problem dla mojej gry.

 

Otóż załóżmy, że jak kliknę myszką w punkcie x, y, to w spricie spr_teren robi się dziura w kształcie koła o środku w tym właśnie punkcie (coś a'la Wormsy). Czy w GMie dałoby się to wykonać (mogą być także biblioteki, chętnie bym z niektórych skorzystał)?

 

Próbowałem różnych sposobów, ale albo zżerały dużo pamięci, albo były nieskuteczne.

 

Z góry dziękuję za pomoc.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Filar Społeczności

Musisz się zainteresować "surfaces".

 

1) Tworzymy surface za pomocą funkcji surface_create.

2) Tworzymy sprita za pomocą sprite_create_from_surface (na podstawie surface wczesniej utworzonego).

3) Tworzymy obiekt "teren" i podpinamy utworzony powyżej sprite.

4) Wyswietlamy obiekt na planszy.

 

5) Gdy klikamy myszka, to:

6) W jakims obiekcie w event draw przelaczamy plaszczyzne rysowania na surface przez nas utworzony za pomoca funkcji surface_set_target

7) Rusyjemy kolo w kolorze lewego dolnego piksela w surface (warto na samym poczatku tworzenia surface narysowac na nim piksel jakiegos koloru za pomoca funkcji draw_point_color).

8) Resetujemy plaszczyzne rysowania na glowny surface gry za pomoca funkcji surface_reset_target

9) Tworzymy nowy sprite jak w punkcie 2

10) Nadpisujemy sprite przypisany obiektowi teren za pomoca funkcji sprite_assign

11) Niszczymy sprite utworzony w punkcie 9.

12) Wracamy do punktu 5.

 

 

Teraz niech ktos napisze przyklad. ;P

Odnośnik do komentarza
Udostępnij na innych stronach

  • Filar Społeczności

No Zakol się postarał, ale nie obeszło się niestety bez jednego poważnego błędu. :P Otóż chodzi o to, że sprite_create_from_screen zwraca indeks nowego sprite'a. W przykładzie Zakola jest on od razu tracony, a przecież musimy po sprite_assign zniszczyć go za pomocą sprite_delete, tak jak napisałem w punkcie 11. Inaczej będziemy stopniowo zapychać pamięć komputera starymi i nieużywanymi już spritami. A finał sami znacie. :)

Odnośnik do komentarza
Udostępnij na innych stronach

W przykładzie Zakola jest on od razu tracony, a przecież musimy po sprite_assign zniszczyć go za pomocą sprite_delete, tak jak napisałem w punkcie 11.

 

Czyli poprawny kod powinien wyglądać tak (chodzi o 10 linijkę?)?

 

if (create_new_sprite == true)
{
surface_set_target(global.surface);
draw_sprite(sprite_background, 0, 0, 0);
draw_point_color(0, 479, c_white);
surface_reset_target();
sprite_assign(global.sprite, sprite_create_from_surface(global.surface, 0, 0, 640, 480, true, true, true, true, 0, 0));
create_new_sprite = false;
sprite_delete(global.surface);
}

draw_sprite(global.sprite, 0, 0, 0);

if (mouse_check_button(mb_left))
{
surface_set_target(global.surface);
draw_set_color(c_white);
draw_ellipse(mouse_x - 32, mouse_y - 32, mouse_x + 32, mouse_y + 32, false);
surface_reset_target();
sprite_assign(global.sprite, sprite_create_from_surface(global.surface, 0, 0, 640, 480, true, true, true, true, 0, 0));
}

Odnośnik do komentarza
Udostępnij na innych stronach

Chodzi tu bardziej o 21 linijkę, bo będzie ona wykonywana przy każdym kliknięciu myszki, w przeciwieństwie do 10 wykonywanej tylko przy załadowaniu roomu. Powinno być tak:

if (create_new_sprite == true)
{
surface_set_target(global.surface);
draw_sprite(sprite_background, 0, 0, 0);
draw_point_color(0, 479, c_white);
surface_reset_target();
sprite_assign(global.sprite, sprite_create_from_surface(global.surface, 0, 0, 640, 480, true, true, true, true, 0, 0));
create_new_sprite = false;
}

draw_sprite(global.sprite, 0, 0, 0);

if (mouse_check_button(mb_left))
{
surface_set_target(global.surface);
draw_set_color(c_white);
draw_ellipse(mouse_x - 32, mouse_y - 32, mouse_x + 32, mouse_y + 32, false);
surface_reset_target();
sprite_del = sprite_create_from_surface(global.surface, 0, 0, 640, 480, true, true, true, true, 0, 0);
sprite_assign(global.sprite, sprite_del);
sprite_delete(sprite_del);
}

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