PageRenderTime 57ms CodeModel.GetById 12ms RepoModel.GetById 0ms app.codeStats 0ms

/src/TheWalker.as

http://himemm.googlecode.com/
ActionScript | 424 lines | 300 code | 67 blank | 57 comment | 39 complexity | 34cdc428c37d429a14a1d1e7750c876d MD5 | raw file
  1. package
  2. {
  3. import bipede.animation.AnimationTimer;
  4. import bipede.animation.Marche;
  5. import bipede.animation.Pose;
  6. import bipede.animation.Posture;
  7. import bipede.animation.SceneManager;
  8. import bipede.animation.Sequenceur;
  9. import bipede.animation.Timeline;
  10. import bipede.controleurs.Animateur;
  11. import bipede.membres.Squelette;
  12. import bipede.user.Voiture;
  13. import bipede.membres.Person;
  14. import bipede.membres.PhysicJoint;
  15. import drawer.DrawManager;
  16. import drawer.events.DrawEvent;
  17. import events.MarcheEvent;
  18. import events.PersonEvent;
  19. import events.PlateformeEvent;
  20. import fab.geom.Circle;
  21. import flash.display.DisplayObject;
  22. import flash.display.StageDisplayState;
  23. import games.thewalker.Data;
  24. import physic.elements.Ascenceur;
  25. import bipede.data.Allures;
  26. import events.UserEvent;
  27. import fab.geom.Cone;
  28. import fab.geom.Drawer;
  29. import flash.display.MovieClip;
  30. import flash.display.Sprite;
  31. import flash.events.Event;
  32. import flash.events.*;
  33. import events.MoveEvent;
  34. import physic.*;
  35. import flash.display.Bitmap;
  36. import flash.display.BitmapData;
  37. import flash.geom.Point;
  38. import flash.geom.Rectangle;
  39. import clips.Draggable;
  40. import flash.display.StageScaleMode;
  41. import flash.display.StageAlign;
  42. import flash.display.StageScaleMode;
  43. public class TheWalker extends MovieClip
  44. {
  45. static public var zone_utile : Rectangle;
  46. static public var Width : int = 900;
  47. static public var Height : int = 700;
  48. static public var instance:TheWalker;
  49. static public var drawings:Sprite;
  50. static public var current_perso:Person;
  51. private var _bloc:Obstacle;
  52. private var sequenceur:Sequenceur;
  53. private var data:Data;
  54. private var drawManager:DrawManager;
  55. private var persos:Array=new Array();
  56. private var compteur_perso:int=0;
  57. public function TheWalker()
  58. {
  59. stage.scaleMode = StageScaleMode.NO_SCALE;
  60. instance = this;
  61. addEventListener(Event.ADDED_TO_STAGE, init );
  62. }
  63. public function init(pEvt=null):void
  64. {
  65. removeEventListener(Event.ADDED_TO_STAGE, init);
  66. stage.displayState = StageDisplayState.FULL_SCREEN;
  67. // Drawings
  68. drawings = new Sprite();
  69. addChild( drawings );
  70. drawManager = new DrawManager( drawings.graphics );
  71. // Data
  72. data = new Data();
  73. stage.addEventListener(Event.ACTIVATE, activateHandler );
  74. stage.addEventListener(Event.RESIZE, resizeHandler );
  75. stage.addEventListener( MouseEvent.CLICK, _clic );
  76. // Persos
  77. var alfred:Person = new IKPerson1();
  78. alfred.name = "alfred";
  79. alfred.x = 300;
  80. alfred.y = 0;
  81. addChild( alfred );
  82. alfred.data = data.alfred_data;
  83. alfred.addEventListener( PersonEvent.ARMATURE_READY, data.set_animations );
  84. alfred.addEventListener( PersonEvent.ANIMATIONS_READY, _animations_ready );
  85. var alphonse:Person = new IKPerson2();
  86. alphonse.name = "alphonse";
  87. alphonse.x = 600;
  88. alphonse.y = 0;
  89. addChild( alphonse );
  90. alphonse.data = data.alphonse_data;
  91. alphonse.addEventListener( PersonEvent.ARMATURE_READY, data.set_animations );
  92. alphonse.addEventListener( PersonEvent.ANIMATIONS_READY, _animations_ready );
  93. addEventListener( PersonEvent.ALL_PERSON_READY, _all_person_ready );
  94. //persos.push( alfred );
  95. persos.push( alphonse );
  96. current_perso = persos[ 0 ];
  97. // désativer le controle des pantins
  98. IKManager.trackAllArmatures(false);
  99. // Physics & physic.Elements
  100. Engine.espace = this;
  101. for each( var perso in persos )
  102. {
  103. //perso.physics = Engine.registerSoftBody( perso );
  104. //SceneManager.register( perso );
  105. }
  106. _bloc = Engine.registerObstacle( bloc1, new Point( bloc1.p1.x, bloc1.p1.y ), new Point( bloc1.p2.x, bloc1.p2.y ) );
  107. var _bloc2:Obstacle = Engine.registerObstacle( bloc2, new Point( bloc2.p1.x, bloc2.p1.y ), new Point( bloc2.p2.x, bloc2.p2.y ) );// new Point( 0, 0 ), new Point( 100, -20 ) );
  108. var _bloc3:Obstacle = Engine.registerObstacle( bloc3, new Point( bloc3.p1.x, bloc3.p1.y ), new Point( bloc3.p2.x, bloc3.p2.y ) );//, new Point( 0,0 ), new Point( 100,80 ) );
  109. var _bloc4:Obstacle = Engine.registerObstacle( bloc4, new Point( bloc4.p1.x, bloc4.p1.y ), new Point( bloc4.p2.x, bloc4.p2.y ) );//, new Point( 0, 0 ), new Point( 100, -60 ) );
  110. Engine.registerHandle( handle1 );
  111. Engine.registerHandle( handle2 );
  112. //var _ascenceur1:Obstacle = Engine.registerObstacle( ascenceur1, new Point( ascenceur1.p1.x, ascenceur1.p1.y ), new Point( ascenceur1.p2.x, ascenceur1.p2.y ) );
  113. //(ascenceur1 as MovieClip).addEventListener( PlateformeEvent.UPDATE, _ascenceur1.updatePlateforme );
  114. //_ascenceur1.addEventListener( DrawEvent.DRAWSEGMENT, drawManager.drawSegment );
  115. // User events
  116. var key:Voiture = new Voiture();
  117. key.addEventListener( UserEvent.DOWN, press_key_down );
  118. key.addEventListener( UserEvent.UP, press_key_up );
  119. key.addEventListener( UserEvent.RIGHT, press_key_right );
  120. key.addEventListener( UserEvent.LEFT, press_key_left );
  121. key.addEventListener( UserEvent.RELEASE_SPACE, release_space );
  122. key.addEventListener( UserEvent.RELEASE_DOWN, release_key_down );
  123. key.addEventListener( UserEvent.RELEASE_LEFT, release_key_left );
  124. key.addEventListener( UserEvent.RELEASE_RIGHT, release_key_right );
  125. key.addEventListener( UserEvent.RELEASE_UP, release_key_up );
  126. stage.addEventListener(KeyboardEvent.KEY_DOWN, key.keyDownHandler);
  127. stage.addEventListener(KeyboardEvent.KEY_UP, key.keyUpHandler);
  128. //dragg_perso.lockCenter = true;
  129. //dragg_perso.addEventListener( MoveEvent.STARTMOVING, perso[ 0 ].startmoving );
  130. //dragg_perso.addEventListener( MoveEvent.ENDMOVING, perso[ 0 ].endmoving );
  131. //dragg_perso.addEventListener( MoveEvent.MOVING, perso[ 0 ].move );// moving );
  132. }
  133. private function _animations_ready( event:PersonEvent ):void
  134. {
  135. trace ( event.target.name + " Ready" );
  136. switch( event.target.name )
  137. {
  138. case "alfred" :
  139. case "alphonse" :
  140. var _perso:Person = event.target as Person;
  141. //_perso.addEventListener( DrawEvent.DRAWRECTANGLE, drawManager.drawRectangle );
  142. //_perso.yeux.addEventListener( DrawEvent.DRAWLINE, drawManager.drawLine );
  143. //_perso.yeux.addEventListener( DrawEvent.DRAWPOINT, drawManager.drawPoint );
  144. //_perso.orientation = false;
  145. //_perso.repose( new MoveEvent( MoveEvent.REPOSE, null, _bloc ) );
  146. //_perso.support = _bloc;// TODO faire atterrir le perso
  147. stage.addEventListener( MouseEvent.MOUSE_MOVE, _perso.yeux.mouse_move );
  148. _perso.animateurs.marche.anim.addEventListener( MarcheEvent.FIN_PAS, fin_pas );
  149. _perso.addEventListener( MarcheEvent.NO_SUPPORT, no_support );
  150. //_perso.animateurs.marche.anim.addEventListener( DrawEvent.DRAWCURVE, drawManager.draw_curve );
  151. break;
  152. }
  153. compteur_perso++;
  154. if ( compteur_perso == persos.length ) dispatchEvent( new PersonEvent( PersonEvent.ALL_PERSON_READY ) );
  155. }
  156. private function _all_person_ready(e:PersonEvent):void
  157. {
  158. for each( var perso in persos )
  159. {
  160. perso.physics = Engine.registerSoftBody( perso );
  161. }
  162. Engine.getInstance().start();
  163. //stage.addEventListener( MouseEvent.MOUSE_MOVE, _mouse_move );
  164. // test "voir les obstacles"
  165. //var image:Bitmap = new Bitmap( Engine.zone_obstacles );
  166. //addChild(image);
  167. }
  168. private function no_support(event:MarcheEvent):void
  169. {
  170. trace("no_support");
  171. // redemarrage
  172. //current_perso.animateurs.marche.start();// provoque infinite loop
  173. balance_les_bras();
  174. }
  175. private function balance_les_bras():void
  176. {
  177. current_perso.animateurs.bras_ballants.configure( { support:current_perso.support } );
  178. current_perso.animateurs.bras_ballants.start();
  179. }
  180. private function fin_pas(event:MarcheEvent):void
  181. {
  182. // retournement
  183. trace("fin_pas");
  184. if ( current_perso.orientation != ( stage.mouseX > current_perso.x ) && Math.abs( stage.mouseX - current_perso.x ) > 200 )
  185. {
  186. // attendre la fin du pas ?
  187. current_perso.orientation = ( stage.mouseX > current_perso.x );
  188. //current_perso.repose( new MoveEvent( MoveEvent.REPOSE, null, _bloc ) );
  189. }
  190. }
  191. // user commande
  192. private function _clic(e:MouseEvent):void
  193. {
  194. balance_les_bras();
  195. }
  196. private function _mouse_move(event:MouseEvent):void
  197. {
  198. var current_support:Obstacle = current_perso.support;
  199. //trace( "current_support " , current_support);
  200. if ( current_support == null ) return;
  201. // redemarrage de la marche si blocage !??
  202. if ( current_perso.animateurs.marche != null && !current_perso.animateurs.marche.running && Math.abs( stage.mouseX - current_perso.x ) > 200 )
  203. {
  204. //current_perso.animateurs.leve_les_bras.start();
  205. //sequenceur.start();
  206. current_perso.orientation = ( stage.mouseX > current_perso.x );
  207. current_perso.animateurs.marche.start();
  208. }
  209. }
  210. private function configure_accroupissement():void
  211. {
  212. var current_support:Obstacle = current_perso.support;
  213. if ( current_support == null ) return;
  214. // calcul du point bas du Person p/r au support _bloc
  215. var p:Point = current_support.plateforme.projection( current_perso.place );
  216. var cercle:Circle = new Circle( p, current_perso.data.distance_support_accroupi );
  217. var cible:Point = cercle.projection( current_perso.place, true, true );
  218. // config de l'accroupissement
  219. current_perso.animateurs.accroupi.configure( {
  220. support:current_support,
  221. sujet:current_perso,
  222. place:current_perso.place,
  223. cible:cible
  224. } );
  225. //current_perso.animateurs.accroupi.start();
  226. }
  227. private function press_key_down(e:UserEvent):void
  228. {
  229. if ( current_perso.animateurs.marche != null && current_perso.animateurs.marche.running ) return;
  230. var current_support:Obstacle = current_perso.support;
  231. trace( "current_support " , current_support);
  232. if ( current_support == null ) return;
  233. trace( "current_");
  234. if ( current_perso.animateurs.accroupi.running )
  235. {trace( "currdddent_");
  236. if ( !current_perso.animateurs.accroupi.sens )
  237. {
  238. current_perso.animateurs.accroupi.reverse();
  239. }
  240. }
  241. else {trace( "current_");
  242. var coeff_accroupissement:Number = ( current_perso.distance_au_support( current_support ) - current_perso.data.distance_support_accroupi) / ( current_perso.data.distance_support - current_perso.data.distance_support_accroupi);
  243. //if ( coeff_accroupissement >= 1 )
  244. if ( current_perso.distance_au_support( current_support ) > current_perso.data.distance_support_accroupi )
  245. {trace( "currssent_");
  246. configure_accroupissement();
  247. current_perso.animateurs.accroupi.start();
  248. }
  249. }
  250. }
  251. private function release_key_down(e:UserEvent):void
  252. {
  253. var current_support:Obstacle = current_perso.support;
  254. if ( current_support == null ) return;
  255. trace(current_perso.distance_au_support( current_support ), current_perso.data.distance_support_accroupi, current_perso.data.distance_support );
  256. var coeff_accroupissement:Number = (current_perso.distance_au_support( current_support ) - current_perso.data.distance_support_accroupi) / ( current_perso.data.distance_support - current_perso.data.distance_support_accroupi);
  257. var direction:Point = current_perso.yeux.regard.directeur;
  258. trace(direction);
  259. if( coeff_accroupissement < 1 && direction.y < 0 )//stage.mouseY < current_perso.place.y )// SAUT
  260. {
  261. current_perso.animateurs.accroupi.stop();
  262. //current_perso.animateurs.accroupi = null;
  263. // mise ŕ jour du regard
  264. //stage.removeEventListener( MouseEvent.MOUSE_MOVE, current_perso.yeux.mouse_move );
  265. stage.dispatchEvent( new MouseEvent( MouseEvent.MOUSE_MOVE, true, false, stage.mouseX, stage.mouseY ) );
  266. // calcul du point bas du Person p/r au support _bloc
  267. var p:Point = current_support.plateforme.projection( current_perso.place );
  268. var cercle:Circle = new Circle( p, current_perso.data.distance_support_max );
  269. var impulsion:int = Math.min( 50, 50 * (1 - coeff_accroupissement) );
  270. var vitesse_sujet:Point = new Point( direction.x * impulsion, direction.y * impulsion );
  271. var cible:Point = cercle.projection( current_perso.place.add( vitesse_sujet ), true, false );
  272. //Drawer.drawCircle(drawings.graphics, cercle.centre, cercle.rayon );
  273. //Drawer.drawPoint(drawings.graphics, vitesse_sujet, 0xFF00FF);
  274. //Drawer.drawPoint(drawings.graphics, cible, 0xFF0000);
  275. //Drawer.drawPoint(drawings.graphics, direction, 0x000000);
  276. trace("SAUT : coeff " ,coeff_accroupissement,cible," ",direction,vitesse_sujet );
  277. current_perso.animateurs.saut.configure( {
  278. support:current_support,
  279. place:current_perso.place,
  280. cible:cible,
  281. vitesse_sujet:vitesse_sujet
  282. } );
  283. current_perso.animateurs.saut.start();
  284. //(saut.anim as Saut).addEventListener( DrawEvent.DRAWCURVE, drawManager.draw_curve );
  285. }
  286. else {// on se releve
  287. current_perso.animateurs.accroupi.stop();
  288. current_perso.animateurs.accroupi.reset();
  289. current_perso.animateurs.accroupi.reverse();
  290. }
  291. }
  292. private function release_space(e:UserEvent):void
  293. {
  294. current_perso.select(false);
  295. for ( var p:int = 0; p < persos.length; p++ ) if ( persos[ p ] == current_perso ) break;
  296. current_perso = ( p == persos.length - 1 )?persos[ 0 ]:persos[ p + 1 ];
  297. current_perso.select();
  298. trace( "current_perso ", current_perso.name);
  299. }
  300. private function release_key_up(e:UserEvent):void
  301. {
  302. }
  303. private function release_key_right(e:UserEvent):void
  304. {
  305. }
  306. private function release_key_left(e:UserEvent):void
  307. {
  308. }
  309. private function press_key_up(e:UserEvent):void
  310. {
  311. }
  312. private function press_key_left(e:UserEvent):void
  313. {
  314. if ( !current_perso.orientation && current_perso.animateurs.marche.running ) return;
  315. current_perso.orientation = false;
  316. _start_marche();
  317. }
  318. private function press_key_right(e:UserEvent):void
  319. {
  320. if ( current_perso.orientation && current_perso.animateurs.marche.running ) return;
  321. current_perso.orientation = true;
  322. _start_marche();
  323. }
  324. private function _start_marche():void
  325. {
  326. current_perso.animateurs.accroupi.stop();
  327. if ( current_perso.animateurs.marche != null )
  328. {
  329. //current_perso.repose( new MoveEvent( MoveEvent.REPOSE, current_perso.place, _bloc ) );
  330. current_perso.animateurs.marche.configure( {
  331. orientation:current_perso.orientation
  332. } );
  333. //current_perso.animateurs.bras_ballants.stop();
  334. current_perso.animateurs.marche.start();
  335. }
  336. }
  337. // stage manip
  338. private function activateHandler(event:Event):void {
  339. trace("activateHandler: " + event);
  340. updateSize();
  341. }
  342. private function resizeHandler(event:Event):void {
  343. trace("resizeHandler: " + event);
  344. trace("stageWidth: " + stage.stageWidth + " stageHeight: " + stage.stageHeight);
  345. updateSize();
  346. }
  347. private function updateSize():void
  348. {
  349. zone_utile = new Rectangle( int( Width - stage.stageWidth )/2, int( Height - stage.stageHeight )/2, int( stage.stageWidth ), int( stage.stageHeight ) );
  350. //zone_utile = zone_utile.intersection( MAX_ZONE ).union( MIN_ZONE );
  351. zone_utile.inflate( -1, -1 );
  352. //graphics.clear();
  353. //graphics.lineStyle( 0, 0x666666 );
  354. //graphics.drawRect( zone_utile.x, zone_utile.y, zone_utile.width, zone_utile.height );
  355. }
  356. }
  357. }