Rughailon Temat założony przez niniejszego użytkownika |
[C++, Allegro5] Problem ze światłami » 2014-03-02 20:39:46 Witam. Cały weekend próbuję wprowadzić do mojej gierki takie światła: http://warsztat.gd/screens/65e9bd8be1574cc4d4a3efc6df699b9c.png Jednak mi to nie wychodzi. Mam klasę światła, w którym obiekty trzymam w vectorze. http://screenshooter.net/1369074/bmylasa (Na zdjęciu nie dodałem alphy, dlatego tak dziwnie to wygląda). Kod: float a = 0, r = 0, g = 0; CLights::CLights( int x, int y, int radius ) { this->x = x; this->y = y; this->radius = radius; }
void CLights::drawLights( ALLEGRO_BITMAP * light ) { al_set_blender( ALLEGRO_DEST_MINUS_SRC, ALLEGRO_ONE, ALLEGRO_ONE ); al_draw_tinted_scaled_bitmap( light, al_map_rgba( 255, 255, 255, a ), 0, 0, getBmpW( light ), getBmpH( light ), x, y, getBmpW( light ) + radius, getBmpH( light ) + radius, 0 ); al_set_blender( ALLEGRO_ADD, ALLEGRO_ONE, ALLEGRO_INVERSE_ALPHA ); } void CycleOfDay( CTime times ) { if( times.compareH( 18 - 1, '>' ) && a <= 200 ) { a += 0.1; } else if( times.compareH( 6 - 1, '>' ) && a > 0 ) { a -= 0.1; } if( times.compareH( 18 - 1, '>' ) && times.compareH( 21 - 1, '<' ) && r <= 255 && g <= 165 ) { r += 0.1; g += 0.06; } if( times.compareH( 19 - 1, '>' ) && r > 0 && g > 0 ) { r -= 0.2; g -= 0.12; } al_draw_filled_rectangle( 0, 0, WIN_W, WIN_H, al_map_rgba( r, g, 0, a ) ); }
I teraz chcę, aby bitmapa światła 'wypaliła' dziurę w bitmapie ciemności, aby wyglądało to jak światło. Niestety mimo wielu prób nie udało mi się dojść do oczekiwanego efektu. W najbardziej pomyślnej próbie zniszczyłem jeszcze jedną bitmapę światła w innym vectorze dodającą fajny efekt. http://screenshooter.net/1369074/yuoxdfs http://screenshooter.net/1369074/fageknq Tak więc, czy istnieje możliwość zrobienia tego bez niszczenia tego ostatniego efektu? Z góry dzięki za pomoc. ;) |
|
Rughailon Temat założony przez niniejszego użytkownika |
» 2014-03-05 20:57:45 Naprawdę nikt nie potrafi mi pomóc? //edit Na warsztat.gd już częściowo pomogli, reszte sam ogarnąłem. Rozwiązanie: Wyświetlanie bitmap: al_set_blender( ALLEGRO_DEST_MINUS_SRC, ALLEGRO_ONE, ALLEGRO_ONE ); al_draw_tinted_scaled_bitmap( light, al_map_rgba( 255, 255, 255, a ), 0, 0, getBmpW( light ), getBmpH( light ), x - scrollX, y - scrollY, getBmpW( light ) + radius, getBmpH( light ) + radius, 0 ); al_set_blender( ALLEGRO_ADD, ALLEGRO_ONE, ALLEGRO_INVERSE_ALPHA );
Bitmapa ma mieć biały środek, a po bokach ma się miękko zwiększać alpha. http://screenshooter.net/1369074/homasyh Tworzenie ciemnej bitmapy, która będzie służyć, jako noc. ALLEGRO_BITMAP * bmp = al_create_bitmap( 1024, 768 );
A teraz wyświetlanie i inne. al_set_target_bitmap( bmp ); al_clear_to_color( al_map_rgb( 0, 0, 0 ) ); for( int i = 0; i < lightsx.size(); ++i ) lightsx[ i ].drawLights( light1 );
al_set_target_backbuffer( al_get_current_display() ); al_draw_tinted_bitmap( bmp, al_map_rgba( 0, 0, 0, alpha ), 0, 0, 0 );
I to wszystko. Mam nadzieję, że komuś pomogłem. ;) |
|
« 1 » |