Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++, Allegro5] Problem ze światłami

Ostatnio zmodyfikowano 2014-03-05 20:57
Autor Wiadomość
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:
C/C++
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 ); //Wyswietlanie bitmapy swiatla.
    al_set_blender( ALLEGRO_ADD, ALLEGRO_ONE, ALLEGRO_INVERSE_ALPHA );
}
void CycleOfDay( CTime times ) { //Funkcja odpowiada za wyświetlanie bitmapy ciemności(kolory 'r g' odpowiadaja za widowiskowe zachody slonca itp.)
    if( times.compareH( 18 - 1, '>' ) && a <= 200 ) { a += 0.1; } //To nie ma nic do rzeczy.
    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 ) ); //Wyswietlanie bitmapy.
}

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. ;)
P-105532
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:
C/C++
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 ); //Zwykła funkcja na wyświetlanie bitmapy
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.
C/C++
ALLEGRO_BITMAP * bmp = al_create_bitmap( 1024, 768 ); //wielkość, jak ekran.
A teraz wyświetlanie i inne.
C/C++
al_set_target_bitmap( bmp );
al_clear_to_color( al_map_rgb( 0, 0, 0 ) ); //czyszczenie bitmapy nocy na czarno
for( int i = 0; i < lightsx.size(); ++i ) lightsx[ i ].drawLights( light1 ); //zwykłe wyświetlanie świateł. Ja dałem vector z obiektami.

al_set_target_backbuffer( al_get_current_display() );
al_draw_tinted_bitmap( bmp, al_map_rgba( 0, 0, 0, alpha ), 0, 0, 0 ); //wyświetlanie bitmapy nocy

I to wszystko. Mam nadzieję, że komuś pomogłem. ;)
P-105694
« 1 »
  Strona 1 z 1