00Andre Temat założony przez niniejszego użytkownika |
[C++][Allegro5] Problem z obliczeniem pola bitmapa(z alpha) » 2016-02-05 20:42:48 Siemka Mam mały problem, otóż bitmap jest obracany względem punktu w/2, h/2 Potrzebuje obliczyć pole bitmapa z alpha Tutaj obrazek: Obliczenie początkowego pola jest łatwe: float fx = x -( w / 2 ); float fy = y -( h / 2 );
fx + w... fy + h...
Problem jest przy obróceniu o dany kąt. Próbowałem pozycje fx pomnożyć przez speed * cos(( angle * M_PI ) / 180 ) ) i fy speed * sin(( angle * M_PI ) / 180 ) ) Ale nie wychodziło poprawnie pole. Ma ktoś jakiś pomysł jak to zrobić ? |
|
marianekA |
» 2016-02-06 02:50:28 Nie wiem do czego Ci to potrzebne ale spróbuj od razu zrobić pole w którym zmieści się obiekt w każdej pozycji. |
|
00Andre Temat założony przez niniejszego użytkownika |
» 2016-02-06 10:34:10 Potrzebuje to przy funkcji np. klikniecie na bitmap. Myszka musi być na polu bitmapa(z alpha). Ten twój sposób jest nawet fajny, dzisiaj to spróbuje zrobić to
|
|
marianekA |
» 2016-02-08 00:29:22 Ja to robię tak: bitmap z obrazkiem na czarnym tle (0,0,0), tło deklaruję jako przezroczyste. Przy użyciu funkcji al_get_pixel( bitmap, mx, my ) |
i składowych RGB mam kolor pixela pod wskaźnikiem myszki. ALLEGRO_COLOR kolor = al_get_pixel( bitmap, mx, my ); unsigned char r, g, b; al_unmap_rgb( kolor, & r, & g, & b ); rgb = r + g + b; if( rgb > 0 i klik myszki ) tu Twoje zdarzenie...
W ten sposób można robić np. przyciski o przeróżnych kształtach. |
|
00Andre Temat założony przez niniejszego użytkownika |
» 2016-02-11 11:45:50 Może źle to wytłumaczyłem. @marianekA U mnie funkcja działa dobrze, wiem jak to zrobić z klikaniem ;) Jak jest bitmap (nie obracany) to jest sprawdzane położenie myszki, czy jest na bitmapie(jego polu z alpha) i to działa. wtedy szerokość i wysokość bitamp'a pasują. Ale jak już obrócę bitmap'a o dany kąt, to szerokość i wysokość początkowa nie pasuje, bo trzeba ustawić do obróconego bitmapa. Bo jak ustawie pole podstawowe bitmapa do obróconego to jedynie fragment jego lub jakoś cześć nie będzie dostępna. Nie wiem jak obliczyć szerokość i wysokość po obróceniu, aby pole bitmapa pasowało do do bitmapa obróconego o dany kąt // Obrazek robiłem w Paincie, może być nie dokładny xd |
|
marianekA |
» 2016-02-12 14:17:20 Przecież bitmap z obiektem na ekranie jest jak warstwa, możesz mieć ją nawet na cały ekran, tło tej bitmapy ustawiasz jako przezroczyste i widoczny jest tylko obiekt. Robisz z nim co chcesz nawet kolizje tyle że z pominięciem koloru tła - tego przezroczystego. Jeśli już koniecznie musi być jak to sobie zaplanowałeś to mogłoby być tak: Tworzysz dodatkowy bitmap o na którym zmieści się swobodnie Twój obiekt w każdej pozycji. Tło przezroczyste, na nim wstawiasz Twój obiekt obrócony o zaplanowany kąt. Ja w przykładzie użyłem tła czarnego (0,0,0) Teraz przydatna funkcja o której wcześniej pisałem. szerokość obiektu: unsigned char r, g, b; int szerokosc = 0, wysokosc = 0; int v = 0; for( int x = 0; x < al_get_bitmap_width( dodatkowy_bitmap ); ++x ) for( int y = 0; y < al_get_bitmap_height( dodatkowy_bitmap ); ++y ) { al_unmap_rgb( al_get_pixel( dodatkowy_bitmap, x, y ), & r, & g, & b ); kolor = r + g + b; if( kolor > 0 && v == 0 ) v = x; if( kolor > 0 && v > 0 ) szerokosc = x - v + 1; } cout << "szerokosc= " << szerokosc << endl;
Wysokość obiektu ustalasz analogicznie i już masz dane do wielkości pola. Dodam tylko że pewnie z tego nie skorzystasz bo sprawdzenie pola 100x100 funkcją al_get_pixel() trwa 2 sekundy, pola 200x200 to już ponad 30 sekund |
|
00Andre Temat założony przez niniejszego użytkownika |
Hurra » 2016-02-15 11:35:05 Rozwiązałem problem samodzielnie, ale dzięki, że podawałeś pomysły. Obliczyłem długość odcinka {x, x+(w/2)} {y, y+(h/2)} i działa. Szerokość i wysokość podzielone przez dwa, ponieważ pozycja {x, y} jest środkiem bitmapa oto kod rozwiązanie double dst = sqrt( pow(( x +( w / 2 ) ) - x, 2 ) + pow(( y +( h / 2 ) ) - y, 2 ) );
al_draw_rectangle( x - dst, y - dst, x + dst, y + dst, al_map_rgb( 0, 0, 0 ), 1 );
|
|
« 1 » |