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
[Allegro, C++] Dopasowanie wielkości bitmap do wielkośći okna
» 2011-08-28 18:56:41
Witam,
Mam testową grę napisaną w C++ (allegro 4.2.2).
Normalnie gra wygląda tak:

Po zmienieniu rozmiaru okna wygląda tak:

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++;

if( key[ KEY_Q ] ) set_gfx_mode( GFX_AUTODETECT_WINDOWED, 320, 240, 0, 0 );

if( key[ KEY_E ] ) set_gfx_mode( GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0 );

I mam takie pytanie, jak zrobić żeby po zmienieniu rozmiaru okna lub przejściu na fullscreen obrazki się automatycznie dopasowały do rozmiaru okna?
tzn. że jak zmienię np. z 800x600 na 1600x1200 to nie będzie pustki tylko obrazki się rozciągną, a jeśli z 1600x1200 na 800x600 to się skurczą.
Czy może ktoś napisać co zrobić by uzyskać taki efekt ?
A na pewno da się stworzyć taki efekt ponieważ jest on w grze Icy Tower 1.3, a ta gra była pisana przy użyciu biblioteki allegro.
Jeśli potrzebujecie mojego kodu źródłowego (.cpp) to napiszcie.
P-40126
akwes
» 2011-08-28 18:58:07
Wydaje mi się że skalowanie następuje jedynie przy fullscreenie, ale może źle rozumiałem Twój problem?
P-40127
tomass
Temat założony przez niniejszego użytkownika
» 2011-08-28 19:08:12
@akwes "Wydaje mi się że skalowanie następuje jedynie przy fullscreenie, ale może źle rozumiałem Twój problem?"

Nie rozumiem.
P-40128
akwes
» 2011-08-28 19:45:31
Dobra, teraz po obrazkach widzę o co Ci chodziło.

Jeżeli dasz żeby ludzik się rysował w punkcie 300,400 to zawsze będzie się rysował w tym punkcie i zmiana rozmiaru okna tego nie zmieni.

Jeżeli jednak uzależnisz rysowanie od wielkości okna, to wtedy będzie się przemieszczał.

Np porównaj sobie rysowanie w punkcie (rozdzielczoscX / 2, rozdzielczoscY /2), a czymś wpisanym na stało czyli np. zakładając że na początku ma okno 800x6000 to w punkcie 400,300. W pierwszym przypadku będzie się zmieniać położeine ludzika w drugim nie.
P-40129
tomass
Temat założony przez niniejszego użytkownika
» 2011-08-28 20:01:56
Dobry pomysł z rysowaniem "(rozdzielczoscX / 2, rozdzielczoscY / 2)", ale jest jakiś sposób do sprawdzania co wpisać zamiast "2"?

Aktualnie mam:
C/C++
Myszka x = % d
Myszka y = % d

Ale jakby zmienić na:
C/C++
Myszka( rozdzielczoscX / x ) = X to % d
Myszka( rozdzielczoscY / y ) = Y to % d

Tylko problem jak to zrobić ;/
P-40130
mati1qazxsw2
» 2011-08-28 20:03:29
A nie lepiej zrobić by kontrolki,sprity były rozmieszczanie % na oknie?Przy rozszerzaniu tylko od nowa obliczasz ich polozenie i tyle.
P-40131
tomass
Temat założony przez niniejszego użytkownika
» 2011-08-28 21:01:21
@mati1qazxsw2 "A nie lepiej zrobić by kontrolki,sprity były rozmieszczanie % na oknie?Przy rozszerzaniu tylko od nowa obliczasz ich polozenie i tyle."
Wole sposobem akwes'a.
I obliczyłem już to i wyszło że żeby uzyskać X lub Y to muszę, wielkość okna podzielić przez lokalizacje myszki.

Zrobiłem tak:
C/C++
float str_skalowanie_X = SCREEN_W / mx;
float str_skalowanie_Y = SCREEN_H / my;
textprintf_ex( bufor, font, 20, 560, makecol( 200, 200, 200 ), - 1, "Myszka pixel/x = %f", str_skalowanie_X );
textprintf_ex( bufor, font, 20, 580, makecol( 200, 200, 200 ), - 1, "Myszka pixel/y = %f", str_skalowanie_Y );

Ale niestety zamiast wyświetlać np. X=3,42453215 Y=1,63423423 to pokazuje X=3,00000000 Y=1,000000000.
Co jest źle ?
P-40139
akwes
» 2011-08-28 21:17:22

wielkość okna podzielić przez lokalizacje myszki.

Skąd ta myśl? To położenie obiektu się będzie zmieniać zależnie od ruchów myszką :P? Chyba nie :P

Tak naprawdę mój sposób a sposób który podał kolega wyżej to to samo rozwiązanie tylko dużo lepsze jest kolegi, bo robi wszystko za nas a nie prawie że na siłę, ja podałem tylko sztywny przykład.

Podstawową sprawą jest to że miejsce rysowania musi się dynamicznie zmieniać, ale można policzyć stosunek tego, trzeba go liczyć za każdą zmianą czyli metoda jest bardzo na około i wymaga punktu odniesienia.

Czyli:
Jeżeli mamy okno 800x600 i chcemy żeby obrazek był na współrzędnych 100,100. <- punkt odniesienia
A przy 1600x1200 był na 200,200 to musimy policzyć proporcję.

x - pozycja X,
ResX - nowa rozdzielczość okna

800 - 100
ResX - x

800x = 100 * ResX
x = (100 * ResX)/800

Sprawdźmy czy działa

x ma być 200 gdy ResX = 1600.
x = (100 * 1600)/800
x = 200

To samo robimy dla Y tylko że z warotściami ResY oraz 600 a nie 800.

Ale nie polecam tego.

 
P-40140
« 1 » 2
  Strona 1 z 2 Następna strona