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 |