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

Edytor Mapy - Pędzel

Ostatnio zmodyfikowano 2024-09-14 15:02
Autor Wiadomość
tBane
Temat założony przez niniejszego użytkownika
Edytor Mapy - Pędzel
» 2024-09-12 20:11:53
Witam. A piszę sobie kod odpowiadający za "wygląd pędzla" i zastanawiam się czy da sie to jeszcze bardziej zoptymalizować. Jak myślicie ?

C/C++
// brush sizes : 1, 2, 3
std::vector < std::vector < bool >> brush1( 1, std::vector < bool >( 1 ) );
std::vector < std::vector < bool >> brush2( 3, std::vector < bool >( 3 ) );
std::vector < std::vector < bool >> brush3( 5, std::vector < bool >( 5 ) );

void generateBrushSizes() {
   
   
// BRUSH 1
   
brush1[ 0 ][ 0 ] = true;
   
   
// BRUSH 2
   
brush2[ 0 ][ 0 ] = false; brush2[ 1 ][ 0 ] = true; brush2[ 2 ][ 0 ] = false;
   
brush2[ 0 ][ 1 ] = true; brush2[ 1 ][ 1 ] = true; brush2[ 2 ][ 1 ] = true;
   
brush2[ 0 ][ 2 ] = false; brush2[ 1 ][ 2 ] = true; brush2[ 2 ][ 2 ] = false;
   
   
// BRUSH 3
   
brush2[ 0 ][ 0 ] = false; brush2[ 1 ][ 0 ] = false; brush2[ 2 ][ 0 ] = true; brush2[ 3 ][ 0 ] = false; brush2[ 4 ][ 0 ] = false;
   
brush2[ 0 ][ 1 ] = false; brush2[ 1 ][ 1 ] = true; brush2[ 2 ][ 1 ] = true; brush2[ 3 ][ 1 ] = true; brush2[ 4 ][ 1 ] = false;
   
brush2[ 0 ][ 2 ] = true; brush2[ 1 ][ 2 ] = true; brush2[ 2 ][ 2 ] = true; brush2[ 3 ][ 2 ] = true; brush2[ 4 ][ 2 ] = true;
   
brush2[ 0 ][ 3 ] = false; brush2[ 1 ][ 3 ] = true; brush2[ 2 ][ 3 ] = true; brush2[ 3 ][ 3 ] = true; brush2[ 4 ][ 3 ] = false;
   
brush2[ 0 ][ 4 ] = false; brush2[ 1 ][ 4 ] = false; brush2[ 2 ][ 4 ] = true; brush2[ 3 ][ 4 ] = false; brush2[ 4 ][ 4 ] = false;
   
   
}
P-181582
DejaVu
» 2024-09-12 20:14:11
ChatGPT 4o:
C/C++
std::vector < std::vector < bool >> generateBrush( int size ) {
   
std::vector < std::vector < bool >> brush( size, std::vector < bool >( size, false ) );
   
int center = size / 2;
   
for( int i = 0; i < size; ++i ) {
       
for( int j = 0; j < size; ++j ) {
           
if( std::abs( i - center ) + std::abs( j - center ) <= center ) {
               
brush[ i ][ j ] = true;
           
}
        }
    }
   
return brush;
}
P-181583
tBane
Temat założony przez niniejszego użytkownika
» 2024-09-12 20:22:08
A dałoby radę jakoś przypisać ręcznie te wszystkie wartości w wygodny sposób coś na zasadzie:
Bo chciałbym sam móc zdefiniować kształt pędzla, tylko w taki sposób by to było najbardziej wygodne i przejrzyste :-)


tablica1[][] = {
1
};

tablica2[][] = {
0,1,0,
1,1,1,
0,1,0
};

tablica3[][] = {
0,0,1,0,0,
0,1,1,1,0,
1,1,1,1,1,
0,1,1,1,1,
0,0,1,0,0
};
P-181584
tBane
Temat założony przez niniejszego użytkownika
» 2024-09-12 20:46:31
C/C++
#ifndef BrushSizes_hpp
#define BrushSizes_hpp

