Skocz do zawartości

Obrot prostokatu


Rekomendowane odpowiedzi

Wiatm, znów mam mały problem. Mianowicie korzystam w programie z draw_rectangle i tutaj pytanie:

Jak obracać ten rysowany prostokąt o jakiś kąt? Istnieje jakaś funkcja? Bo nic nie znalazłem...

 

Z góry wielkie dzięki :)

Odnośnik do komentarza
Udostępnij na innych stronach

Starczy draw_line i lengthdir'y.

GML
x2 = x1+lengthdir_x(dlugosc_bok1, kat);

y2 = y1+lengthdir_y(dlugosc_bok1, kat);

x3 = x2+lengthdir_x(dlugosc_bok2, kat+90);

y3 = y2+lengthdir_y(dlugosc_bok2, kat+90);

x4 = x3+lengthdir_x(dlugosc_bok1, kat+180);

y4 = y3+lengthdir_y(dlugosc_bok1, kat+180);

x5 = x4+lengthdir_x(dlugosc_bok2, kat+270);

y5 = y4+lengthdir_y(dlugosc_bok2, kat+270);

 

draw_line( x1, y1, x2, y2 );

draw_line( x2, y2, x3, y3 );

draw_line( x3, y3, x4, y4 );

draw_line( x4, y4, x5, y5 );

 

voila!

 

lub jak kto woli:

GML
draw_primitive_begin(pr_linestrip);

 

draw_vertex(x1,y1);

draw_vertex(x2,y2);

draw_vertex(x3,y3);

draw_vertex(x4,y4);

draw_vertex(x5,y5);

 

draw_primitive_end();

 

A żeby było jeszcze prościej robisz se skrypt draw_rectangle_angle i wsadzasz:

GML
x1 = argument0; // poczatkowy x

y1 = argument1; // poczatkowy y

/*

argument2 - dlugosc 1 boku

argument3 - dlugosc 2 boku

argument4 - kat

*/

x2 = x1+lengthdir_x(argument2, argument4);

y2 = y1+lengthdir_y(argument2, argument4);

x3 = x2+lengthdir_x(argument3, argument4+90);

y3 = y2+lengthdir_y(argument3, argument4+90);

x4 = x3+lengthdir_x(argument2, argument4+180);

y4 = y3+lengthdir_y(argument2, argument4+180);

x5 = x4+lengthdir_x(argument3, argument4+270);

y5 = y4+lengthdir_y(argument3, argument4+270);

 

draw_primitive_begin(pr_linestrip);

 

draw_vertex(x1,y1);

draw_vertex(x2,y2);

draw_vertex(x3,y3);

draw_vertex(x4,y4);

draw_vertex(x5,y5);

 

draw_primitive_end();

Odnośnik do komentarza
Udostępnij na innych stronach

@Yoda:

Ach, sorry, pomyłka w poprzednim poście. Nie draw_rectangle, tylko draw_triangle. ;p Rysowania dwóch trójkątów tak, żeby utworzyły prostokąt. Problem pojawi się, jeśli będziemy chcieli narysować sam obrys, bo wtedy widoczna będzie przekątna, ale zawsze można ją zakryć linią. No i zauważ, że Twoja funkcja wymięka, kiedy zachodzi potrzeba narysowania wypełnionego prostokąta. ;)

Odnośnik do komentarza
Udostępnij na innych stronach

@Yoda:

Ach, sorry, pomyłka w poprzednim poście. Nie draw_rectangle, tylko draw_triangle. ;p Rysowania dwóch trójkątów tak, żeby utworzyły prostokąt. Problem pojawi się, jeśli będziemy chcieli narysować sam obrys, bo wtedy widoczna będzie przekątna, ale zawsze można ją zakryć linią. No i zauważ, że Twoja funkcja wymięka, kiedy zachodzi potrzeba narysowania wypełnionego prostokąta. ;)

 

Chodzi o wypełniony prostokąt. Sorki bardzo Yoda, że tego nie podkreśliłem :)

 

W tej chwili rysuje wypełniony białym kolorem prostokąt i zmieniam jego image_alpha :)

 

Ale jakoś nie mogę sobie wyobrazić na jakiej podstawie miałyby funkcjonować te trójkąty, może mi ktoś to wytłumaczyć?

 

@lenin: Aaa, pomyśle nad tym :)

