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

[SFML 2.X] Generowanie Sprajtów Budynków z dachem dwuspadowym

Ostatnio zmodyfikowano 2024-11-09 18:16
Autor Wiadomość
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.

C/C++
void loadTexture() {
   
   
short roof_size = 2;
   
   
// check the size
   
cout << size.x << " " << size.y << "\n";
   
   
// create basic image to render house
   
sf::Image house_image;
   
house_image.create( size.x * 16,( size.y + roof_size ) * 16, sf::Color::Black );
   
   
// load the wall texture
   
sf::Image wall;
   
wall.create( 32, 32, sf::Color::Transparent );
   
wall = getTexture( "walls/wooden_wall" )->texture->copyToImage();
   
   
// drawing the walls
   
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 );
       
}
    }
   
   
// create main tex
   
sf::Texture tex;
   
tex.loadFromImage( house_image );
   
   
// create the sprite
   
sprite = sf::Sprite();
   
sprite.setTexture( tex );
   
sprite.setOrigin( tex.getSize().x / 2, tex.getSize().y );
   
sprite.setPosition( position );
   
}
P-181824
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ę..

C/C++
void loadTexture( std::ifstream & file ) {
   
   
   
   
// check the size
   
cout << size.x << " " << size.y << "\n";
   
   
short walls_height = 4;
   
   
// create basic image to render house
   
sf::Image house_image;
   
house_image.create( size.x * 16,( size.y + walls_height ) * 16, sf::Color::Black );
   
   
// load the wall texture
   
sf::Image wall;
   
wall.create( 32, 32, sf::Color::Transparent );
   
wall = getTexture( "walls/wooden_wall" )->texture->copyToImage();
   
   
// drawing the walls
   
   
   
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 );
       
}
    }
   
   
// create main tex
   
sf::Texture * tex = new sf::Texture();
   
tex->loadFromImage( house_image );
   
   
// create the sprite
   
sprite = sf::Sprite();
   
sprite.setTexture( * tex );
   
sprite.setOrigin( tex->getSize().x / 2, tex->getSize().y );
   
sprite.setPosition( position );
   
}
P-181825
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ś ?


C/C++
// WALLS UNDER THE ROOF

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 );
       
}
    }
}
P-181826
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?


C/C++
void loadTexture( std::ifstream & file ) {
   
   
   
   
// check the size
   
cout << size.x << " " << size.y << "\n";
   
   
short walls_height = 4;
   
   
// create basic image to render house
   
sf::Image house_image;
   
house_image.create( size.x * 16,( size.y + walls_height ) * 16, sf::Color::Black );
   
   
// load the wall texture
   
sf::Image wall;
   
wall.create( 32, 32, sf::Color::Transparent );
   
wall = getTexture( "walls/wooden_wall" )->texture->copyToImage();
   
   
   
// DRAWING A WALLS
   
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";
   
   
// DRAWING A WALLS UNDER THE ROOF
   
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 );
           
}
        }
    }
   
   
// create main tex
   
sf::Texture * tex = new sf::Texture();
   
tex->loadFromImage( house_image );
   
   
// create the sprite
   
sprite = sf::Sprite();
   
sprite.setTexture( * tex );
   
sprite.setOrigin( tex->getSize().x / 2, tex->getSize().y );
   
sprite.setPosition( position );
   
}
P-181827
pekfos
» 2024-11-06 21:29:39
Zmieniłem teksturę na wskaźnik i działa.
C/C++
// create main tex
sf::Texture * tex = new sf::Texture();
tex->loadFromImage( house_image );

// create the sprite
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.
P-181828
tBane
Temat założony przez niniejszego użytkownika
» 2024-11-06 21:29:40
Pozostało tylko wyciąć drzwi.


C/C++
void loadTexture( std::ifstream & file ) {
   
   
   
   
// check the size
   
cout << size.x << " " << size.y << "\n";
   
   
short walls_height = 4;
   
   
// create basic image to render house
   
sf::Image house_image;
   
house_image.create( size.x * 16,( size.y + walls_height * 2 ) * 16, sf::Color::Transparent );
   
   
// load the wall texture
   
sf::Image wall;
   
wall.create( 32, 32, sf::Color::Transparent );
   
wall = getTexture( "walls/wooden_wall" )->texture->copyToImage();
   
   
   
// DRAWING A WALLS
   
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";
   
   
// DRAWING A WALLS UNDER THE ROOF
   
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 );
           
}
        }
    }
   
   
// DRAWING A ROOF
   
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 );
   
   
// TO-DO - to make a top triangle
   
   
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 );
   
   
// create main tex
   
sf::Texture * tex = new sf::Texture();
   
tex->loadFromImage( house_image );
   
   
// create the sprite
   
sprite = sf::Sprite();
   
sprite.setTexture( * tex );
   
sprite.setOrigin( tex->getSize().x / 2, tex->getSize().y );
   
sprite.setPosition( position );
   
}
P-181829
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?
P-181830
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.
P-181831
« 1 » 2 3 4
  Strona 1 z 4 Następna strona