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

[Allegro] Map edytor

Ostatnio zmodyfikowano 2012-04-16 19:20
Autor Wiadomość
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ś.

C/C++
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:
C/C++
#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();
P-54630
SeaMonster131
» 2012-04-16 16:15:54
Hm.. edytor map kafelkowych, bardziej pisze się w ten sposób np:
C/C++
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 ) // wybranie konkretnego kafelka;
     aktywnyKafelek = ID; // ID tego konkretnego kafelka


if( klikniecie na mapie )
     mapa[ mysz.x / SZEROKOSC_KAFELKA ][ mysz.y / DLUGOSC_KAFELKA ] = aktywnyKafelek;


Coś w tym stylu.

P-54636
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.

C/C++
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 ) );
                // Tutaj gdy poruszam sie myszka 'lata' za mna bialy kwadrat, OK!
            }
            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 ) );
                //Natomiast tutaj chce zeby np czerwony kwadrat sie pojawił (ok) ale zeby nie znikał juz jak zjade kursorem.
            }
        }
    }
   
   
}
P-54654
RazzorFlame
» 2012-04-16 19:20:17
ehh...
Najpierw ustawiasz poczatkowa mape (chodzby na zero) a pozniej:
C/C++
if( kliknieto myszka )
{
    if( aktualnykafelek == numer kafla ) wtedy
        : mapa[ pozycja_myszkix / szer_kafelka ][ pozycjamyszkiy / wys_kafelka ] = numer;
   
}
NP:
C/C++
#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;
    //tutaj dalsze
}
P-54662
« 1 »
  Strona 1 z 1