[delphi] usunięcie obiektów Tcanvas

0

Witam, mój problem może wydać się śmieszny, ale nigdzie nie znalazłem odpowiedzi na niego. Otóż projektuję prostą grę planszową, mam już większość algorytmów, jedyne czego obecnie nie potrafię zrobić, to... sprawić aby pionki się przesuwały. Może być to tak, że pionek znika z miejsca i pojawia się w innym. Po prostu nie wiem, jak go usunąć z pierwszego miejsca. Wpadłem na taki pomysł, aby w momencie przesunięcia znikały wszystkie pionki i rysowały się od nowa, tylko nie bardzo wiem czy istnieje komenda, która usunie mi wszystkie wygenerowane obiekty Tcanvas. Jest taka możliwość?

Arnvald

0

Po prostu zamaluj kolorem tła. Jeśli masz jakąś planszę, narysuj jej odpowiedni fragment na pionku.

0

Może byś to zrobił za pomocą komponentu image. Łatwo i szybko.

Image2.Left :=  X; 
{ustawia obrazek z pionkiem nr 2 w jakimś tam miejscu współrzędne x}
Image2.Top  :=  Y; 
{ustawia obrazek z pionkiem nr 2 w jakimś tam miejscu współrzędne y}
0

Hmm, zamalowanie raczej nie wchodzi w grę, gdyż pionki są ustawione tak, że jeżeli znajdują się 2 na jednym polu, to nachodzą na siebie. Musiałbym przestawiać ułożenie pionka na każdym polu,a zapewne i powiększyć pole bo by się nie zmieściły :(

Z tym obrazkiem pokombinuję, ale to też niedokładnie to o co mi chodziło, gdyż pionki to są zwykłe elipsy, każda innego koloru.

Cóż, dziękuję za odpowiedzi, będę dalej kombinował. Widocznie taka funkcja nie istnieje, a szkoda ;)

0

Elipsy, ale na jakim tle? Przecież możesz wstawić pionki razem z tłem, nic nie będzie widać.

0

Plansze rysujesz na osobnej bitmapie (TBitmap), pionki (jeśli nie są skomplikowane) możesz rysować bezpośrednio na ort!. I teraz tak w on paint komponentu na którym rysujesz najpierw rysujesz tło (np. BitBlt) a potem odrysowujesz wszystkie pionki. Pionki powinieneś mieć w jakiejś tablicy więc odrysowanie ich wszystkich to pętla + kilka komend. I teraz w momencie chowania / pokazywania w nowym miejscu pionka (oczywiście po uprzednim ustawieniu nowej pozycji pionka / ustawieniu flagi niewidoczny) wywołujesz metodę OnPaint (np. przez komponent.Inherited)

0

Misiek, nie do końca rozumiem. Wybacz, ale jeszcze głupi jestem jeśli chodzi o Delphi. Dotychczas miałem tak, że jako poszczególne pola były kolejne elementy TShape. Teraz zmieniłem tak, ze plansza to po prostu obrazek, tak jak napisałeś. Pionki są rysowane normalnie na planszy w taki sposób, żeby ładnie wpasowały się w pole. Teraz właśnie nie wiem jak zrobić, żeby wszystkie pionki naraz zniknęły. Coś mówisz o jakiejś procedurze przy OnPaint, mógłbyś to dokładniej wyjaśnić?

Kkkozak, elipsy nie mają tła, po prostu rysowanie pionka to jest ellipse(x1,y1,x2,y2), następny pionek jest ustawiony tak, żeby nachodził na poprzedni, żeby wszystkie jednocześnie mogły się zmieścić w jednym polu. Więc gdybym chciał wstawić pionek jako obrazek z białym tłem, to najechałby on na inny pionek na tym samym polu i sztucznie by to wyglądało</wiki>

0

Może zamiast tłumaczyć, stwórz sobie nową aplikację, postaw Timer1, ten kod ustal na jego zdarzenie OnTimer:

var bmp:TBitmap;
    b:byte;
begin
//TWORZENIE BITMAPY
bmp:=TBitmap.Create;
bmp.Width:=100;
bmp.Height:=100;
//STYL TŁA
bmp.Canvas.Brush.Style:=bsSolid;
bmp.Canvas.Brush.Color:=clGreen;
bmp.Canvas.Pen.Style:=psSolid;
bmp.Canvas.Pen.Color:=clGreen;
bmp.Canvas.Rectangle(0, 0, 100, 100);
//STYL ELIPS
bmp.Canvas.Brush.Style:=bsClear;
bmp.Canvas.Pen.Style:=psSolid;
bmp.Canvas.Pen.Color:=clYellow;
for b:=0 to 2 do
  bmp.Canvas.Ellipse(random(100), random(100), random(100), random(100));
//WKLEJANIE BITMAPY NA FORMĘ I USUWANIE
Form1.Canvas.Draw(10, 10, bmp);
bmp.Free;
end;

Zobacz, że między poszczególnymi klatkami nie pozostają śmieci. Wystarczy na zielonym tle odrysować wszystkie figury.

0

Dzięki wszystkim za porady! Już poradziłem sobie z tym problemem :) Zrobiłem po części tak jak mówiliście. Na miejscu gdzie pionek był w poprzedniej turze narysowałem elipsę w kolorze tła, i potem odrysowałem wszystkie pionki. W sumie powinno się to dać zrobić jeszcze prościej, żeby było troche mniej kodu, ale jak na początkującego chyba nie jest źle. Jeszcze raz wszystkim serdecznie dziękuję :)

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