1+ class Actor {
2+ constructor ( cv , info ) {
3+ var self = this ;
4+ self . running = false ;
5+ self . cv = cv ;
6+ self . info = info ;
7+ self . img = null ;
8+ self . imgReady = false ;
9+ self . touching = false ;
10+ this . lastInsideTime = - 1 ;
11+ self . stage = info . stage ; // camera
12+ self . moveArray = [ ] ;
13+ self . isFlip = self . stage . getFlip ( ) ;
14+ self . body = document . getElementsByTagName ( 'body' ) [ 0 ] ;
15+ self . originImgURL = info . img ;
16+ self . originSize = [ info . pos [ 3 ] , info . pos [ 4 ] ] ;
17+ self . setImg ( info . img , info . pos ) ;
18+ self . hide ( ) ;
19+ if ( typeof info . snd == 'undefined' ) {
20+ info . snd = "" ;
21+ }
22+ self . audio = new Audio ( info . snd ) ;
23+ self . jsonInfo = {
24+ "history" : 500 ,
25+ "varThreshold" : 25 ,
26+ "learningRate" : 0.0025 ,
27+ "detectShadows" : false ,
28+ "objMinSize" : 10 ,
29+ "touchTime" : 1000 ,
30+ "filter" : [ "e5" , "g1" , "d3" ]
31+ } ;
32+ self . onTouchCallback = function ( ) { } ;
33+ self . setTracking ( {
34+ 'inside' : function ( pos ) {
35+ var nowTime = new Date ( ) . getTime ( ) ;
36+ if ( nowTime - this . lastInsideTime < self . jsonInfo . touchTime ) {
37+ self . touching = true ;
38+ return ;
39+ }
40+ self . touching = false ;
41+ this . lastInsideTime = nowTime ;
42+ if ( self . isHide ( ) ) return ;
43+ self . inPos = pos ;
44+ self . onTouchCallback ( pos ) ;
45+ } ,
46+ 'outside' : function ( pos ) {
47+ self . outPos = pos ;
48+ }
49+ } ) ;
50+ }
51+
52+ play ( ) {
53+ this . audio . play ( ) ;
54+ return this ;
55+ }
56+
57+ showTime ( ) {
58+ this . tracking . scan ( ) ;
59+ }
60+
61+ switchImg ( url , switchTime ) {
62+ var self = this ;
63+ self . jsonInfo . touchTime = switchTime * 1000 ;
64+ if ( self . touching ) return ;
65+ var lastPos = [ self . x , self . y , self . width , self . height ] ;
66+ self . setImg ( url , lastPos ) ;
67+ setTimeout ( function ( ) {
68+ self . setImg ( self . originImgURL , lastPos ) ;
69+ } , self . jsonInfo . touchTime ) ;
70+ }
71+
72+ setSndURL ( url ) {
73+ this . audio = new Audio ( url ) ;
74+ }
75+
76+ setImgSize ( width , height ) {
77+ this . width = width ;
78+ this . height = height ;
79+ this . img . style . width = this . width + 'px' ;
80+ this . img . style . height = this . height + 'px' ;
81+ }
82+
83+ setImg ( url , pos ) {
84+ var self = this ;
85+ if ( arguments . length == 1 ) {
86+ pos = [ self . x , self . y ] ;
87+ }
88+ if ( self . img != null && self . imgReady ) {
89+ self . body . removeChild ( this . img ) ;
90+ }
91+ var canvas = self . stage . getCanvas ( ) ;
92+ self . img = new Image ( ) ;
93+ self . imgReady = false ;
94+ self . img . onload = function ( ) {
95+ self . imgReady = true ;
96+ this . style . position = 'absolute' ;
97+ this . style . left = self . getCanvas ( ) . offsetLeft + pos [ 0 ] + 'px' ;
98+ this . style . top = self . getCanvas ( ) . offsetTop + pos [ 1 ] + 'px' ;
99+ self . body . appendChild ( this ) ;
100+ } ;
101+ self . img . src = url ;
102+ self . x = pos [ 0 ] ;
103+ self . y = pos [ 1 ] ;
104+ self . width = self . img . width ;
105+ self . height = self . img . height ;
106+ if ( pos . length == 4 ) {
107+ self . width = this . info . pos [ 2 ] ;
108+ self . height = this . info . pos [ 3 ] ;
109+ self . img . style . width = self . width + 'px' ;
110+ self . img . style . height = self . height + 'px' ;
111+ }
112+ return this ;
113+ }
114+
115+ getCanvas ( ) {
116+ return this . stage . getCanvas ( ) ;
117+ }
118+
119+ moveTo ( x , y ) {
120+ //support array [x,y]
121+ if ( arguments . length == 1 ) {
122+ y = x [ 1 ] ;
123+ x = x [ 0 ] ;
124+ }
125+ if ( this . running ) {
126+ this . x = x ;
127+ this . y = y ;
128+ this . img . style . display = '' ;
129+ var offsetLeft = this . getCanvas ( ) . offsetLeft ;
130+ var offsetTop = this . getCanvas ( ) . offsetTop ;
131+ this . img . style . left = offsetLeft + this . x + "px" ;
132+ this . img . style . top = offsetTop + this . y + "px" ;
133+ this . tracking . moveTo ( x , y ) ;
134+ } else {
135+ this . moveArray . push ( [ x , y ] ) ;
136+ }
137+ return this ;
138+ }
139+
140+ isHide ( ) {
141+ return this . img . style . display == 'none' ;
142+ }
143+
144+ hide ( ) {
145+ this . img . style . display = 'none' ;
146+ }
147+
148+ show ( ) {
149+ this . img . style . display = '' ;
150+ }
151+
152+ getStage ( ) {
153+ return this . stage ;
154+ }
155+
156+ onTouch ( callback ) {
157+ this . onTouchCallback = callback ;
158+ }
159+
160+ setTracking ( callback ) {
161+ var x = this . x ;
162+ var y = this . y ;
163+ this . tracking =
164+ new Hotspot ( this . getCanvas ( ) , this . getCanvas ( ) , true ,
165+ x , y ,
166+ x + this . width , y ,
167+ x + this . width , y + this . height ,
168+ x , y + this . height ) ;
169+ this . tracking . setFlip ( this . isFlip ) ;
170+ this . tracking . jsonInfo = this . jsonInfo ;
171+ //this.tracking.debug();
172+ this . tracking . setCvProcess ( this . cv . imgFilter ) ;
173+
174+ if ( typeof callback [ 'inside' ] == "function" ) {
175+ this . tracking . inside ( callback [ 'inside' ] ) ;
176+ }
177+ if ( typeof callback [ 'outside' ] == "function" ) {
178+ this . tracking . outside ( callback [ 'outside' ] ) ;
179+ }
180+ return this ;
181+ }
182+
183+ start ( ) {
184+ var self = this ;
185+ self . stage . onReady ( function ( ) {
186+ console . log ( "stage ready , Actor start..." , "0419" ) ;
187+ self . tracking . start ( ) ;
188+ self . running = true ;
189+ for ( var i = 0 ; i < self . moveArray . length ; i ++ ) {
190+ self . moveTo ( self . moveArray . shift ( ) ) ;
191+ }
192+ } ) ;
193+ self . stage . onCanvas ( function ( c ) {
194+ self . showTime ( ) ;
195+ } ) ;
196+ }
197+ }
0 commit comments