Skocz do zawartości

Rysowanie wielokątów (skrypt+przykład)


Rekomendowane odpowiedzi

Zainspirowany Tymonowym przykładem transformacje.gm6 postanowiłem pójść o krok dalej - napisałem funkcję rysującą wielokąt o dowolnej przekątnej (skala), dowolnej rotacji i nie mniej dowolnej liczbie boków. Sam skrypt jest przyjazny dla tych, którzy dopiero zaczynają swoją przygodę z GML (komentarze!). Nie będę się więc rozpisywał, gdyż wszystko jest opisane właśnie w komentarzach.

 

//funkcja rysuj_wielokat(ilosc_bokow,skala,rotacja)
//- funkcja pozwalająca
//użytkownikowi rysowac wielokat foremny o dowolnej liczbie bokow (no moze bez
//przesady, przy ponad dwudziestu to juz zaczyna wygladac jak kolo)
//
//
//copyright by Phar 2007
//Jesli skorzystasz z tego przykladu, miloby bylo gdyby wzmianka o tym
//pojawila sie w liscie plac twojej gry. Ciebie to nic nie kosztuje,
//a niebywale podnosi moje morale i daje mi motywacje!
//
//
//argumenty funkcji:
////ilosc_bokow - okresla nam oczywiscie ilosc bokow (katow?) wielokata
////skala - odleglosc laczaca srodek figury z wierzcholkiem, okresla nam jak wielka
////////////bedzie nasza figura (analogicznie do promienia w draw_circle())
////rotacja - obrot narysowanej juz figury o dany kat (w stopniach 0-360)

//Kilka uwag:

//po pierwsze i najważniejsze to sprawdzic, czy uzyszkodnik podal logiczne argumenty,
//ewentualnie poprawic to, co sie da

ilosc_bokow=argument0;
skala=argument1;
rotacja=argument2;


if ilosc_bokow<3 then
{
draw_text(x,y,"BLAD!#Wielokat ma conajmniej 3 katy!");
//i wtedy nie ma bata, funkcje przerywamy.
}
else
{
//po pierwsze nalezy sie dowiedziec, co ile stopni
//generowany jest kolejny wierzcholek
//(dla matematycznych zboli: odnalezc kat pomiedzy
//przekatnymi)
coile=360/ilosc_bokow;

//teraz mozna juz generowac wierzcholki.
//zapiszemy je w dwuwymiarowej tablicy,
//gdzie pierwszy wymiar oznacza indeks wierzcholka,
//a drugi wymiar - dany koordynat (0 to x, 1 to y)

for (i=0; i<ilosc_bokow; i+=1)
{
wierzcholek[i,0]=x+lengthdir_x(skala,i*coile+90+rotacja);
wierzcholek[i,1]=y+lengthdir_y(skala,i*coile+90+rotacja);
}

//no to teraz sobie porysujemy.

draw_primitive_begin(pr_trianglefan)
{
    for (j=0; j<ilosc_bokow; j+=1)
    {
    draw_vertex(wierzcholek[j,0],wierzcholek[j,1]);
    }
draw_vertex(wierzcholek[0,0],wierzcholek[0,1]); //(nie zapomnijmy o wierzcholku konczacym)
}
draw_primitive_end();
}

 

Dołączam także przykład dla Game Makera 7 - spokojnie pójdzie na niezarejestrowanej wersji. Enjoy!

Odnośnik do komentarza
Udostępnij na innych stronach

Zgubiłeś }. ;)

Pozytywne. Dobrze napisane, ładnie opisane.

Cieszy mnie, że jestem źródłem inspiracji. :)

 

Napisanie transformacje.gm6 służyło nieco innemu celowi, zaraz poszukam tego co zrobiłem na jego podstawie.

 

EDIT

https://gmclan.org/up152_3_p3d.html

Strzałki, Z, X obracanie. S solid. Prosty efekt bez użycia funkcji d3d. ;)

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