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

Funkcja wyświetlająca mapę z pliku png

Ostatnio zmodyfikowano 2022-09-27 21:34
Autor Wiadomość
AP1994
Temat założony przez niniejszego użytkownika
Funkcja wyświetlająca mapę z pliku png
» 2022-09-25 01:35:22
Napisałem kiedyś kawałek kodu:
C/C++
void draw_map( vector < vector < int > > mapy, ALLEGRO_BITMAP * plik )
{
   
   
const int szr = 32, wys = 32;
   
if( plik != NULL )
   
{
       
if( !mapy.empty() )
       
{
           
int s = al_get_bitmap_width( plik ) / szr;
           
for( int i = 0; i <( int ) mapy.size(); i++ )
           
{
               
for( int j = 0; j <( int ) mapy[ i ].size(); j++ )
               
{
                   
if( mapy[ i ][ j ] <=( 0 * s ) + s - 1 )
                       
 al_draw_bitmap_region( plik,( mapy[ i ][ j ] -( s * 0 ) ) * szr, wys * 0, szr, wys, i * szr, j * wys, 0 );
                   
else if( mapy[ i ][ j ] <=( 1 * s ) + s - 1 )
                       
 al_draw_bitmap_region( plik,( mapy[ i ][ j ] -( s * 1 ) ) * szr, wys * 1, szr, wys, i * szr, j * wys, 0 );
                   
else if( mapy[ i ][ j ] <=( 2 * s ) + s - 1 )
                       
 al_draw_bitmap_region( plik,( mapy[ i ][ j ] -( s * 2 ) ) * szr, wys * 2, szr, wys, i * szr, j * wys, 0 );
                   
else if( mapy[ i ][ j ] <=( 3 * s ) + s - 1 )
                       
 al_draw_bitmap_region( plik,( mapy[ i ][ j ] -( s * 3 ) ) * szr, wys * 3, szr, wys, i * szr, j * wys, 0 );
                   
else if( mapy[ i ][ j ] <=( 4 * s ) + s - 1 )
                       
 al_draw_bitmap_region( plik,( mapy[ i ][ j ] -( s * 4 ) ) * szr, wys * 4, szr, wys, i * szr, j * wys, 0 );
                   
else if( mapy[ i ][ j ] <=( 5 * s ) + s - 1 )
                       
 al_draw_bitmap_region( plik,( mapy[ i ][ j ] -( s * 5 ) ) * szr, wys * 5, szr, wys, i * szr, j * wys, 0 );
                   
else if( mapy[ i ][ j ] <=( 6 * s ) + s - 1 )
                       
 al_draw_bitmap_region( plik,( mapy[ i ][ j ] -( s * 6 ) ) * szr, wys * 6, szr, wys, i * szr, j * wys, 0 );
                   
else if( mapy[ i ][ j ] <=( 7 * s ) + s - 1 )
                       
 al_draw_bitmap_region( plik,( mapy[ i ][ j ] -( s * 7 ) ) * szr, wys * 7, szr, wys, i * szr, j * wys, 0 );
                   
else if( mapy[ i ][ j ] <=( 8 * s ) + s - 1 )
                       
 al_draw_bitmap_region( plik,( mapy[ i ][ j ] -( s * 8 ) ) * szr, wys * 8, szr, wys, i * szr, j * wys, 0 );
                   
else if( mapy[ i ][ j ] <=( 9 * s ) + s - 1 )
                       
 al_draw_bitmap_region( plik,( mapy[ i ][ j ] -( s * 9 ) ) * szr, wys * 9, szr, wys, i * szr, j * wys, 0 );
                   
else if( mapy[ i ][ j ] <=( 10 * s ) + s - 1 )
                       
 al_draw_bitmap_region( plik,( mapy[ i ][ j ] -( s * 10 ) ) * szr, wys * 10, szr, wys, i * szr, j * wys, 0 );
                   
else if( mapy[ i ][ j ] <=( 11 * s ) + s - 1 )
                       
 al_draw_bitmap_region( plik,( mapy[ i ][ j ] -( s * 11 ) ) * szr, wys * 11, szr, wys, i * szr, j * wys, 0 );
                   
else if( mapy[ i ][ j ] <=( 12 * s ) + s - 1 )
                       
 al_draw_bitmap_region( plik,( mapy[ i ][ j ] -( s * 12 ) ) * szr, wys * 12, szr, wys, i * szr, j * wys, 0 );
                   
else if( mapy[ i ][ j ] <=( 13 * s ) + s - 1 )
                       
 al_draw_bitmap_region( plik,( mapy[ i ][ j ] -( s * 13 ) ) * szr, wys * 13, szr, wys, i * szr, j * wys, 0 );
                   
else if( mapy[ i ][ j ] <=( 14 * s ) + s - 1 )
                       
 al_draw_bitmap_region( plik,( mapy[ i ][ j ] -( s * 14 ) ) * szr, wys * 14, szr, wys, i * szr, j * wys, 0 );
                   
else if( mapy[ i ][ j ] <=( 15 * s ) + s - 1 )
                       
 al_draw_bitmap_region( plik,( mapy[ i ][ j ] -( s * 15 ) ) * szr, wys * 15, szr, wys, i * szr, j * wys, 0 );
                   
else if( mapy[ i ][ j ] <=( 16 * s ) + s - 1 )
                       
 al_draw_bitmap_region( plik,( mapy[ i ][ j ] -( s * 16 ) ) * szr, wys * 16, szr, wys, i * szr, j * wys, 0 );
                   
else if( mapy[ i ][ j ] <=( 17 * s ) + s - 1 ) ///233
                       
 al_draw_bitmap_region( plik,( mapy[ i ][ j ] -( s * 17 ) ) * szr, wys * 17, szr, wys, i * szr, j * wys, 0 );
                   
               
}
            }
        }
    }
   
else
   
{
       
al_show_native_message_box( 0, "Błąd wywołania", "Błąd grafiki", "Brak pliku textury", 0, ALLEGRO_MESSAGEBOX_ERROR );
       
exit( EXIT_FAILURE );
   
}
}
Problem polega na tym, że nie umiem go usprawnić na tyle, żeby nie trzeba było dodawać nowych linii kodu za każdym razem, kiedy tylko wezmę większy plik png.
P-179655
DejaVu
» 2022-09-25 17:55:27
Dorzuć jeszcze jedną pętlę i umieść jednego if-a zamiast n-dziesiąt ifów.
C/C++
for( int k = 0; k < 18; ++k )
{
   
if( mapy[ i ][ j ] <=( k * s ) + s - 1 )
       
 al_draw_bitmap_region( plik,( mapy[ i ][ j ] -( s * k ) ) * szr, wys * k, szr, wys, i * szr, j * wys, 0 );
   
}
P-179660
AP1994
Temat założony przez niniejszego użytkownika
» 2022-09-27 01:24:00
Już próbowałem podobnych konstrukcji przed tą odpowiedzią, ale wyświetlanie obrazu mam na końcu wiecznej pętli, w której wykonuje się program i kiedy pisałem trzecią pętlę to tak samo, jak w przypadku kodu:

