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

[Allegro, C++] Dopasowanie wielkości bitmap do wielkośći okna

Ostatnio zmodyfikowano 2011-08-29 19:48
Autor Wiadomość
tomass
Temat założony przez niniejszego użytkownika
» 2011-08-28 23:56:40
Dobra już jest lepiej, ale jeszcze nie idealnie.

Legenda obrazków:
Zielony Kwadracik: lewy górny róg bitmapy
Żółty Kwadracik: kursor

Obrazek 400x300:

Obrazek 800x600:

Obrazek 1600x900:
http://img62.imageshack.us/img62/7325/68207132.png

Tlo.bmp 2000x2000:
http://www.tomass.net/nowe/tlo3.bmp

Już po zmianie rozdzielczości obrazki są dobrze rozłożone ;]
Ale jak widać w "Obrazek 1600x900" jest jeszcze problem, jak zmniejszać bądź zwiększać obrazek pod rozmiar okna allegro?

Rozmiar okna sprawdzam tak:
C/C++
float wys = SCREEN_W;
float szer = SCREEN_H;
textprintf_ex( bufor, font,( wys / 40 ),( szer / 1.07142 ), makecol( 200, 200, 200 ), - 1, "Wysokosc = %f", wys );
textprintf_ex( bufor, font,( wys / 40 ),( szer / 1.03448 ), makecol( 200, 200, 200 ), - 1, "Szerokosc = %f", szer );
P-40142
akwes
» 2011-08-29 00:01:59
Zapoznaj się z » Allegro 4.4stretch_sprite
P-40143
tomass
Temat założony przez niniejszego użytkownika
» 2011-08-29 10:49:48
Dobra działa ale mam nastepny problem

C/C++
masked_blit( ludek, bufor, 0, 0, ludek_x, ludek_y, ludek->w, ludek->h ); // - to nie zmienia wielkosci ludka ale mozna nim poruszać.
stretch_sprite( bufor, ludek,( wys / 3.94089 ),( szer / 5.88235 ),( wys / 16 ),( szer / 6.74157 ) ); // - to ładnie zmienia, dostosowując do okna allegro, ale nie mogę ruszać ludkiem.

Co zrobić by można było można mieć dostosowany obrazek oraz można było nim sterować?

Sterowanie:
C/C++
if( key[ KEY_LEFT ] ) ludek_x--;

if( key[ KEY_RIGHT ] ) ludek_x++;

if( key[ KEY_UP ] ) ludek_y--;

if( key[ KEY_DOWN ] ) ludek_y++;
P-40157
SeaMonster131
» 2011-08-29 11:02:14
W funkcji
stretch_sprite
 ustawiasz sobie gdzie ma się pojawić dana bitmapa prawda? To pomyśl :)
U Ciebie X to jest
( wys / 3.94089 )
 tak? No to możesz spróbować dodać do tego wartość ludek_x. To samo dla osi Y. Aczkolwiek nie wiem czy będzie działać poprawnie :)
P-40158
tomass
Temat założony przez niniejszego użytkownika
» 2011-08-29 11:22:07
EDIT:
Mam teraz:
C/C++
float wys = SCREEN_W;
float szer = SCREEN_H;
float ludek_x =( wys / 3.94089 ), ludek_y =( szer / 5.88235 );
stretch_sprite( bufor, ludek, ludek_x, ludek_y,( wys / 16 ),( szer / 6.74157 ) );

Obrazek 400x300:
http://img577.imageshack.us/img577/5987/53533625.png

Obrazek 800x600:
http://img94.imageshack.us/img94/1152/39400087.png

Obrazek 1600x900:
http://img839.imageshack.us/img839/6661/58343834.png

Ludek to ten z pomarańczową głową.

Wiecie co jest jeszcze źle?
P-40160
Gabes
» 2011-08-29 17:43:35
Prosty sposób umieszczamy wszystko na bitmape tymczasową następnie bitmape do bufora za pomocą
stretch_sprite

C/C++
#include <allegro.h>
int szer = 800;
int wys = 600;
void rozmiar()
{
    set_gfx_mode( GFX_AUTODETECT_WINDOWED, szer, wys, 0, 0 );
}
int main()
{
    allegro_init();
    install_keyboard();
    set_color_depth( 32 );
    set_gfx_mode( GFX_AUTODETECT_WINDOWED, szer, wys, 0, 0 );
    BITMAP * bufor = create_bitmap( szer, wys );
    BITMAP * bmp_tymczasowa = create_bitmap( 800, 600 );
    BITMAP * ludek = load_bmp( "ludek.bmp", default_palette );
    while( !key[ KEY_ESC ] )
    {
        clear_to_color( bmp_tymczasowa, makecol( 0, 128, 0 ) );
        draw_sprite( bmp_tymczasowa, ludek, 100, 100 );
        stretch_sprite( bufor, bmp_tymczasowa, 0, 0, szer, wys );
        textprintf_ex( bufor, font, 0, 0, makecol( 22, 22, 22 ), - 1, "szer=%d wys=%d", szer, wys );
        if( key[ KEY_Q ] ) szer = 320, wys = 240, rozmiar();
       
        if( key[ KEY_W ] ) szer = 640, wys = 480, rozmiar();
       
        if( key[ KEY_E ] ) szer = 800, wys = 600, rozmiar();
       
        blit( bufor, screen, 0, 0, 0, 0, szer, wys );
    }
    destroy_bitmap( ludek );
    destroy_bitmap( bufor );
    allegro_exit();
    return 0;
}
END_OF_MAIN();

P-40187
tomass
Temat założony przez niniejszego użytkownika
» 2011-08-29 19:48:07
Dzięki teraz działa, a ostanie pytanie.

Bo jak mam monitor 1600x900 a ustawie tak:
C/C++
set_gfx_mode( GFX_AUTODETECT_FULLSCREEN, 1280, 720, 0, 0 );
to tak dziwnie wygląda ;/

A jak ustawie tak:
C/C++
set_gfx_mode( GFX_AUTODETECT_FULLSCREEN, 1600, 900, 0, 0 );
to wygląda dobrze ;]

Więc jak mogę sprawdzić rozdzielczość komputera za pomocą allegro 4.2.2 ?

EDIT:
Zrobiłem tak jak tutaj piszę - http://cppkid.wordpress.com/2009/01/07/how-to-get-the-screen-resolution-in-pixels/ i działa ;]

EDIT:
Dziękuje za pomoc, teraz wszystko działa bez zarzutów ;)
Temat można zamknąć.
P-40192
1 « 2 »
Poprzednia strona Strona 2 z 2