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

[C++ Allegro] Wyświetlanie losowych obrazków

Ostatnio zmodyfikowano 2012-12-09 17:59
Autor Wiadomość
gilgamesh
Temat założony przez niniejszego użytkownika
[C++ Allegro] Wyświetlanie losowych obrazków
» 2012-11-27 21:46:50
To znowu ja, wybaczcie. Mam problem, napisałem funkcję do wyświetlania losowych obrazków - to działa.
Chciałem jednak dodać aby po osiągnięciu współrzędnych przykładowo x=300, y=300, obrazek się losował i wyświetlał nowy.

C/C++
void LosujImage()
{
    image.live = true;
   
    int pom =( rand() % 4 ) + 1;
    image.nazwa << "znak/" << pom << ".png";
    imageImage = al_load_bitmap( image.nazwa.str().c_str() );
    printf( "%d", pom ); //dobrze losuje wyświetla jaki numer został wylosowany
   
}




void DrawZnak()
{
   
    image.zycie = true;
    al_draw_scaled_rotated_bitmap( image.image, image.Width / 2, image.Height / 2, image.x, image.y, 1, 1, 0, 0 );
}






void pozycja()
if( ludzik.x == 300 ) &&( ludzik.y == 300 ) )
{
    image.zycie = false;
   
    if( !ludzik.live )
         LosujImage( image );
   
}



moim zdaniem muszę jakoś wyczyścić funkcją ale gdy próbuję to się program wiesza. Proszę bardzo o pomoc.



//edit

Pierwsze losowanie jest udane i się wyświetla
P-70022
SeaMonster131
» 2012-11-27 22:08:00
Albo to błąd, albo dajesz nam nie te funkcje co trzeba :p
C/C++
void LosujImage()
{
    image.live = true;
   
    int pom =( rand() % 4 ) + 1;
    image.nazwa << "znak/" << pom << ".png";
    imageImage = al_load_bitmap( image.nazwa.str().c_str() );
    printf( "%d", pom ); //dobrze losuje wyświetla jaki numer został wylosowany
   
}

...

if( !ludzik.live )
     LosujImage( image );


Ale jeżeli jest tylko jedna taka funkcja, to powinno być okej. Wczytujesz bitmapę (co nie jest zbyt wydajne, aby wczytywać bitmapę za każdym razem), wyświetlasz, jeżeli warunek if będzie prawdziwy, to znowu wczytujesz bitmapę, wyświetlasz...
P-70024
gilgamesh
Temat założony przez niniejszego użytkownika
» 2012-11-27 22:29:14
tak też próbowałem i gdy sprawdzam gdy warunek jest prawdziwy lub nie to wyświetla mi tylko pierwszy wylosowany obrazek.

nie to nie jest jedna funkcja, uznałem aby nie wrzucać wszystkiego czyli deklaracji tego typu, bo wyświetla pierwszą wylosowaną bitmapę, jednak jak mówię gdy ludzikiem będę na polu x=300, y=300, faktycznie obrazek mi losuje, jednak wyświetla cały czas ten sam.

//edit

to są trzy różne funkcje, nie jest wszystko robione w jednej.


mam pytanie w jaki sposób można było robić aby było wydajniej, inaczej niż wczytywanie bitmapy?
P-70027
gilgamesh
Temat założony przez niniejszego użytkownika
» 2012-11-27 23:23:11
dokładnie mam tak w programie

deklaracja (globalnie)

ALLEGRO_BITMAP *fotoImage;
ALLEGRO_BITMAP *ludzikImage;


deklaracja(main)
InitLudzik(ludzik, ludzikImage);
InitFoto(foto, fotoImage);


C/C++
void InitFoto( Foto & foto, ALLEGRO_BITMAP * image = NULL )
{
    foto.live = true;
   
    foto.x = 100;
    foto.y = 100;
   
   
    if( image != NULL )
    {
        foto.image = image;
       
    }
}



funkcja sprawdzająca pozycji ludzika
C/C++
void LudzikPos( ludzikImage & ludzik )
{
    if( ludzik.x = 300 && ludzik.y = 300 )
         foto.live = false;
   
    LosujFoto( Foto & foto );
}

