Przesuwanie bitmapy za pomocą myszki.

0

Witajcie. Mam bitmapę [kafel jakiś] 50x50 i chcę go przesunąć myszką [w sposób jak ikonki na pulpicie, klikam na ikonkę, przesuwam, puszczam itd].

Mam kod:

if(lpm == 1 && 
   mx > kafel.getPos().x && (mx < kafel.getPos().x + kafel.getPos().w) && 
   my > kafel.getPos().y && (my < kafel.getPos().y + kafel.getPos().h)) 
		kafel.move(mx - kafel.getPos().w/2, my - kafel.getPos().h / 2); 
 

mx - pozycja myszki x, my - pozycja myszki y

Problem w tym że nie mogę przesuwać jej po całym programie tylko w określonym fragmencie (jak na rysunku)
user image

Zielony kwadrat to mój kafel(bitmapa), czerwone kreski to obszar DO którego mogę przesuwać dowolnie bitmapę, za czerwony obszar nie mogę jej poruszyć. (czarny kolor to obszar mojego całego programu). Dlaczego ? jeśli usunę "&&" na "||" to mogę poruszać po całej mapie ale nie klikając na bitmapę więc to mnie nie satysfakcjonuje. Próbowałem z nawiasami bo myślałem że coś kolejność myli ale wszystko jest ok. Jak zrobić by można było przesuwać bitmapę [jak ikonki na pulpicie] w SDL c++ ?

0

Nie wiem czy to co napisze bedzie miało sens, ale zaryzykuje ;p

kafel.getPos().w - albo nie czaje, albo to jest zbedne

if(lpm == 1 &&
( mx > kafel.getPos().x && (mx < kafel.getPos().x + kafel.szerokosc) ) &&
( my > kafel.getPos().y && (my < kafel.getPos().y + kafel.wysokosc)) )
kafel.move(mx - kafel.getPos().w/2, my - kafel.getPos().h / 2);

0

dobra, widzę, że lipa z tym przypadkiem to opiszę to inaczej.

Mam kwadrat na pozycji 0( jest to pozycja x) i 0 (pozycja y) czyli lewy górny róg mojego kwadratu znajduje się na pozycji (x,y) czyli (0,0);
Wysokość kwadratu to 50 (jest to moje h) i szerokość mojego kwadratu to 50 (to moje w);

czyli mój początek na x to 0 a koniec na x to 50. U mnie w programie jest to warunek:
mx > kafel.getPos().x && mx < kafel.getPos().x + kafel.getPos().w
analogicznie do y:
my > kafel.getPos().y && my < kafel.getPos().y + kafel.getPos().h

Tak sprawdzam, czy myszka znajduje się na pozycji mojego kwadratu. Jeśli się znajduje i lewy przycisk myszy jest wciśnięty to kafel przenoszę w miejsce pozycji myszki.

Załóżmy początek mojego kwadratu mam na (0,0), kliknąłem na niego myszką w pozycji (30,30) - czyli w kwadracie - > przenoszę początek mojego kwadratu na (30,30);
Teraz początek kwadratu mam na (30,30) klikam na (70,70) i początek mojego kwadratu znajduje się na (70,70) a koniec na (70+50,70+50); itd itp.

Niestety kwadrat przesuwa mi się tylko po pewnym obszarze (jak na zdjęciu) a po reszcie obszaru już nie.. [wtf?] (odkryłem że w tym obszarze który porusza się kwadrat mieszczą się 4 takie kwadraty)

Jeśli ktoś pisał (niekoniecznie w SDL) przenoszenie przedmiotów za pomocą myszki niech napisze warunek jaki dał, to zrobie analogicznie bo już nie mam siły do tego <_<

P.S -> 100 post ; )

0
if(lpm == 1 && 
   mx > kafel.getPos().x && (mx < kafel.getPos().x + kafel.getPos().w) && 
   my > kafel.getPos().y && (my < kafel.getPos().y + kafel.getPos().h)) 

Ten warunek sprawdza czy punkt początkowy kafla leży w samym kaflu. :P
Powinno być
mx > ekran.getPos().x

0

W SDLu nie pisałem ale schemat działania jest chyba wszędzie taki sam.
Musisz obsłużyć 3 eventy:
-> MouseDown - tutaj zapisujesz sobie offset wzgledem lewego gornego rogu w jakies zmiennej
-> MouseMove - tutaj przesuwasz dany obiekt
-> MouseUp - w wybrany przez Ciebie sposob ustawiasz informacje o koncu przesuwania obiektu.

Tak u mnie wyglada kod dla Builder C++

 
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner) : TForm(Owner) {
	FHotSpot = NULL;  // ta zmienna jest zadeklarowana jako prywatna w TForm.
// Shape1 to obiekt TShape wrzucony na formatke 
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Shape1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) {
	if(Button == mbLeft) {
		FHotSpot = new TPoint(X, Y);
	}
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Shape1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y) {
	if(FHotSpot) {
		((TShape*)Sender)->Left += X - FHotSpot->x;
		((TShape*)Sender)->Top  += Y - FHotSpot->y;
	}
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Shape1MouseUp(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) {
	delete FHotSpot; FHotSpot = NULL;
}
//---------------------------------------------------------------------------

1 użytkowników online, w tym zalogowanych: 0, gości: 1