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

[C++, Allegro] Edytor map

Ostatnio zmodyfikowano 2010-08-03 21:57
Autor Wiadomość
SeaMonster131
Temat założony przez niniejszego użytkownika
[C++, Allegro] Edytor map
» 2010-08-03 16:29:04
Witajcie :)
Mam pytanko: jak zrobić, żeby po kliknięciu myszką na dany kwadrat na mapie zmieniła tam się bitmapa? Pytam bo tworzę edytor map (kafelkowy) w Allegro...
Wszystko ładnie chodzi oprócz tego co chcę zrobić :P

Czyli tak: moja mapa to "short int map[13][16]" w której każdy element to 0 :P, funkcją wys_mape(); wyświetlam tą mapkę z pliku teren.bmp 160x160 (funkcją tą rozcinam obrazek na 16 części 40x40). Wziąłem kod od easykoder'a :)
Teraz dam if'a odpowiadającego za zmianę bitmapy:
C/C++
if( kafel1inmemory && mb == 1 && mx < 640 && my < 520 ) {
    map[ mx ][ my ] = 10; //Co tutaj powinno być???
}
"bool kafel1inmemory" przymuje wartość true kiedy klikne na kafelek :)
640 i 520 to koniec mapki. A numer 10 to inny kafelek w pliku teren.bmp. I niestety ten mój sposób nie chodzi :/ Ale jeśli dam np "map[5][5] = 10;" to wszystko pięknie działa :D Wie ktoś o co tu chodzi? :)

#edit: teraz zobaczyłem że nie może być map[mx][my]; ponieważ tablica ma 13x16 elementów, a współrzędne myszki...ekhem...np 400x600 itd... :)

#następny edit :D
Mógłbym stworzyć np int i = 0; i jeżeli mx <= 40 && my <= 40 to i = 0; a później wyświetlać map[jeden][jeden] = 10; ale to by wyszło 208 if'ów jeżeli dobrze liczę!!!

Naprawdę nie wiem już jak to zrobić ale ciągle mysle :P
Mam nadzieje że ktoś mi podrzuci jakiś pomysł ;)
P-20371
kamillo121
» 2010-08-03 17:10:24
po prostu mx my mają wartość w setkach kiedy pola mapy są wyrażone w nieco mniejszych liczbach, ja to często robię tak, jeżeli każde pole na mapie ma taką samą  szerokość i wysokość można podzielić  mx/szerokosc_kafla  my/wysokość_kafla ale dzielenie bez reszty dzięki czemu otrzymamy na którym polu NA EKRANIE kliknąłeś myszką, jeżeli mapa jest przewijana to do mx trzeba dodać liczbę kafli o które się przesunąłeś i tak samo z my :)   wtedy mx i my będą indeksami w tablicy mapy
P-20372
SeaMonster131
Temat założony przez niniejszego użytkownika
» 2010-08-03 17:23:26
No spoko, zrobiłem tak, to nawet działa, ale tylko od 0x0 do 520x520 po skosie... Jeżeli klikne gdzieś indziej to mi wyjdzie po przeciwnej stronie tej prostej po skosie :P
P-20373
kamillo121
» 2010-08-03 17:27:23
pokaż ten kod gdzie obliczasz pola i względem nich przypisujesz dane do tablicy bo coś mi się nie chce wierzyć ;]
 
P-20374
SeaMonster131
Temat założony przez niniejszego użytkownika
» 2010-08-03 17:33:52
Jest to mój 1. edytor więc jak coś źle to możecie mnie poprawić :)
C/C++
//mapka
short int map[ 13 ][ 16 ] =
{
    1, 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, 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, 1
};

//wyswietlanie mapki jako kwadraty 40x40 - kod od easykoder'a
void wys_mape()
{
    int licznik_x, licznik_y;
   
    for( licznik_x = 0; licznik_x < 16; licznik_x++ )
    {
        for( licznik_y = 0; licznik_y < 13; licznik_y++ )
        {
            blit( teren, bufor,( map[ licznik_y + mapa_y ][ licznik_x + mapa_x ] % 4 ) * 40,( map[ licznik_y + mapa_y ][ licznik_x + mapa_x ] / 4 ) * 40, licznik_x * 40, licznik_y * 40, 40, 40 );
        }
    }
};

//tutaj petla while speed > 0
while( speed > 0 )
{
    if( mx >= 670 && mx < 670 + 40 && my >= 100 && my < 140 && mb == 1 ) {
        kafel1inmemory = true; //kliknięcie na kafel1
    }
   
    int mmx = mx / 40, mmy = my / 40; //zrobiłem sobie nowe zmienne :P
   
    if( kafel1inmemory && mb == 1 && mx < 640 && my < 520 ) {
        map[ mmx ][ mmy ] = 10; //powinno być dobrze.. :)
    }
   
    if( mb == 2 ) {
        kafel1inmemory = false;
    }
   
    speed--;
}
Proszę - oto kodzik :)
P-20375
malan
» 2010-08-03 18:12:49
Teraz jedziemy :D.
C/C++
while( !key[ KEY_ESC ] )
{
    //Sprawdzasz, czy ktoś wybrał jakąś miniaturę...
    if( /* kliknięto na miniaturę 1 */ )
    {
        choose = true;
        chooseID = 1;
    }
    if( mouse_b == 1 && choose &&
    mouse_x >= 265 && mouse_x <= 485 &&
    mouse_y >= 35 && mouse_y <= 295 )
    {
        // Kliknięto na kafel na mapie...
        //Ustalamy pozycję:
        int posX = 0;
        int posY = 0;
       
        posX =( mouse_x - 265 ) % 16;
        posY =( mouse_y - 35 ) % 16;
       
        mapa[ posX ][ posY ] = chooseID;
       
        choose = false;
        chooseID = 0;
    }
}
Powinno działać... ;).
Najlepiej wypisz sobie na ekranto działanie:
C/C++
posX =( mouse_x - 265 ) % 16;
posY =( mouse_y - 35 ) % 16;
... i sprawdź, czy dobrze wylicza pozycje kafli ;).
Jeżeli ta metoda zadziała pomyśli się o jakieś uniwersalnej.
P-20377
kamillo121
» 2010-08-03 20:05:40
odwrotnie używałeś zmienne, ma być  map[mmy][mmx] a nie map[mmx][mmy]
P-20378
SeaMonster131
Temat założony przez niniejszego użytkownika
» 2010-08-03 21:57:23
Dzięki @kamillo121 !!!! :)
Faktycznie odwrotnie używałem tych zmiennych :P
Dzięki też wszystkim za poświecony czas.
P-20383
« 1 »
  Strona 1 z 1