[builder] Saper

0

Pisze sapera jednocześnie ucząc się obsługi buildera, zrobiłem już formy maluje mi pole moge se wybrać rozmiar jak równiez go sam wpisać i problem zaczyna się w obsłudze myszy

robie kratki pobierając bmp z pliku i wzucajac to w petle coś takiego (Image1 tam maluje pole)

 for(int x = 1; x < 10; x++){
   for(int y = 1; y < 10; y++){
     Image1->Canvas->CopyRect(Rect((x-1)*16,(y-1)*16,x*16,y*16), Image2->Canvas, Rect(16, 0, 32, 16));
   }
 }

i teraz co chcĘ zrobić obsługę myszy (tak jak w ms saperze, czyli lewy klik wciska pole i moge nim jezdzic po obszarze pÓÓÓÓki niepuszcze, oraz lewy i prawy klik zaznacza mi 9 pól reszta j/w)
ale jak robie przy ruszeniu myszą to mi cały czas odkrywa czyli zle

void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift,
      int X, int Y)
{
 int s, w;
 s = Y/16;
 w = X/16;
 if(Form1->Click()){
  Image1->Canvas->CopyRect(Rect(w*16, s*16, (w+1)*16, (s+1)*16), Image2->Canvas, Rect(0, 0, 16, 16));
 }
}

pewnie trzeba dac jakies warunki jeszcze lub dac TForm1::Image1MouseDown
podpowiecie mi trochę ? :>

0

Hmmm ja bym to zrobił w troche inny sposób, zamiast rysowania na Image dynamicznie stworzyłbym odpowiednią liczbę Buttonów (w rozmiarze np:16x16) i wtedy do każdego stworzonego buttona podczepić by można pod zdarzenie OnClick jakąś konkretną funkcje która sprawdza który przycisk został klikniety. to tylko taki zarys ale jeśli nie rozumiesz (piszesz że się dopiero uczysz) to napisz czego nie rozumiesz :)

0

Lepiej zostaw rysowaniem, jest bardziej eleganckie, tym bardziej jak będziesz powiększał pole.. Po prostu na MouseMove pokazuj prawie naciśnięty kwadracik pola, ale odsłaniaj tylko w akcji na puszczenie przycisku. Podczas przesuwania wciśniętej myszy zapamiętuj pole, które "prawie odsłoniłeś", aby po przesunięciu kursora tamto zakryć z powrotem. Taki jest mój pomysł..

0

Nie wiem czy o to ci chodzi ale w OnMouseMove możesz sprawdzać przyciski myszy tak:

if(Shift.Contains(ssLeft))
{
 ...
}

if(Shift.Contains(ssRight))
{
 ...
}
0

Kolejne lamerskie pytanie: jak zapamięać poprzednią wartość położenia kursora niezapisując danych do pliku?

0

Zapisać do zmiennej (na przykład typu POINT) ;P

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