Skocz do zawartości

Rekomendowane odpowiedzi

DOWNLOAD

v1.0
//Z błędem ;]

v1.01
//Aktualna wersja, bez bugu :P

Zainspirowany postem PsichiXa w shoutboxie, że zaraz da nam przykład wody, oddaje w Wasze ręce prosty (tj. prosty kod mam na myśli) system zniekształceń al'a woda.

 

Jak tylko wpadnę na jakiś w miarę wydajny pomysł dodam do tego dynamiczne oświetlenie, dzięki czemu będzie można to zastosować w grze top-down, i będzie to wyglądać, że tak to nazwę, trójwymiarowo :P

 

Tym razem nie mam ochoty się zbytnio rozpisywać, więc przejdę do wyjaśniania argumentów.

 

iwave_init(width, height);

No, chyba wiadomo. Walimy to w Create jakiegoś obiektu, który ma malować falę, argumenty chyba są jasne :P

ivawe_draw(surf, x, y, precision, wavesize, wavespeed);

Maluje podanego surface'a zniekrztałcając go, na podanej pozycji.

precision - jak precyzyjny ma być efekt. Im większa wartość, tym mniejsza wydajność, ale za to dokładniejsze malowanie (radzę samemu poeksperymentować z argumentami i się dowiedzieć, co to dokładnie daje... :P ).

wavesize - jak duże mają być fale. Zalecana wartość od 0 do 1.

wavespeed - jak szybko nasz obrazek ma falować, chyba wsyztsko jest jasne

 

No, więcej mi się pisać nie chce ;P

Działanie chyba każdy zrozumie, bo wbrew pozorom jest to banalny do napisania efekt.

 

Screenu z domyślnych wartości funkcji nie ma sensu wrzucać, bo na statycznym obarzku po rpostu nie widać efektu :P

Wrzucę za to screena z bardziej hardcorowych ustawień :D

 

http://eportal.boo.pl/upload/file.php?id=2_1.png

 

Edit: Aktualizacja. Wywaliłem ostatni argument (wavelength) - otóż doszedłem do wniosku, iż jeśli chcemy, aby fale był "równe" (tzn. tak samo duże poziomo i pionowo), musi on przywrzeć wartość 1/wavesize.

Teraz nie trzeba się nim martwić - ustawienie swojej "własnej" fali ogranicza się do wyboru jakości, skali i prędkości :P

 

Btw, macie jakieś pomysły na przykłady :P ?

W najbliższym czasie prawdopodobnie napiszę gesty myszy, fake-3d, i engine smug do pocisków ze spritów (on już w sumie jest gotowy, tylko go w funkcje obudować muszę) ale jakoś, nie mam teraz na to ochoty.

Napisałbym sobie coś, ze tak to nazwę, graficznego :D

Odnośnik do komentarza
Udostępnij na innych stronach

dzisiaj nie skoncze falowania, bo znikam, ale jutro je zrobie i porownamy, czy szybciej wyjdzie pixel shaderem czy GMowym surface i prymitywy ;)

ah i mam dla Ciebie nowe wyzwanie - efekt frost :D

Odnośnik do komentarza
Udostępnij na innych stronach

o wlasnie o ten efekt chodzi :) zaloze sie ze nie zrobisz tego w GM aby bylo wydajne :P (czytaj: generowane realtime)

Odnośnik do komentarza
Udostępnij na innych stronach

tylko żeby było jasne o jaki efekt konkretnie mi chodzi (bo kilka osób podało różniące się) to zależy mi na tym właśnie: http://photoshop.pl/node/7182 :)

choć ten drugi efekt z oszronieniem powierzchni też bym chętnie zobaczył w GM. ja zrobię te 3 efekty (falowanie ekranu, frost i oszronienie powierzchni) i zrobimy takie małe testy wydajności, jakości i ogólnej efektywności :D hmm, mam pomysł, aby dać takowy contest, gdzie byśmy prowadzili bitwę na efekty graficzne :D no to do dzieła :D

Odnośnik do komentarza
Udostępnij na innych stronach

Ok, ale korzystamy z czystego gmla... ;]

 

Dobra, już się za to biorę ^_^

 

EDIT:

 

Mwahahaha :>

http://eportal.boo.pl/upload/file.php?id=4.png

 

Są jedynie dwa haczyki - pierwsze, że nie jest to zbyt wydajne rozwiązanie (aczkolwiek te 60fps powinno się wyrobić), i drugie, że to jest z udziałem losowości :P

Jedynym widocznym sposobem na zrobienie tego bez użycia random() jest jak dla mnie chyba tylko zapisanie jakby maski zniekrztałceń do jakieś tablicy - ale takie coś dla większych obrazków nie ma sensu.

 

