Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [js] Zabawy z canvas: runda 2
Forum PHP.pl > Forum > Po stronie przeglądarki
230005
Czy ma ktoś jakiś pomysł na generyczną metodę wykrywania czy dwa obiekty na canvas się stykają? Jak na razie to do głowy przyszło mi tylko jedno raczej niezadowalające rozwiązanie - sprawdzanie wzdłuż krawędzi, które zawodzi jednak kiedy obiekt nie jest prostokątem - np. ma kształt litery "z". Robię to tak:

[JAVASCRIPT] pobierz, plaintext
  1.  
  2. try {
  3. var imgd = this.ctx.getImageData(this.getX() - 1, this.getY(), 1, this.getHeight());
  4. var dat = imgd.data;
  5. }
  6. catch(err) {}
  7.  
  8. if(dat) {
  9. for(var i = 0; i < dat.length; ++i) {
  10. if(dat[i] != 0)
  11. return false;
  12. }
  13. }
  14.  
[JAVASCRIPT] pobierz, plaintext


Chciałbym uniknąć tworzenia kształtów z kolejnych prostokątów i testowania każdego z tych składowych, czy nie styka się z innym. Każda rada mile widziana smile.gif.
SHiP
Nie wiem do jakich celów tego potrzebujesz. Najlepiej to rozwiązać od strony matematycznej(tj. nie sprawdzać kształtów już wyświetlonych ale analizować ich wzory matematyczne). Zawsze możesz również sprawdzać piksel po pikselu oba kształty.
230005
Nie za bardzo rozumiem z tymi wzorami matematycznymi, albo może ty nie do końca mnie zrozumiałeś winksmiley.jpg. W każdym razie postaram się rozjaśnić sprawę. Piszę Tetrisa :]. Potrzebuję wiedzieć kiedy kształt można przesunąć, a kiedy nie, np mam ustawiony jeden prostokąt i aktualnie przesuwam np. kształtem T. Muszę wiedzieć, czy "daszek" litery T nie styka się z już ustawionym prostokątem. Może być też tak, że daszek będzie nad górną krawędzią prostokąta, ale pozostała część kształtu będzie na styku - wtedy figura nie może się przesuwać (w stronę prostokąta). Obecnie robię to w taki sposób, że np. T składam z dwóch prostokątów i sprawdzam czy żaden z nich nie styka się z inną figurą. To rozwiązanie mnie jednak nie zadowala, bo dla każdej figury testowanie kolizji wygląda nieco inaczej, tak samo rotacja.
SHiP
No to musisz wiedzieć, że w przypadku gier nie powinno się takich operacji wykonywać na grafice, bo jest to nieoptymalne.

Przechowuj aktualny stan mapy coś w stylu

Kod
000000000000
000000000000
000000000000
000000000000
100000000000
110110110001
111011110010


1- zajęte pole
0 - puste pole

I teraz w przypadku próby obrotu, nie sprawdzasz figur a jedynie to czy na mapie jest wolne miejsce aby przekręcić klocek w aktualnej pozycji. Jeśli jest, przekręcasz.

Pozdrawiam
230005
No dobra, spróbuję coś takiego zaimplementować, ale wciąż wygląda na to, że dla każdej figury test będzie wyglądał inaczej...
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.