Praca z Canvas i AngularJS
Podejmuję się zadania ponownego napisania następującej aplikacji flash w HTML5:
Http://www.docircuits.com/circuit-editor
Biorąc pod uwagę złożoność aplikacji i moje badania i rozwój do tej pory, zidentyfikowałem AngularJS jako preferowane ramy MVC dla wdrożenia. Aplikacja ma różne części, takie jak panele, menu, Właściwości, wykresy itp. wszystko, co moim zdaniem można łatwo zaimplementować w AngularJS.
Kluczowym problemem jest jednak to, że konstrukcja komponentu i interakcja (takie rzeczy jak przeciąganie/upuszczanie, przenoszenie, obsługa drutu itp.) muszą być oparte na płótnie, ponieważ udało mi się wyeksportować całą grafikę wektorową z Flasha za pomocą zestawu narzędzi CreateJS (http://www.adobe.com/in/products/flash/flash-to-html5.html ) do biblioteki Canvas, a nie do SVG.
Problem polega na tym, że nie ma jasnego sposobu komunikowania się między "indywidualnymi obiektami wewnątrz płótna" a AngularJS. Przyjrzałem się poniższym przykładom, ale prawie wszystkie z nich działają na obiekt canvas, a nie o obsłudze poszczególnych komponentów wewnątrz Canvas:
AngularJS Binding to WebGL / Canvas
Czy istnieje już dyrektywa rysunkowa dla AngularJS?
Utknąłem tu i nie wiem, co robić. Byłabym wdzięczna za kilka Komentarzy:
Czy AngularJS jest właściwym wyborem?
Czy powinienem spróbować zaimplementować część Canvas w innej bibliotece(np.js, kinect.js, Sztalugi.js) i zintegrować go z Angular (co znowu wydaje się zbyt dużym zadaniem na razie)?
Jeśli żaden z powyższych, jaki inny framework powinienem przełączyć na który może łatwo obsługiwać canvas, a także inne funkcje, takie jak panele, menu, wykresy itp. z łatwością?
2 answers
W końcu udało nam się współpracować z AngularJS i HTML5 Canvas razem. Poniżej krótko podzielę się naszymi wymaganiami i podejściem, które zastosowaliśmy, aby je osiągnąć.
Wymaganie było trochę trudne, jak chcieliśmy:
-
Obsługa uchwytów zdarzeń na poszczególnych elementach wewnątrz obszaru roboczego i możliwość dynamicznego dodawania tych elementów na podstawie danych w AngularJS
Przechowuj dane dla każdego pojedynczego elementu w AngularJS, używając Canvas tylko dla wyświetlanie danych.
Użyj dziedziczenia kontrolera do specjalnej obsługi danych w pewnych przypadkach (np. wszystkie instancje powinny być ruchome i przeciągalne, ale niektóre instancje mogą wymagać mrugnięcia lub pokazania pewnych pasm kolorów itp.)
Aby obsłużyć operacje na płótnie, podzieliliśmy je na dwie części:
-
Canvas service
Wykonuje zadanie
-
Inicjalizacja płótna
-
Dodawanie lub usuwanie dowolnego elementu z płótna
-
Odświeżanie płótna
-
-
Przykładowa dyrektywa i kontroler
Kontroler kątowy utrzymuje uchwyt dla odpowiedniego "elementu canvas", a także wszystkich danych, które są z nim związane.
-
Detektory zdarzeń na każdym elemencie uruchamiają określone funkcje w kontrolerze kątowym, które manipulują danymi instancji
-
Dyrektywa nadzoruje dane instancji w kontrolerze, i odpowiednio aktualizuje płótno za pomocą usługi canvas
Dla dziedziczenia kontrolera, uznaliśmy następujące podejście za całkiem przydatne: https://github.com/exratione/angularjs-controller-inheritance
Pomogło nam to dynamicznie tworzyć Kontrolery, a przy pomocy dyrektywy instancyjnej mogliśmy również obsługiwać pojedyncze aktualizacje w kanwie wraz z ogólną obsługą zdarzeń.
Rozumiem, że takie podejście może nie być całkowicie zorientowane na AngularJS, ale działało dobrze dla nas i byliśmy w stanie obsłużyć rozsądną ilość interakcji między AngularJS i HTML5 Canvas.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-09 15:59:45
Pewnie, że możesz to zrobić z Angular. Jednak w zależności od złożoności aplikacji i rodzaju synchronizacji danych, których potrzebujesz, zalecałbym użycie prototypów JS do obsługi tego. "Kanciastym sposobem" byłoby użycie dyrektyw.
Utwórz globalny kontekst rysowania, a następnie podziel różne komponenty na obiekty JS. Obsługuj konfigurację, logikę, aktualizację itp. wewnątrz każdego obiektu (coś w rodzaju klasy), a następnie rysuj do globalnego kontekstu. Powinieneś mieć główna draw loop
, która jest zasadniczo funkcją setTimeOut
, która aktualizuje Stany obiektów gry i przerysowuje wszystko.
EDIT: kolejny przykład budowania gier z angular http://alicialiu.net/leveling-up-angular-talk/examples/directive.html
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-28 15:25:03