Witam.
Napisałem sobie edytor map korzystając z mapy kafelkowej z easykodera i pojawił mi się problem z rozmieszczeniem kafelków.
Wszystko jest dobrze gdy okno programu jest równe buforowi. Moje okno ma rozmiar 800x600 a bufor na razie 1200x600. Podczas przesunięcia mojej mapy kafelkowej i kliknięciu na niego wpisuje chyba inna wartość do tablicy i dlatego kafel pojawia się nie w tym miejscu co trzeba. I stąd moje pytanie czy bufor może być większy od okna aplikacji?
#include <allegro.h>
int mapa[ 10 ][ 30 ] =
{
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
};
BITMAP * bufor = NULL;
BITMAP * teren = NULL;
int mapa_x = 0, mapa_y = 0;
void rysuj_mape()
{
int licznik_x, licznik_y;
for( licznik_x = 0; licznik_x < 30; licznik_x++ )
{
for( licznik_y = 0; licznik_y < 10; licznik_y++ )
{
masked_blit( teren, bufor,( mapa[ licznik_y + mapa_y ][ licznik_x + mapa_x ] % 4 ) * 40,( mapa[ licznik_y + mapa_y ][ licznik_x + mapa_x ] / 4 ) * 40, licznik_x * 40, licznik_y * 40, 40, 40 );
}
}
};
int mx = 10, my = 0, mb = 0;
void myszka()
{
if( mx != mouse_x || my != mouse_y || mb != mouse_b )
{
mx = mouse_x / 40;
my = mouse_y / 40;
mb = mouse_b;
}
};
int main()
{
allegro_init();
install_keyboard();
install_mouse();
set_color_depth( 16 );
set_gfx_mode( GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0 );
show_mouse( screen );
bufor = create_bitmap( 1200, 600 );
if( !bufor )
{
set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
allegro_message( "Nie można utworzyc bufora!" );
allegro_exit();
return 0;
}
teren = load_bmp( "teren.bmp", default_palette );
if( !teren )
{
set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 );
allegro_message( "Nie można zaladowac obrazka mapy!" );
allegro_exit();
return 0;
}
while( !key[ KEY_ESC ] )
{
myszka();
clear_to_color( bufor, makecol( 150, 150, 150 ) );
rysuj_mape();
if( mb == 1 && mx < 30 && my < 10 )
{
mapa[ my ][ mx ] = 1;
}
if(( key[ KEY_RIGHT ] ) &&( mapa_x < 10 ) ) { mapa_x = mapa_x + 1; } else
if(( key[ KEY_LEFT ] ) &&( mapa_x > 0 ) ) { mapa_x = mapa_x - 1; } else
if(( key[ KEY_UP ] ) &&( mapa_y > 0 ) ) { mapa_y = mapa_y - 1; }
textprintf_ex( bufor, font, 10, 440, makecol( 255, 255, 128 ), - 1, "Pozycja X: %d (%d)", mx + 1, mx * 40 );
textprintf_ex( bufor, font, 10, 460, makecol( 255, 255, 128 ), - 1, "Pozycja Y: %d (%d)", my + 1, my * 40 );
blit( bufor, screen, 0, 0, 0, 0, 1200, 600 );
}
return 0;
destroy_bitmap( bufor );
destroy_bitmap( teren );
}
END_OF_MAIN();
Przeanalizowałem to chyba za sto razy i niedociągnięcia w kodzie nie znalazłem. Dlatego proszę o jakąkolwiek pomoc bo mógłbym ustawić rozmiar okna taki sam jak bufor ale moja tablica będzie znacznie większa niż jest dotychczas.
Znalazłem już problem. Kursor przy przesunięciu mapy ustawia nowe współrzędne rogu ekranu. Nie wiem jak zrobić aby liczył od początku bitmapy.