for( int k = 0; k < 18; ++k )
{
    if( mapy[ i ][ j ] <=( k * s ) + s - 1 )
         al_draw_bitmap_region( plik,( mapy[ i ][ j ] -( s * k ) ) * szr, wys * k, szr, wys, i * szr, j * wys, 0 );
   
}
Nie dosyć, że źle się wyświetla to, jeszcze okno się zawiesza.
P-179661
DejaVu
» 2022-09-27 13:09:48
Wszystko zależy od tego co ten kod ma robić. Pętle się używa do tego, aby nie powielać tego samego kawałka kodu wiele razy oraz aby dało się łatwo zmieniać ilość 'powtórzeń' danego fragmentu kodu.

Jeżeli coś logicznie działa Ci źle, to zapewne w którymś miejscu poczyniłeś złe założenia/złą koncepcję obrałeś.

Przykładowo:
C/C++
for( int k = 0; k < 18; ++k )
{
   
if( mapy[ i ][ j ] <=( k * s ) + s - 1 )
   
{
       
al_draw_bitmap_region( plik,( mapy[ i ][ j ] -( s * k ) ) * szr, wys * k, szr, wys, i * szr, j * wys, 0 );
       
break; //Ta linijka jest potrzebna, aby odzwierciedlić Twoją koncepcję if...else
   
}
}
P-179662
AP1994
Temat założony przez niniejszego użytkownika
» 2022-09-27 21:34:30
napisałem tak:
C/C++
void draw_map( vector < vector < int > > mapy, ALLEGRO_BITMAP * plik )
{
   
   
const int szr = 32, wys = 32;
   
if( plik != NULL )
   
{
       
if( !mapy.empty() )
       
{
           
int s = al_get_bitmap_width( plik ) / szr;
           
int w = al_get_bitmap_height( plik ) / wys;
           
for( int i = 0; i <( int ) mapy.size(); i++ )
           
{
               
for( int j = 0; j <( int ) mapy[ i ].size(); j++ ) ///do modyfikacji
               
{
                   
for( int k = 0; k < w; ++k )
                   
{
                       
if( mapy[ i ][ j ] <=( k * s ) + s - 1 )
                       
{
                           
al_draw_bitmap_region( plik,( mapy[ i ][ j ] -( s * k ) ) * szr, wys * k, szr, wys, i * szr, j * wys, 0 );
                           
break;
                       
}
                    }
                }
            }
        }
    }
   
else
   
{
       
al_show_native_message_box( 0, "B³¹d wywo³ania", "B³¹d grafiki", "Brak pliku textury", 0, ALLEGRO_MESSAGEBOX_ERROR );
       
exit( EXIT_FAILURE );
   
}
}
i działa, dziękuję.
P-179663
« 1 »
  Strona 1 z 1