tBane Temat założony przez niniejszego użytkownika |
[SFML 2.X] Generowanie Sprajtów Budynków z dachem dwuspadowym » 2024-11-06 18:36:17 Witam. Wpadłem na pomysł by zautomatyzować renderowanie budynków to znaczy generować ich sprajty na podstawie ich rozmiaru. Zacząłem więc pisać algorytm i już napotkałem problem. Otóż generuje mi biały sprajt. void loadTexture() { short roof_size = 2; cout << size.x << " " << size.y << "\n"; sf::Image house_image; house_image.create( size.x * 16,( size.y + roof_size ) * 16, sf::Color::Black ); sf::Image wall; wall.create( 32, 32, sf::Color::Transparent ); wall = getTexture( "walls/wooden_wall" )->texture->copyToImage(); for( short y = 0; y < size.y / 2; y++ ) { for( short x = 0; x < size.x / 2; x++ ) { house_image.copy( wall, x * 2 * 16, house_image.getSize().y - y * 2 * 16 ); } } sf::Texture tex; tex.loadFromImage( house_image ); sprite = sf::Sprite(); sprite.setTexture( tex ); sprite.setOrigin( tex.getSize().x / 2, tex.getSize().y ); sprite.setPosition( position ); }
|
|
tBane Temat założony przez niniejszego użytkownika |
» 2024-11-06 18:53:51 Zmieniłem teksturę na wskaźnik i działa. Teraz generuje mi ładnie ściany. Czas zabrać się za dach .. Był kiedyś taki algorytm na rysowanie choink. Niech no sobie przypomnę.. void loadTexture( std::ifstream & file ) { cout << size.x << " " << size.y << "\n"; short walls_height = 4; sf::Image house_image; house_image.create( size.x * 16,( size.y + walls_height ) * 16, sf::Color::Black ); sf::Image wall; wall.create( 32, 32, sf::Color::Transparent ); wall = getTexture( "walls/wooden_wall" )->texture->copyToImage(); for( short y = 1; y <= walls_height; y++ ) { for( short x = 0; x < size.x / 2; x++ ) { house_image.copy( wall, x * 2 * 16, house_image.getSize().y - y * 2 * 16 ); } } sf::Texture * tex = new sf::Texture(); tex->loadFromImage( house_image ); sprite = sf::Sprite(); sprite.setTexture( * tex ); sprite.setOrigin( tex->getSize().x / 2, tex->getSize().y ); sprite.setPosition( position ); }
|
|
tBane Temat założony przez niniejszego użytkownika |
» 2024-11-06 19:31:45 Napisałem algoryt generowania dachu. Ale nie działa tzn rysuje "do góry nogami" dach. Pomoże ktoś ? short height = size.x / 4; short width = size.x / 2; short start_x; short end_x;
for( int y = height - 1; y >= 0; y-- ) { start_x = height - y - 1; end_x = height + y; for( int x = 0; x < width; x++ ) { if( x >= start_x && x <= end_x ) { house_image.copy( wall, x * 2 * 16, house_image.getSize().y -( y + walls_height ) * 2 * 16 ); } } }
|
|
tBane Temat założony przez niniejszego użytkownika |
» 2024-11-06 19:39:27 Dobra zrobiłem. Pozostaje dach. Choć z dachem będzie ciężej. Wie ktoś jak na sf::Image narysować sf::Shape? void loadTexture( std::ifstream & file ) { cout << size.x << " " << size.y << "\n"; short walls_height = 4; sf::Image house_image; house_image.create( size.x * 16,( size.y + walls_height ) * 16, sf::Color::Black ); sf::Image wall; wall.create( 32, 32, sf::Color::Transparent ); wall = getTexture( "walls/wooden_wall" )->texture->copyToImage(); for( short y = 1; y <= walls_height; y++ ) { for( short x = 0; x < size.x / 2; x++ ) { house_image.copy( wall, x * 2 * 16, house_image.getSize().y - y * 2 * 16 ); } } cout << "\n\n warning! \n"; short height = size.x / 4; short width = size.x / 2; short start_x; short end_x; for( int y = 1; y < height; y++ ) { start_x = y; end_x = width - y - 1; for( int x = 0; x < width; x++ ) { if( x >= start_x && x <= end_x ) { house_image.copy( wall, x * 2 * 16, house_image.getSize().y -( y + walls_height ) * 2 * 16 ); } } } sf::Texture * tex = new sf::Texture(); tex->loadFromImage( house_image ); sprite = sf::Sprite(); sprite.setTexture( * tex ); sprite.setOrigin( tex->getSize().x / 2, tex->getSize().y ); sprite.setPosition( position ); }
|
|
pekfos |
» 2024-11-06 21:29:39 Zmieniłem teksturę na wskaźnik i działa. sf::Texture * tex = new sf::Texture(); tex->loadFromImage( house_image );
sprite = sf::Sprite(); sprite.setTexture( * tex ); sprite.setOrigin( tex->getSize().x / 2, tex->getSize().y ); sprite.setPosition( position ); Czyli zrobiłeś wyciek pamięci? Nie trzeba było robić wskaźnika tylko zapewnić by tekstura istniała cały czas gdy potrzebujesz ją wyświetlać. Zapisz ją obok sprite, w klasie czy gdzie tam. Wie ktoś jak na sf::Image narysować sf::Shape? Możesz użyć sf::RenderTexture i przygotować teksturę operacjami renderowania zamiast ręcznie przez sf::Image. |
|
tBane Temat założony przez niniejszego użytkownika |
» 2024-11-06 21:29:40 Pozostało tylko wyciąć drzwi. void loadTexture( std::ifstream & file ) { cout << size.x << " " << size.y << "\n"; short walls_height = 4; sf::Image house_image; house_image.create( size.x * 16,( size.y + walls_height * 2 ) * 16, sf::Color::Transparent ); sf::Image wall; wall.create( 32, 32, sf::Color::Transparent ); wall = getTexture( "walls/wooden_wall" )->texture->copyToImage(); for( short y = 1; y <= walls_height; y++ ) { for( short x = 0; x < size.x / 2; x++ ) { house_image.copy( wall, x * 2 * 16, house_image.getSize().y - y * 2 * 16 ); } } cout << "\n\n warning! \n"; short height = size.x / 4; short width = size.x / 2; short start_x; short end_x; for( int y = 0; y <= height; y++ ) { start_x = y; end_x = width - y - 1; for( int x = 0; x < width; x++ ) { if( x >= start_x && x <= end_x ) { house_image.copy( wall, x * 2 * 16, house_image.getSize().y -( y + walls_height + 1 ) * 2 * 16 ); } } } sf::VertexArray leftTriangle( sf::Triangles, 3 ); leftTriangle[ 0 ].position = sf::Vector2f( 0, walls_height * 32 ); leftTriangle[ 1 ].position = sf::Vector2f( size.x / 4 * 32,( walls_height + size.x / 4 ) * 32 ); leftTriangle[ 2 ].position = sf::Vector2f( 0,( walls_height + size.x / 4 ) * 32 ); leftTriangle[ 0 ].color = sf::Color::Color( 51, 38, 21 ); leftTriangle[ 1 ].color = sf::Color::Color( 51, 38, 21 ); leftTriangle[ 2 ].color = sf::Color::Color( 51, 38, 21 ); sf::VertexArray rightTriangle( sf::Triangles, 3 ); rightTriangle[ 0 ].position = sf::Vector2f( size.x / 2 * 32, walls_height * 32 ); rightTriangle[ 1 ].position = sf::Vector2f( size.x / 4 * 32,( walls_height + size.x / 4 ) * 32 ); rightTriangle[ 2 ].position = sf::Vector2f( size.x / 2 * 32,( walls_height + size.x / 4 ) * 32 ); rightTriangle[ 0 ].color = sf::Color::Color( 51, 38, 21 ); rightTriangle[ 1 ].color = sf::Color::Color( 51, 38, 21 ); rightTriangle[ 2 ].color = sf::Color::Color( 51, 38, 21 ); sf::VertexArray topTriangle( sf::Triangles, 3 ); topTriangle[ 0 ].position = sf::Vector2f( 0,( walls_height + size.x / 4 ) * 32 ); topTriangle[ 1 ].position = sf::Vector2f( size.x / 2 * 32,( walls_height + size.x / 4 ) * 32 ); topTriangle[ 2 ].position = sf::Vector2f( size.x / 4 * 32,( walls_height + size.y / 2 ) * 32 ); topTriangle[ 0 ].color = sf::Color::Color( 51, 38, 21 ); topTriangle[ 1 ].color = sf::Color::Color( 51, 38, 21 ); topTriangle[ 2 ].color = sf::Color::Color( 51, 38, 21 ); sf::RenderTexture rtex; rtex.create( house_image.getSize().x, house_image.getSize().y ); rtex.draw( leftTriangle ); rtex.draw( rightTriangle ); rtex.draw( topTriangle ); sf::Image roof_image = rtex.getTexture().copyToImage(); house_image.copy( roof_image, 0, 0, sf::IntRect( 0, 0, 0, 0 ), true ); sf::Texture * tex = new sf::Texture(); tex->loadFromImage( house_image ); sprite = sf::Sprite(); sprite.setTexture( * tex ); sprite.setOrigin( tex->getSize().x / 2, tex->getSize().y ); sprite.setPosition( position ); }
|
|
tBane Temat założony przez niniejszego użytkownika |
» 2024-11-06 21:31:52 Czyli zrobiłeś wyciek pamięci? Nie trzeba było robić wskaźnika tylko zapewnić by tekstura istniała cały czas gdy potrzebujesz ją wyświetlać. Zapisz ją obok sprite, w klasie czy gdzie tam. Ok. Poprawię ten wyciek pamięci. :-) Swoją drogą, jak mógłbym urozmaicić ten dach? |
|
pekfos |
» 2024-11-06 21:34:29 Wpadłem na pomysł by zautomatyzować renderowanie budynków to znaczy generować ich sprajty na podstawie ich rozmiaru. W sumie to po co? Robisz trade-off na wydajność kosztem pamięci, tylko czy wydajność była tu jakimś problemem? Nie ma co tu mówić o automatyzacji bo nie zastępujesz tu żadnych manualnych czynności. W obu przypadkach wywołujesz funkcję która renderuje budynek, nie ma różnicy jak jest ta funkcja zaimplementowana. |
|
« 1 » 2 3 4 |