z pomoca doszedlem do wniosku, ze najlepiej bedzie po prostu stworzyc samemu grida ze sprite'ow.
Akurat to nie jest jakoś szczególnie trudne, więc spokojnie możesz sam napisać ten mechanizm; Sam grid to pojęcie względne - chodzi po prostu o rysowanie ekranu z kwadratowych obrazków oraz tłumaczenie pozycji na współrzędne komórek, ew. dodatkowo wyrównywanie do tych komórek;
A jezeli chodzi o klikanie, to sprawdzac ktory zostal klikniety w tych aktywnych (bo te aktywne pola beda w osobnej tablicy) [...]
Nie potrzebujesz dwóch tablic - wystarczy jedna; Zakładając, że macierz mapy ma zawierać po prostu liczby (określające numer grafiki, np. z zakresu 0 .. 255
), możesz z takiej pojedynczej liczby zrobić strukturę, z liczbą i wartością logiczną; Ogólny przykład:
type
// dane pojedynczego pola macierzy
TMapField = record
GraphicIdx: UInt8;
Active: Boolean;
end;
type
// macierz prostej (małej) mapy
TMap = array [0 .. 15, 0 .. 15] of TMapField;
Natomiast jeżeli grafik do malowania tła masz mało (kilkanaście czy kilkadziesiąt), mapa będzie mogła przechowywać tylko liczby:
type
// macierz prostej (małej) mapy
TMap = array [0 .. 15, 0 .. 15] of UInt8;
Taka liczba na młodszych siedmiu bitach będzie przechowywać indeks grafiki tła (zakres 0 .. 127
), a w najstarszym bicie stan aktywności danego pola mapy; Do tego przyda się zestaw czterech metod do odczytu i zapisu składowych liczby:
function GetFieldGraphicIndex(AField: UInt8): UInt8;
begin
Result := AField and %01111111;
end;
function GetFieldActiveState(AField: UInt8): Boolean;
begin
Result := Boolean(AField and %10000000);
end;
procedure SetFieldGraphicIndex(var AField: UInt8; AIndex: UInt8);
begin
AField := (AField and %10000000) or (AIndex and %01111111);
end;
procedure SetFieldActiveState(var AField: UInt8; AActive: Boolean);
begin
AField := (Ord(AActive) shl 7) or (AField and %01111111);
end;
Choć można to zrobić ładniej, używając pól bitowych w poprzednio przedstawionej strukturze - zaoszczędzi się trochę miejsca, bez straty wygody obsługi (odczytu i zapisu składowych ogólnej liczby):
type
// dane pojedynczego pola macierzy
TMapField = bitpacked record
GraphicIdx: 0 .. 127;
Active: 0 .. 1;
end;
type
// macierz prostej (małej) mapy
TMap = array [0 .. 15, 0 .. 15] of TMapField;
Tak więc spokojnie wystarczy jedna macierz;
Rozpisałem się niepotrzebnie z tymi przykładami dla FPC, a przecież nie o ten język chodzi; Ale może przyda się komuś, jak trafi tu z Google; W każdym razie na pewno język w którym chcesz napisać tą grę ma różne takie bajery, żeby móc trzymać dwie informacje (indeks grafiki i stan aktywności) w jednej liczbie;
[...] jak znajdziemy ten ktory zostal klikniety to znamy pozycje w tablicy (xDest,yDest) oraz pozycje gracza (x,y).
Do określenia tego w którą komórkę kliknięto, pozycja gracza raczej nie jest Ci potrzebna; Natomiast trzeba znać rozmiary pojedynczej komórki na ekranie (według bieżącego zoomu), współrzędne widoku względem mapy oraz koniecznie offsety od góry i lewej pierwszej w całości widocznej komórki (choć to można łatwo obliczyć, na podstawie współrzędnych widoku, za pomocą modulo);
Ja to w ten sposób widzę.