Sprawdzanie, ktore miejsce w gridzie zostalo kliknięte.

0

Uzywam threejs z typescriptem, moj problem polega na tym, ze nie wiem jak zrobic by wiedziec na ktory klocek w planszy nacisnalem. Moge pobrac klikniecie w na ekranie, ale to za duzo mi nie daje bo nadal nie wiem jak policzyc co zostalo klikniete, bo kamera porusza sie wraz z graczem i nie znam pozycji planszy na ekranie. Poruszanie sie po planszy za pomoca strzalek mam zrobione i dziala dobrze. Tak wyglada kod

Tworzenie

var grid = new THREE.GridHelper(5, 1);
grid.rotation.x = Math.PI / 2;

Ma ktos jakikolwiek pomysl?

0

Moge pobrac klikniecie w na ekranie, ale to za duzo mi nie daje bo nadal nie wiem jak policzyc co zostalo klikniete, bo camera porusza sie wraz z playerem i nie znam pozycji planszy na ekranie.

Co to znaczy "pobrać kliknięcie"? Skoro nie znasz współrzędnych widoku względem całej planszy/mapy, to jak niby chcesz to policzyć?

Podobny problem miałem podczas pisania komponentu TColorsGrid i obliczania indeksu klikniętej komórki, w momencie gdy zawartość grida była przewinięta; Rozwiązaniem było przechowywanie indeksu pierwszej widocznej komórki - indeks ten był mnożony przez liczbę wierszy grida i dodawany do indeksu obliczonego na podstawie współrzędnych kursora w komponencie (podczas zwolnienia LPM); Samo obliczenie indeksu na podstawie koordynatów kursora to prosty div i mod;

Spróbuj zaimplementować coś podobnego; Jeżeli cały grid nie mieści się na ekranie to musisz trzymać indeks pierwszej widocznej komórki, plus ewentualnie offsety z góry i lewej, jeśli komórki nie są wyrównywane do ekranu;

Chyba że czegoś nie zrozumiałem, to wyjaśnij dokładniej (może rysunek?).

0

jak klikne na ekran to moge miec pozycje w pixelach gdzie zostalo klikniete.

W tej chwili mapa jest mala (miesci sie na ekranie), ale w przyszlosci bedzie duza, nie wiem jak duza. Jezeli bede indeksowal od tego co pierwsze jest widoczne to nie bede wiedzial (przynajmniej nie wiem jak to rozwiazac) gdzie gracz znajduje sie na mapie. Przez co, nie bede widzial czy np nie ma tam przedmiotu do podniesienia czy jakas przeszkode do rozwiazania.

Chodzi o to, ze przy tym rozwiazaniu nie wiem jak polaczyc gracza z plansza. Jezeli znalazlbym sposob na powiazanie mapy z graczem, to wtedy to to rozwiazanie bedzie dobre (musialbym jedynie wziac pod uwage przyblizenie/oddalenie camery pod uwage, ale sadze ze dalbym sobie z tym rade)

Potrzebuje wiedziec te rzeczy, bo chodzi mi po prostu o poruszanie sie gracza po mapie

edit. Tak jak @furious programming wspomnial w komentarzu, chodzi mi o poruszanie na zasadzie Tibii czy Pixel Dungeon (to drugie bardziej) jednak nie wiem jak to zrobic za pomoca threejs (bo mapa bedzie duza i poruszanie recznie wszystkim... wydaje sie... zle)

0

Jeżeli chcesz malować na ekranie fragment mapy to musisz wiedzieć który to fragment, czyli znać współrzędne np. lewego górnego rogu widoku względem lewego górnego rogu mapy; No bo jak inaczej chcesz namalować jakąś część mapy, bez znajomości współrzędnych bieżącego fragmentu?

Jeżeli będziesz wiedział który fragment jest namalowany na ekranie to dzięki temu będziesz mógł sobie wszystko obliczyć (obliczenia są uniwersalne, bez względu na to do czego są potrzebne - co najwyżej stopień skomplikowania będzie większy, jeśli dojdzie zoom).

0

no wlasnie nie do konca, moge malowac i nie wiedziec nic o nim (wlasnie teraz tak to robie).

Threejs sam sobie radzi z tym wszystkim. Jak chcesz to moge dac Ci dostep do repo zbudujesz sobie i zobaczysz jak to dziala

0

W takim razie szukaj informacji o tym, jak odczytać współrzędne widoku, z których korzysta ten gotowy mechanizm; IMHO bez tego nic nie dasz rady policzyć - za dużo niewiadomych.

0

@furious programming moze Ciebie zainteresuje

z pomoca doszedlem do wniosku, ze najlepiej bedzie po prostu stworzyc samemu grida ze sprite'ow. Jezeli bedzie duza mapa to wtedy mozna dynamicznie ladowac sprite (generowac to co jest widoczne).
A jezeli chodzi o klikanie, to sprawdzac ktory zostal klikniety w tych aktywnych (bo te aktywne pola beda w osobnej tablicy), jak znajdziemy ten ktory zostal klikniety to znamy pozycje w tablicy (xDest,yDest) oraz pozycje gracza (x,y). Wystarczy policzyc o ile musi sie poruszyc.

0

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ę.

0

jeszcze zrobie to inaczej @furious programming

gdy klikne w jakiegos tile to po prostu napisze metode FromPixelToEnginePosition.

Bede wiedzial gdzie kliknalem (bo postac bedzie zawsze na srodku). Moge wiedziec jaka jest wielkosc sprite (tak mi sie wydaje). i po prostu policze, ile i gdzie musze sie poruszyc.

Nie potrzebuje zadnej tablicy, bo znam pozycje gracza. Na podstawie tego moge stwierdzic co zostalo klikniete

0

Tablica w domyśle służyć miała trzymaniu informacji na temat grafik, potrzebnych do namalowania kafli mapy; Natomiast to gdzie kliknięto można obliczyć jedynie na podstawie samej pozycji gracza (jeśli gracz zawsze znajduje się po środku widoku) lub współrzędnych widoku;

gdy klikne w jakiegos tile to po prostu napisze metode FromPixelToEnginePosition.

Coś ta metoda dziwnie się nazywa - czym jest Pixel i co ma do tego Engine? :]

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