Jakim Opublikowano 20 Kwietnia 2006 Udostępnij Opublikowano 20 Kwietnia 2006 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 Więcej opcji udostępniania...
Filar Społeczności Ranmus Opublikowano 20 Kwietnia 2006 Filar Społeczności Udostępnij Opublikowano 20 Kwietnia 2006 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 Więcej opcji udostępniania...
Zakol Opublikowano 20 Kwietnia 2006 Udostępnij Opublikowano 20 Kwietnia 2006 Oto i on: Przykład Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Jakim Opublikowano 21 Kwietnia 2006 Autor Udostępnij Opublikowano 21 Kwietnia 2006 Działa. Obeszło się bez przykładu, ale i tak looknę - może jeszcze się czegoś nowego dowiem :). Dzięki za pomoc :thumbsup:. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Filar Społeczności Ranmus Opublikowano 21 Kwietnia 2006 Filar Społeczności Udostępnij Opublikowano 21 Kwietnia 2006 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 Więcej opcji udostępniania...
Jakim Opublikowano 21 Kwietnia 2006 Autor Udostępnij Opublikowano 21 Kwietnia 2006 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 Więcej opcji udostępniania...
Zakol Opublikowano 22 Kwietnia 2006 Udostępnij Opublikowano 22 Kwietnia 2006 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 Więcej opcji udostępniania...
Jakim Opublikowano 22 Kwietnia 2006 Autor Udostępnij Opublikowano 22 Kwietnia 2006 Ok, dzięki :thumbsup:. Wszystko działa poprawnie i nie chodzi coraz wolniej :). 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ę