Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [js] Zabawy z canvas: runda 2
230005
post 25.05.2010, 23:25:33
Post #1





Grupa: Zarejestrowani
Postów: 316
Pomógł: 36
Dołączył: 2.04.2008

Ostrzeżenie: (0%)
-----


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.

Ten post edytował 230005 25.05.2010, 23:26:21
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
SHiP
post 26.05.2010, 11:29:47
Post #2





Grupa: Zarejestrowani
Postów: 697
Pomógł: 47
Dołączył: 19.12.2003
Skąd: Lublin

Ostrzeżenie: (0%)
-----


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.

Ten post edytował SHiP 26.05.2010, 11:30:38


--------------------
Warsztat: Kubuntu, PhpStorm, Opera
Go to the top of the page
+Quote Post
230005
post 26.05.2010, 12:01:30
Post #3





Grupa: Zarejestrowani
Postów: 316
Pomógł: 36
Dołączył: 2.04.2008

Ostrzeżenie: (0%)
-----


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.

Ten post edytował 230005 26.05.2010, 12:06:58
Go to the top of the page
+Quote Post
SHiP
post 26.05.2010, 12:43:59
Post #4





Grupa: Zarejestrowani
Postów: 697
Pomógł: 47
Dołączył: 19.12.2003
Skąd: Lublin

Ostrzeżenie: (0%)
-----


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


--------------------
Warsztat: Kubuntu, PhpStorm, Opera
Go to the top of the page
+Quote Post
230005
post 26.05.2010, 13:05:35
Post #5





Grupa: Zarejestrowani
Postów: 316
Pomógł: 36
Dołączył: 2.04.2008

Ostrzeżenie: (0%)
-----


No dobra, spróbuję coś takiego zaimplementować, ale wciąż wygląda na to, że dla każdej figury test będzie wyglądał inaczej...
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.07.2025 - 09:47