funkcja losująca
C/C++
void LosujFoto( FotoImage & foto )
{
    int losuj =( rand() % 4 ) + 1;
   
    foto.live = true;
   
    foto.nazwa << "znaki/" << losuj << ".png";
    fotoImage = al_load_bitmap( foto.nazwa.str().c_str() );
    printf( "%d", losuj );
}



funkcja wyświetlająca
C/C++
void DrawFoto( FotoImage & foto )
{
    al_draw_scaled_rotated_bitmap( foto.image,
    foto.imageWidth / 2, foto.imageHeight / 2, //cx.cy
    foto.x, foto.y, //dx,dy
    0.5, 0.5, //scale x,y
    0, 0 ); //angle,flags
}

obrazek mi się nie wyświetla gdy foto.live=false, losuje się ponownie i wyświetla zawsze pierwszy obrazek który wylosowało.

Pozmieniałem nazwę zmiennych aby było czytelniejsze. Proszę o pomoc/
P-70029
gilgamesh
Temat założony przez niniejszego użytkownika
» 2012-11-28 16:04:43
męczę się nadal z tym :/

jak sprawdzam pozycję ludzika dodałem wywołanie funkcji InitFoto(), wyświetla tylko pierwszy wylosowany obrazek, pomyślałem aby zwolnić al_destroy_bitmap(foto.image); po prostu kończy mi działanie programu. Nadal nie wiem czemu tak się dzieje.
P-70062
SeaMonster131
» 2012-11-28 16:43:58
C/C++
if( ludzik.x = 300 && ludzik.y = 300 )
== operator porównania
= operator przypisania


C/C++
// w funkcji LudzikPos(..):

LosujFoto( Foto & foto );
Tak nie wywołuje się funkcji.
P-70065
gilgamesh
Temat założony przez niniejszego użytkownika
» 2012-11-28 16:56:04
tak to już poprawiłem, mój błąd przy wklejaniu na forum, albowiem chciałem uprościć moje funkcje aby były czytelniejsze, lecz nadal nie działa po poprawianiu, kompilacja wykonuje się pozytywnie (bez żadnego błędu czy ostrzeżenia) jednak gdy odpalę program to nie działa.


C/C++
if(( ludzik.x == 300 ) &&( ludzik.y == 0 ) )
{
    ludzik.x = 420; //pozycja poczatkowa ludzika
    ludzik.y = 500; //pozycja poczatkowa ludzika
    losuj = 0;
   
    foto.live = false;
    if( !foto.live )
         LosujFoto( foto, losuj );
   
    InitFoto( foto, fotoImage );
   
}


teraz mam tak i nadal nic to nie daje.
P-70066
gilgamesh
Temat założony przez niniejszego użytkownika
» 2012-11-28 18:30:20
bawię się z tym i niby mi zadziałało, prosiłbym tylko o wyjaśnienie czemu tak działa a wcześniej nie działało:

stara funkcja która nie działała:
C/C++
void LosujFoto( Foto foto[], int pomoc, int losuj )
{
    foto[ pomoc ].live = true;
    srand( time( 0 ) );
    losuj =( rand() % 4 ) + 1;
    printf( "%d", losuj );
    foto[ pomoc ].nazwa << "znaki/" << losuj << ".png";
    fotoImage[ pomoc ] = al_load_bitmap( foto[ pomoc ].nazwa.str().c_str() );
}


//wywołanie LosujFoto(foto,pomoc,losuj)

funkcja która działa
C/C++
void LosujFoto()

{
    std::ostringstream nazwa;
    losuj =( rand() % 4 ) + 1;
    printf( "%d", losuj );
    nazwa << "znaki/" << losuj << ".png";
    fotoImage[ losuj ] = al_load_bitmap( nazwa.str().c_str() );
}



//wywołanie LosujFoto();


Dodam, iż obie losowały, lecz ta druga działa poprawie, nie wiem czemu.
P-70075
« 1 » 2
  Strona 1 z 2 Następna strona