Dobra, idę to jakoś zoptymalizować ;]

 

Ed: O sory, nie zauważyłem, że mój ostatni post :P

Ed2: 200fps dla obrazka 800x600. No ale powiedzmy, że zrobiłem ;>

 

Mów teraz co to oszronienie powierzchni :D

Odnośnik do komentarza
Udostępnij na innych stronach

Ok, ale korzystamy z czystego gmla...

nenene, nie tylko :P chodzi o to aby porównać efekty tworzone różnymi sposobami, grunt aby wszystko odpalało się w GMie. Moim celem jest szukanie takich rozwiązań w GMie które dały by podobny efekt i wydajnościowo były sobie bliskie z innymi technikami. Tak więc różne U3D, irrlichty, czy inne silniki też są dozwolone, ale efekty muszą być napisane własnoręcznie, bez gotowców :P

Zaraz założę temat na arenie :)

 

EDIT: mam nadzieje ze zrobisz teraz ten efekt dynamicznie, bo to powinno byc generowane realtime.

Odnośnik do komentarza
Udostępnij na innych stronach

http://mattburdette.com/extra/frost/frost_final_comp.mov

EDIT: Contest będzie wymagał oddania do testów EXEca wraz z wyświetlaniem FPS i ingerencją w ilość klatek na sek. więc przygotuj takowe sobie ;)

Odnośnik do komentarza
Udostępnij na innych stronach

Wczoraj przez to zasnąłem o 1 ;[ (bo myślałem nad tym, lol)

A wybrałem i tak najprostszy sposób, który mi do głowy wpadł :D

 

http://eportal.boo.pl/upload/file.php?id=frost.gmk

 

Stałego przekształcenia (no, żeby frost nie zmieniał się co stepa, bo to wygląda głupio) nie chce mi się robić - nie wiem, ile gm by zapisywał tablicę dwuwymiarową 800x600 :D

A innej możliwości zrobienia, żeby to było w gołym gmie chyba nie ma.

 

Najlepszy efekt byłby, gdyby przejechać to pętlą nie dwa a trzy razy - teraz prawe i lewe krawędzie nie są do końca sfrostowane, ale powiedzmy umownie, że nie widać tego aż tak bardzo :P

 

Ed: O kurde, robi się coraz ciekawiej :D

Mogę wykorzystywać grafiki, tak :P ?

Odnośnik do komentarza
Udostępnij na innych stronach

tak, ale wszystko musi byc realtime pamietaj, grafiki jedynie moga byc statycznie dodane :) no chyba ze dany efekt wymagalby inaczej, ale w temacie wszystko opisze

Odnośnik do komentarza
Udostępnij na innych stronach

Górne i dolne krawędzie są takie, jak trzeba :P

 

Jak już się czepiasz szczegółów:

GML
//frost(surf)

surface_set_target(sfrost);

draw_surface(argument0, 0, 0);

//202, 248

rndragex = 5;

rndragey = 3;

rndragex2 = 1;

 

xx = 0;

repeat(799)

{

draw_surface_part(sfrost, xx, 0, 1, 600, xx, 0-rndragex+random(2*rndragex));

 

xx += 1;

}

yy = 0;

repeat(599)

{

draw_surface_part(sfrost, 0, yy, 800, 1, 0-rndragey+random(2*rndragey), yy);

 

yy += 1;

}

 

xx = 0;

repeat(799)

{

draw_surface_part(sfrost, xx, 0, 1, 600, xx, 0-rndragex2+random(2*rndragex2));

 

xx += 1;

}

 

 

surface_reset_target();

draw_surface(sfrost, 0, 0);

Masz. Ale kosztem wydajności, która zresztą i tak jest już mizerna :P
Odnośnik do komentarza
Udostępnij na innych stronach

Poprawka do frosta:

http://eportal.boo.pl/upload/file.php?id=frostv2.gmk

 

Teraz frost nie jest losowany (czyli nie "rusza się", jest statyczny) :D

Jedząc obiad wpadłem na to, że przecież nie muszę tworzyć mapy przesunięcia (tak se to nazwałem :x) dla całego ekranu - wystarczy stworzyć mały fragment, i powielać o dla innych części ekranu.

 

Ponadto, jeśli zmodyfikujemy mapę przesunięcia, żeby nie byłą losowa, a podliczana według jakiegoś naszego algorytmu, możemy uzyskać ciekawe efekty typu:

http://eportal.boo.pl/upload/file.php?id=6.png

 

Cóż, teraz tylko trzeba wymyślić jakiś cudowny sposób optymalizacji tego... :D

Odnośnik do komentarza
Udostępnij na innych stronach

  • 10 miesięcy temu...

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