Giedzu Temat założony przez niniejszego użytkownika |
[Allegro] Map edytor » 2012-04-16 15:47:27 Witam. Piszę właśnie taki map edytor (próbuję) i natknąłem się na taki problem. Mam mapę, kwadraciki, gdy kursorem najadę i wcisnę np lmp na jakiś kwadrat(część mapy) powinien się on zmienić na jakiś kolor albo jakąś bitmapę. Problem polega na tym że zmienia się tylko gdy trzymam przycisk, zapewne to jakiś głupi błąd, albo brak jakiegoś ifa, próbowałem z boolem też, ale jakoś mi nie idzie, proszę o pomoc. Oto kod. Kod z funkcji która wypełnia kawałek mapy czymś. void on_map( BITMAP * bufor ) { for( int i = 0; i < SzerokoscMapy; i++ ) { for( int j = 0; j < WysokoscMapy; j++ ) { if( mx > i * KlocekSzerokosc && mx < i * KlocekSzerokosc + KlocekSzerokosc && my > j * KlocekWysokosc && my < j * KlocekSzerokosc + KlocekWysokosc ) { rectfill( bufor, i * KlocekSzerokosc, j * KlocekWysokosc, i * KlocekSzerokosc + KlocekSzerokosc, j * KlocekWysokosc + KlocekWysokosc, makecol( 255, 255, 255 ) ); } if( mx > i * KlocekSzerokosc && mx < i * KlocekSzerokosc + KlocekSzerokosc && my > j * KlocekWysokosc && my < j * KlocekSzerokosc + KlocekWysokosc && mb == 1 ) { rectfill( bufor, i * KlocekSzerokosc, j * KlocekWysokosc, i * KlocekSzerokosc + KlocekSzerokosc, j * KlocekWysokosc + KlocekWysokosc, makecol( 255, 0, 0 ) ); } } } }
A oto cały kod: #include <allegro.h>
#define KlocekSzerokosc 40 #define KlocekWysokosc 40 #define SzerokoscMapy 20 #define WysokoscMapy 15 #define EkranSzerokosc 800 #define EkranWysokosc 600
int mx = 0; int my = 0; int mb = 0;
void show_map( BITMAP * bufor ) { for( int i = 0; i < SzerokoscMapy; i++ ) { for( int j = 0; j < WysokoscMapy; j++ ) { rect( bufor, i * KlocekSzerokosc, j * KlocekWysokosc, i * KlocekSzerokosc + KlocekSzerokosc, j * KlocekWysokosc + KlocekWysokosc, makecol( 255, 255, 255 ) ); } } }
void on_map( BITMAP * bufor ) { for( int i = 0; i < SzerokoscMapy; i++ ) { for( int j = 0; j < WysokoscMapy; j++ ) { if( mx > i * KlocekSzerokosc && mx < i * KlocekSzerokosc + KlocekSzerokosc && my > j * KlocekWysokosc && my < j * KlocekSzerokosc + KlocekWysokosc ) { rectfill( bufor, i * KlocekSzerokosc, j * KlocekWysokosc, i * KlocekSzerokosc + KlocekSzerokosc, j * KlocekWysokosc + KlocekWysokosc, makecol( 255, 255, 255 ) ); } if( mx > i * KlocekSzerokosc && mx < i * KlocekSzerokosc + KlocekSzerokosc && my > j * KlocekWysokosc && my < j * KlocekSzerokosc + KlocekWysokosc && mb == 1 ) { rectfill( bufor, i * KlocekSzerokosc, j * KlocekWysokosc, i * KlocekSzerokosc + KlocekSzerokosc, j * KlocekWysokosc + KlocekWysokosc, makecol( 255, 0, 0 ) ); } } } }
void myszka() { if( mx != mouse_x || my != mouse_y || mb != mouse_b ) { mx = mouse_x; my = mouse_y; mb = mouse_b; } }
int main() { allegro_init(); install_keyboard(); set_color_depth( 32 ); set_gfx_mode( GFX_AUTODETECT_WINDOWED, EkranSzerokosc, EkranWysokosc, 0, 0 ); BITMAP * bufor = NULL; bufor = create_bitmap( EkranSzerokosc, EkranWysokosc ); install_mouse(); show_mouse( screen ); unscare_mouse(); while( !key[ KEY_ESC ] ) { clear_to_color( bufor, makecol( 100, 100, 100 ) ); myszka(); show_map( bufor ); on_map( bufor ); textprintf_ex( bufor, font, 500, 500, makecol( 200, 200, 200 ), - 1, "Myszka x = %d, y = %d, klawisz = %d !", mx, my, mb ); blit( bufor, screen, 0, 0, 0, 0, 800, 600 ); } destroy_bitmap( bufor ); allegro_exit(); return 0; } END_OF_MAIN();
|
|
SeaMonster131 |
» 2012-04-16 16:15:54 Hm.. edytor map kafelkowych, bardziej pisze się w ten sposób np: int mapa[ 20 ][ 20 ], aktywnyKafelek = 0;
for( int x = 0; x < 20; x++ ) for( int y = 0; y < 20; y++ ) { if( mapa[ x ][ y ] == 1 ) rysuj( trawa, x * SZEROKOSC_KAFELKA, y * DLUGOSC_KAFELKA ); }
if( klikniecie na hudzie ) aktywnyKafelek = ID;
if( klikniecie na mapie ) mapa[ mysz.x / SZEROKOSC_KAFELKA ][ mysz.y / DLUGOSC_KAFELKA ] = aktywnyKafelek;
Coś w tym stylu. |
|
Giedzu Temat założony przez niniejszego użytkownika |
» 2012-04-16 17:41:42 ^Up, dzięki za pomoc. Ogólnie chodzi mi o prosty problem z tym rysowaniem żeby to co narysowane już zostało a nie mi znikało, nie mogę już nic wymyślić, aż głowa boli :P. void on_map( BITMAP * bufor, BITMAP * platform ) { for( int i = 0; i < SzerokoscMapy; i++ ) { for( int j = 0; j < WysokoscMapy; j++ ) { if( mx > i * KlocekSzerokosc && mx < i * KlocekSzerokosc + KlocekSzerokosc && my > j * KlocekWysokosc && my < j * KlocekSzerokosc + KlocekWysokosc ) { rectfill( bufor, i * KlocekSzerokosc, j * KlocekWysokosc, i * KlocekSzerokosc + KlocekSzerokosc, j * KlocekWysokosc + KlocekWysokosc, makecol( 255, 255, 255 ) ); } if( mx > i * KlocekSzerokosc && mx < i * KlocekSzerokosc + KlocekSzerokosc && my > j * KlocekWysokosc && my < j * KlocekSzerokosc + KlocekWysokosc && mb == 1 ) { rectfill( bufor, i * KlocekSzerokosc, j * KlocekWysokosc, i * KlocekSzerokosc + KlocekSzerokosc, j * KlocekWysokosc + KlocekWysokosc, makecol( 255, 0, 0 ) ); } } } }
|
|
RazzorFlame |
» 2012-04-16 19:20:17 ehh... Najpierw ustawiasz poczatkowa mape (chodzby na zero) a pozniej: if( kliknieto myszka ) { if( aktualnykafelek == numer kafla ) wtedy : mapa[ pozycja_myszkix / szer_kafelka ][ pozycjamyszkiy / wys_kafelka ] = numer; }
NP: #define K_ZIEMIA 1 int ak_kafelek = 0; if( mouse_b == 1 ) { if( ak_kafelek == K_ZIEMIA ) map[ mouse_x / 40 ][ mouse_y / 40 ] = K_ZIEMIA; }
|
|
« 1 » |