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

[C++, Allegro5] Scrollowanie mapy

Ostatnio zmodyfikowano 2011-05-26 16:40
Autor Wiadomość
SeaMonster131
Temat założony przez niniejszego użytkownika
[C++, Allegro5] Scrollowanie mapy
» 2011-05-25 20:16:25
Wiem wiem, milion tematów o tym było :) Nie jest to mój 1. projekt z przewijaną mapką, ale jednak nie wiem jak ten błąd rozwiązać.
Otóż chciałbym po prostu spr na jakim polu w mapie kafelkowej (int mapa[][]) znajduje sie kursor myszy. Tzn umiem to zrobić, ale coś mi nie działa..
Pole bez żadnego scrollowania ma np nr 13 (mapa[0][13]), kiedy przewinę mapę tak, że to pole jest zaraz na początku ekranu to ten sam kafelek ma nr 36 (mapa[0][36]) a według mnie powinien mieć nr 13 tak jak wcześniej.

C/C++
int sz_kaf = 50, dl_kaf = 50; //szerokosc i wysokosc kafelka;
int mapx = 0, mapy = 0; //zmienne do scrollowania (czyt. "kamera")
int sz_okna = 900, dl_okna = 700; //szerokosc i wysokosc okna

//Wyswietlanie mapki:
if( map[ y ][ x ] == 0 )
     al_draw_bitmap( polska, x * sz_kaf -( mapx / sz_kaf ), y * dl_kaf -( mapy / dl_kaf ), 0 );


//przewijanie mapki:
if( mysz.x >= sz_okna - 20 || al_key_down( & klaw, ALLEGRO_KEY_RIGHT ) )
     mapx += 50;


//A tak spr na jakiej pozycji w mapie jest myszka:
int myszkax =( mysz.x / sz_kaf ) +( mapx / sz_okna );
int myszkay =( mysz.y / dl_kaf ) +( mapy / dl_okna );

Jak dla mnie to powinno to być ok, ale nie działa, nie wiem gdzie tu jest błąd. Z góry dzięki!
P-33468
DejaVu
» 2011-05-25 20:41:58
C/C++
PolozenieMyszyNaMapieOsX = PrzesuniecieMapyX + MyszX;
KafelekX = PolozenieMyszyNaMapieOsX / SzerokoscKafelka;
P-33469
SeaMonster131
Temat założony przez niniejszego użytkownika
» 2011-05-25 20:51:44
Zrobiłem tak jak Pan @DejaVu napisał, wcześniej i dla spr teraz, to ten kafelek (map[0][13]) przy początku ekranu ma wartość 630 (czyli wyszłoby że jest to map[0][630]) bodajże... więc to tez nie działa... ^^

w sensie, że zrobiłem tak:
( mapx + mysz.x ) / sz_kaf
P-33472
DejaVu
» 2011-05-25 21:21:07
Zazwyczaj ScrollX ma wartość = 0 jeżeli wyświetlasz początek mapy. Jeżeli u Ciebie jest inaczej to odejmij te 630 czy ile tam masz przesunięcie początkowe. To jest czysta matematyka - dodawanie i odejmowanie...
P-33477
SeaMonster131
Temat założony przez niniejszego użytkownika
» 2011-05-25 22:27:09
Akurat chyba nie o to chodzi. Gdy mapa jest normalna czyli nie scrollowana to wszystko jest ok, kiedy robię tak:
( mysz.x / sz_kaf ) +( mapx / sz_okna )
Kiedy przewijam mapę to mi jakieś błędy wychodzą... Zobrazuję to na rysunku:

normalna mapa:
http://zapodaj.net/21e71f5061b4.png.html

Czyli wszystko jest ok:
http://zapodaj.net/45469354a556.png.html

Natomiast po przesunięciu mapy, ten sam kafelek odpowiada innej "komórce w tablicy":
http://zapodaj.net/5df85f28fa72.png.html

A powinien odpowiadać tej samej, logicznie rozumując. I nie mam pojęcia, dlaczego tak sie dzieje?
P-33482
DejaVu
» 2011-05-25 22:31:45
1. Jaką wartość ma ScrollX gdy mapa jest w stanie początkowym (poprawnym wg. Twoich screenów).
2. O ile wartość ScrollX zostanie zwiększona gdy przesuniesz mapę o szerokość ekranu?
A tak swoją drogą to rozwiązanie masz już podane Twojego problemu...

/edit:
Poza tym niemożliwe jest osiągnięcie stanu x = 630 gdy mapa nie jest przewinięta, skoro:
C/C++
mapx = 0;
myszX = 800; // (hipotetycznie)
kafelekX = 5; // czy tam więcej
WynikX =( mapax + myszX ) / kafelekX; //Jak Ci to daje 630?

/edit2:
Z danych które masz podane wynika, że:
C/C++
mapax + myszX == 31500
Wniosek: coś kręcisz :)
P-33483
SeaMonster131
Temat założony przez niniejszego użytkownika
» 2011-05-25 22:38:55
1. Zero,  ScrollX = 0;
2. Wychodzi na to, że:  1 piksel = 2500 ScrollX

A tak swoją drogą to rozwiązanie masz już podane Twojego problemu...
Mówi Pan o tym:
C/C++
PolozenieMyszyNaMapieOsX = PrzesuniecieMapyX + MyszX;
KafelekX = PolozenieMyszyNaMapieOsX / SzerokoscKafelka;
? Ja zawsze tak robiłem, lecz to nie działa :/
P-33484
DejaVu
» 2011-05-25 22:40:16
Tak, mówię o tym.
P-33485
« 1 » 2
  Strona 1 z 2 Następna strona