| ggerek Temat założony przez niniejszego użytkownika | SFML - oświetlenie  » 2014-07-26 13:11:20 Chciałby w mojej grze uzyskać efekt podobny do tego screena :  Do głowy przyszło mi kilka pomysłów :  1. Rysowanie tylko tego co jest wokół gracza,a resztę pozostawić czarną ( jeśli tak zrobię to nie będzie efektu światła) 2. Znalazłem w internecie coś takiego jak FBO, ale za nic nie mogę nic o tym znaleźć Jest jakiś lepszy sposób ? Z tych dwóch najlepszy wydaje mi się ten drugi, ale nie wiem jak on działa. Oświetlenie nie musi być "kwadratowe" jak na screenie, nawet lepiej gdyby było w miarę realistyczne. (coś w stylu latarki, ale bez kółka tylko z trójkątem w jedną stronę)  | 
|  | 
| pekfos | » 2014-07-26 13:43:26 Wiele jest sposobów, często zbyt złożonych by je tu opisywać. | 
|  | 
| ggerek Temat założony przez niniejszego użytkownika | » 2014-07-26 14:37:48 Dzięki za zainteresowanie, ale ja nie potrzebuje cieni. Wystarczy mi trójkątne światło z latarki. Mógłbym prosić o prosty spis punktów w skrócie co należny zrobić ?
 | 
|  | 
| pekfos | » 2014-07-26 14:45:44 Narysować biały trójkąt na osobnej czarnej teksturze, a potem wyświetlić ją z BlendMultiply. | 
|  | 
| ggerek Temat założony przez niniejszego użytkownika | » 2014-07-28 10:46:30 Próbuję to zrobić tak : class Latarka{
 public:
 int x;
 int y;
 CircleShape swiatlo;
 RectangleShape czern;
 BlendMode blendmode = BlendMultiply;
 Latarka()
 : czern( Vector2f( 1440, 900 ) )
 , swiatlo( 96, 3 )
 {
 czern.setFillColor( sf::Color( 0, 0, 0 ) );
 swiatlo.setFillColor( sf::Color( 255, 255, 255 ) );
 }
 int swiecenie( Latarka & latarka, Gracz & gracz );
 };
 
latarka.czern.setPosition( 0, 0 ); latarka.swiatlo.setPosition( latarka.x, latarka.y );
 okno.draw( latarka.czern );
 okno.draw( latarka.swiatlo, latarka.blendmode );
 
Ustawiając  BlendMode blendmode = BlendMultiply;  trójkąta nie widać  | 
|  | 
| pekfos | » 2014-07-28 11:06:13 | Narysować biały trójkąt na osobnej czarnej teksturze, a potem wyświetlić ją z BlendMultiply. | 
 | 
|  | 
| unkn9wn | » 2014-07-28 11:13:06 stwórz sf::RenderTexture, czarną, przezroczystą [oczywiście funkcją clear()]to na niej narysuj światło z sf::BlendAdd.
 wywołujesz ją, jak zdjęcie funkcją - display()
 i bierzesz do sprite'a
 sprite.setTexture(renderTextura.getTexture());
 
 teraz możesz rysować na ekranie
 | 
|  | 
| ggerek Temat założony przez niniejszego użytkownika | » 2014-07-28 12:14:18 Zrobiłem bardziej na wzór tego co napisał Pekfos : int Latarka::swiecenie( Latarka & latarka, Gracz & gracz ){
 latarka.x = gracz.x;
 latarka.y = gracz.y / 2;
 latarka.swiatlo.setFillColor( sf::Color( 255, 255, 255 ) );
 latarka.czern.create( 1440, 900 );
 latarka.czern.clear();
 latarka.oswietlenie.setTexture( latarka.czern.getTexture() );
 
 }
 
class Latarka{
 public:
 int x;
 int y;
 
 
 
 
 CircleShape swiatlo;
 RenderTexture czern;
 BlendMode blendmode = BlendMultiply;
 Sprite oswietlenie;
 Latarka()
 : swiatlo( 96, 3 )
 {
 }
 int swiecenie( Latarka & latarka, Gracz & gracz );
 };
 
int Grafika::rysowanie_mapy( RenderWindow & okno, Latarka & latarka, System & system, Mapa & mapaA, Zdarzenia & zdarzenie ){
 latarka.czern.display();
 latarka.czern.draw( latarka.swiatlo );
 
 for( int i = 0; i != 30; i++ )
 for( int j = 0; j != 30; j++ )
 {
 mapaA.kafelek[ i * 30 + j ]->wyglad.setPosition( mapaA.kafelek[ i * 30 + j ]->x - system.kamerax, mapaA.kafelek[ i * 30 + j ]->y - system.kameray );
 okno.draw( mapaA.kafelek[ i * 30 + j ]->wyglad );
 }
 
 okno.draw( latarka.oswietlenie, latarka.blendmode );
 }
 
Dzięki wam za pomoc. Mam ostatnie pytanie na temat oświetlenia. Chciałbym zrobić tak aby jasność "światła" malała z odległością.  | 
|  | 
| « 1 »  2 |