Odnośnik do komentarza
Udostępnij na innych stronach

W tej chwili rysuje wypełniony białym kolorem prostokąt i zmieniam jego image_alpha :)
Za pomocą image_alpha obraca sie sprite'a, więc jakim cudem obracasz nim rysowany prostokąt? :|

 

Ale jakoś nie mogę sobie wyobrazić na jakiej podstawie miałyby funkcjonować te trójkąty, może mi ktoś to wytłumaczyć?
Jeśli przetniesz prostokąt wzdłuż przekątnej, powstaną dwa trójkąty, nie? =3
Odnośnik do komentarza
Udostępnij na innych stronach

Za pomocą image_alpha obraca sie sprite'a, więc jakim cudem obracasz nim rysowany prostokąt? :|

 

Jeśli przetniesz prostokąt wzdłuż przekątnej, powstaną dwa trójkąty, nie? =3

 

1. Za pomocą image_alpha zmienia się przezroczystosc obiektu :) A do rysowanego prostokątu mam kod:

GML
draw_set_alpha (image_alpha);

i zniemniam jego przezroczystosc :)

 

2.Nom, dwa trójkąty prostokątne. Ale jak obracać trójkąty, żeby uzyskać efekt obracanego prostokąta?

Odnośnik do komentarza
Udostępnij na innych stronach

draw_rectangle_angle(x1,y1,a,b,outline,angle);

x1, y1 - pozycja lewego górnego rogu prostokąta

a, b - długości boków

outline - obrys (0)* czy wypełniony (1)

angle - kąt obrotu

GML
x1 = argument0;

y1 = argument1;

a = argument2;

b = argument3;

outline = argument4;

angle = argument5;

 

px1 = x1 + lengthdir_x(a,angle);

py1 = y1 + lengthdir_y(a,angle);

 

px2 = px1 + lengthdir_x(b,angle-90);

py2 = py1 + lengthdir_y(b,angle-90);

 

px3 = px2 + lengthdir_x(a,angle-180);

py3 = py2 + lengthdir_y(a,angle-180);

 

if (outline)

{

draw_line(x1,y1,px1,py1);

draw_line(px1,py1,px2,py2);

draw_line(px2,py2,px3,py3);

draw_line(px3,py3,x1,y1);

}

else

{

draw_triangle(x1,y1,px1,py1,px2,py2,0);

draw_triangle(px3,py3,px1,py1,px2,py2,0);

}

* - obrys nie wychodzi najlepiej przy obrocie...

Odnośnik do komentarza
Udostępnij na innych stronach

Użyj draw_primitive, a nie trójkątów.

 

Nie wiem jak użyć draw_promitive ponieważ pierwszy raz sie spotykam z ta funkcja, a na trójkątach to dobrze wygląda... :)

 

EDIT:

Już sobie poradziłem, działa świetnie :)

 

Tak powinien wyglądać kod:

GML
else

{

draw_triangle(x1,y1,px1,py1,px2,py2,0);

draw_triangle(px3,py3,px2,py2,x1,y1,0);

}

 

Matthew oczywiście w credits :)

Odnośnik do komentarza
Udostępnij na innych stronach

Nie wiem jak użyć draw_promitive ponieważ pierwszy raz sie spotykam z ta funkcja, a na trójkątach to dobrze wygląda... smile.gif

Podawałem w moich poprzednich postach:

 

GML
x1 = argument0; // poczatkowy x

y1 = argument1; // poczatkowy y

/*

argument2 - dlugosc 1 boku

argument3 - dlugosc 2 boku

argument4 - kat

*/

x2 = x1+lengthdir_x(argument2, argument4);

y2 = y1+lengthdir_y(argument2, argument4);

x3 = x2+lengthdir_x(argument3, argument4+90);

y3 = y2+lengthdir_y(argument3, argument4+90);

x4 = x3+lengthdir_x(argument2, argument4+180);

y4 = y3+lengthdir_y(argument2, argument4+180);

x5 = x4+lengthdir_x(argument3, argument4+270);

y5 = y4+lengthdir_y(argument3, argument4+270);

 

draw_primitive_begin(pr_trianglestrip);

 

draw_vertex(x1,y1);

draw_vertex(x2,y2);

draw_vertex(x3,y3);

draw_vertex(x4,y4);

draw_vertex(x5,y5);

 

draw_primitive_end();

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