std::vector < std::vector < std::vector < bool >> > brushes = {
   
   
// 0 - 1x1
   
{
        {
1 }
    }
,
   
   
// 1 - 3x3
   
{
        {
0, 1, 0 },
       
{ 1, 1, 1 },
       
{ 0, 1, 0 }
    }
,
   
   
// 2 - 5x5
   
{
        {
0, 0, 1, 0, 0 },
       
{ 0, 1, 1, 1, 0 },
       
{ 1, 1, 1, 1, 1 },
       
{ 0, 1, 1, 1, 0 },
       
{ 0, 0, 1, 0, 0 }
    }
,
   
   
// 3 - 7x7
   
{
        {
0, 0, 1, 1, 1, 0, 0 },
       
{ 0, 1, 1, 1, 1, 1, 0 },
       
{ 1, 1, 1, 1, 1, 1, 1 },
       
{ 1, 1, 1, 1, 1, 1, 1 },
       
{ 1, 1, 1, 1, 1, 1, 1 },
       
{ 0, 1, 1, 1, 1, 1, 0 },
       
{ 0, 0, 1, 1, 1, 0, 0 }
    }
,
   
   
// 4 - 9x9
   
{
        {
0, 0, 0, 1, 1, 1, 0, 0, 0 },
       
{ 0, 0, 1, 1, 1, 1, 1, 0, 0 },
       
{ 0, 1, 1, 1, 1, 0, 1, 1, 0 },
       
{ 1, 1, 1, 1, 1, 1, 1, 1, 1 },
       
{ 1, 1, 1, 1, 1, 1, 1, 1, 1 },
       
{ 1, 1, 1, 1, 1, 1, 1, 1, 1 },
       
{ 0, 1, 1, 1, 1, 1, 1, 1, 0 },
       
{ 0, 0, 1, 1, 1, 1, 1, 0, 0 },
       
{ 0, 0, 0, 1, 1, 1, 0, 0, 0 }
    }
,
   
   
// 5 - 11x11
   
{
        {
0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0 },
       
{ 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0 },
       
{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 },
       
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
       
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
       
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
       
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
       
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
       
{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 },
       
{ 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0 },
       
{ 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0 },
       
   
}
}
;

std::vector < std::vector < bool >> brush;

void setBrushSize( int size ) {
   
brush = brushes[ size ]; // Przypisanie odpowiedniego pędzla
   
}

void drawBrush() {
   
for( auto & row: brush ) {
       
for( bool cell: row )
           
 cout << cell << " ";
       
       
cout << "\n";
   
}
   
   
}
#endif
P-181585
tBane
Temat założony przez niniejszego użytkownika
» 2024-09-13 15:10:39
Sytuacja opanowana. Kod na pędzel o różnym rozmiarze :-)

C/C++
int baseX = int( worldMousePosition.x ) / int( tileSide ) * int( tileSide );
int baseY = int( worldMousePosition.y ) / int( tileSide ) * int( tileSide );

int brushHalfWdt = brush.size() / 2;
int brushHalfHgh = brush.size() / 2;

if( prefabToPaint->type == gameObjectType::Terrain || prefabToPaint->type == gameObjectType::Floor ) {
   
   
for( int y = 0; y < brush.size(); y++ ) {
       
for( int x = 0; x < brush[ y ].size(); x++ ) {
           
if( brush[ y ][ x ] == true ) {
               
               
int xx = baseX +( x - brushHalfWdt ) * tileSide;
               
int yy = baseY +( y - brushHalfHgh ) * tileSide;
               
               
if( prefabToPaint->type == gameObjectType::Terrain ) {
                   
TerrainPrefab * ter = new TerrainPrefab( prefabToPaint->name, dynamic_cast < TerrainPrefab * >( prefabToPaint )->ttype );
                   
ter->position = sf::Vector2f( xx, yy );
                   
ter->collider->shape->setFillColor( sf::Color::Transparent );
                   
ter->collider->shape->setPosition( sf::Vector2f( xx, yy ) );
                   
ter->collider->shape->setOutlineThickness( 2.0f );
                   
ter->collider->shape->setOutlineColor( sf::Color::Red );
                   
prefabsToPaint.push_back( ter );
               
}
               
               
if( prefabToPaint->type == gameObjectType::Floor ) {
                   
FloorPrefab * flo = new FloorPrefab( prefabToPaint->name, dynamic_cast < FloorPrefab * >( prefabToPaint )->ftype );
                   
flo->position = sf::Vector2f( xx, yy );
                   
flo->collider->shape->setFillColor( sf::Color::Transparent );
                   
flo->collider->shape->setPosition( sf::Vector2f( xx, yy ) );
                   
flo->collider->shape->setOutlineThickness( 2.0f );
                   
flo->collider->shape->setOutlineColor( sf::Color::Red );
                   
prefabsToPaint.push_back( flo );
               
}
               
               
            }
        }
    }
}
P-181586
pekfos
» 2024-09-13 20:30:16
Rozmiar wektora jest zwracany jako size_t. Arytmetyka na typach wbudowanych będzie konwertować liczby tak by był ten sam typ po obu stronach i w tym wypadku obliczenia robisz na typie bez znaku. Skonwertuj rozmiar wektora na int i będzie działać zgodnie z oczekiwaniami.
C/C++
int xx = baseX +( x -( int ) brush[ y ].size() / 2 ) * tileSide;
P-181587
tBane
Temat założony przez niniejszego użytkownika
» 2024-09-13 20:42:34
Ok, rozumiem. Dzięki :-)
P-181588
« 1 »
  Strona 1 z 1