Advertisement
terorama

Flash / Tutorials 7

Apr 2nd, 2013
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. -------------------------------------------------------
  2. -------------------------------------------------------
  3. -------------------------------------------------------
  4. -------------------------------------------------------
  5.  needBePaused = new Array();//тут хранятся все клипы для ПАУЗЫ
  6. _global.addToPause = function(obj){
  7.     if(!obj._inPause){//2 раза в ПАУЗУ не добавляем
  8.         needBePaused.push(obj);
  9.         obj._inPause = true;
  10.     }
  11. }
  12. _global.setPause = function(flag) {
  13.     isPause = flag;//переменная, на всякий случай
  14.     var i = needBePaused.length;
  15.     while(i--) {
  16.         var curObj = needBePaused[i];
  17.         if (flag) {
  18.             curObj.stop();
  19.             curObj.oef = curObj.onEnterFrame;//временно сохраняем
  20.             curObj.onEnterFrame = null;
  21.         } else {
  22.             curObj.onEnterFrame = curObj.oef;//восстанавливаем
  23.             curObj.play();
  24.         }
  25.     }
  26. }
  27.  
  28. -------------------------------------------------------
  29. -------------------------------------------------------
  30. -------------------------------------------------------
  31. -------------------------------------------------------
  32. this.removeMovieClip();
  33.  
  34. fire._visible = false;//скрываем эталон
  35. lev = 0;//переменная для уровней
  36. this.onEnterFrame = function() {
  37.     for (var i = 0; i < 2; i++) {//выполняется 2 раза чтобы увеличить плотность
  38.         lev++;
  39.         d = fire.duplicateMovieClip("f" + lev, lev);
  40.         d._x += Math.random() * 6 - 3;//случайный разброс по координатам
  41.         d._y += Math.random() * 6 - 3;
  42.         d._alpha = Math.random() * 50 + 50;//реализм
  43.         d._xscale = d._yscale = Math.random() * 50 + 70;//реализм
  44.     }
  45. }
  46.  
  47. //------------------------------------------
  48.  
  49. fire._visible = false;
  50. lev = 0;
  51. this.onEnterFrame = function() {
  52.     for (var i = 0; i < 2; i++) {
  53.         lev++;
  54.         if(lev > 1000) {
  55.             lev = 0;
  56.         }
  57.         d = fire.duplicateMovieClip("f" + lev, lev + 2000);//огонь
  58.         d2 = fire.duplicateMovieClip("f2" + lev, lev);//контурная подложка
  59.         d2._x = d._x += Math.random() * 6 - 3;
  60.         d2._y = d._y += Math.random() * 6 - 3;
  61.         d._alpha = Math.random() * 50 + 50;
  62.         d2._xscale = d2._yscale = d._xscale = d._yscale = Math.random() * 50 + 70;
  63.         var col = new Color(d2);
  64.         var tr = col.getTransform();
  65.         tr.ab = tr.rb = tr.gb = tg.bb = 255;//не знаю почему, но закрашивает желтым
  66.         col.setTransform(tr);
  67.     }
  68. }
  69. //------------------------------------------
  70. fire._visible = false;
  71. lev = 0;
  72. function placeFire(x, y) {
  73.     for (var i = 0; i < 2; i++) {
  74.         lev++;
  75.         d = fire.duplicateMovieClip("f" + lev, lev);
  76.         d._x = x + Math.random() * 6 - 3;
  77.         d._y = y + Math.random() * 6 - 3;
  78.         d._alpha = Math.random() * 50 + 50;
  79.         d._xscale = d._yscale = Math.random() * 50 + 70;
  80.     }
  81. }
  82. onEnterFrame = function() {
  83.     placeFire(_xmouse, _ymouse);
  84. }
  85.  
  86. -------------------------------------------------------
  87. -------------------------------------------------------
  88. -------------------------------------------------------
  89. -------------------------------------------------------
  90. this.removeMovieClip();
  91.  
  92. lev = 0;
  93. var w = box._width;
  94. var h = box._height;
  95. onEnterFrame = function() {
  96.     lev++;
  97.     var d = wave.duplicateMovieClip("d" + lev, lev);
  98.     d._x = box._x + Math.random() * w;//ложим в случайную точку
  99.     d._y = box._y + Math.random() * h;//на поверхности воды
  100.     d._xscale = d._yscale = 50 + Math.random() * 100;//больше реализма
  101. }
  102.  
  103. //------------------------------------------
  104. x0 = _x;
  105. x9 = x0 - _width / 2;
  106. onEnterFrame = function() {
  107.     _x -= speed;//скорость задается снаружи
  108.     var dx = x9 - _x;
  109.     if (dx > 0) {
  110.         _x = x0 - dx;
  111.     }
  112. }
  113.  
  114. onClipEvent (load) {
  115.     speed = 3.5;//для верхнего клипа
  116. }
  117. //------------------------------------------
  118.  
  119. if(!_first) {
  120.     _first = true;
  121.     gotoAndPlay(Math.floor(Math.random()*_totalframes));
  122.  
  123. }
  124.  
  125. onClipEvent (load) {
  126.     y0 = _y;//запомним координату и привяжемся к ней
  127.     onEnterFrame = function() {
  128.         _y += .5;
  129.         if(_y > 175) _y = y0;
  130.     }
  131. }
  132.  
  133. onClipEvent (load) {
  134.     y0 = _parent.water1.y0;//вот и привязались
  135.     onEnterFrame = function() {
  136.         _y += .5;
  137.         if(_y > 175) _y = y0;
  138.     }
  139. }
  140. //------------------------------------------
  141. onClipEvent (load) {
  142.     y0 = _y;
  143.     y9 = y0 - _height / 2
  144.     speed = .5;
  145. }
  146. onClipEvent (enterFrame) {
  147.     _y -= speed;
  148.     if(_y < y9) {
  149.         var del = Math.abs(_y) - Math.abs(y9);
  150.         _y = y0 + del - speed;
  151.     }
  152. }
  153. //------------------------------------------
  154. lev = 0;
  155. onEnterFrame = function () {
  156.     lev++;
  157.     var d = wave.duplicateMovieClip("w" + lev, lev);
  158.     d._x = water._x + Math.random() * water._width;//располагаем по горизонту
  159. };
  160.  
  161. -------------------------------------------------------
  162. -------------------------------------------------------
  163. -------------------------------------------------------
  164. -------------------------------------------------------
  165. lev = 0;
  166. speed = 5;
  167. var dist = right._x - left._x;//ширина анимированного фона
  168.  
  169. //функция создает и модифицирует дубликат
  170. placeTree = function () {
  171.     lev++;
  172.     var d = tree.duplicateMovieClip("t" + lev, lev);
  173.     d._x = right._x + Math.random() * 50; //небольшой разброс для правдоподобности
  174.     d._xscale = d._yscale = 50 + Math.random() * 50;//с той же целью
  175.     if(Math.random() < .5) {//случайно выбирается вид куста
  176.         d.gotoAndStop(1);
  177.     } else {
  178.         d.gotoAndStop(2);
  179.     }
  180.  
  181.     d.onEnterFrame = function() {
  182.         this._x -= speed;
  183.         if(this._x < left._x){//удаляется, если вышел за пределы слева
  184.             this.removeMovieClip();
  185.         }
  186.     }
  187.  
  188.     return d;
  189. };
  190. //чтобы сразу что-то было, заполняем экран объектами
  191. var i = 20;//подбираем на глаз
  192. while (i--){
  193.     var d = placeTree();
  194.     d._x = left._x + Math.random() * dist;//случайное начальное положение
  195. }
  196.  
  197. onEnterFrame = function() {
  198.     if(lev++ % 10 == 0){//выполнять каждый 10-й кадр
  199.         placeTree();
  200.     }
  201. }
  202.  
  203. //------------------------------------------
  204. lev = 0;
  205. speed = 5;
  206. var dist = right._x - left._x;//расстояние между маркерами
  207.  
  208. //функция создает обработанный дубликат символа tree
  209. placeTree = function () {
  210.     lev++;
  211.     var d = tree.duplicateMovieClip("t" + lev, lev);
  212.     d._x = right._x;
  213.     d.ky = Math.random();//коэфициент глубины
  214.     d._y = right._y + d.ky * right._height;//высоту тоже регулирую маркерами
  215.     d._xscale = d._yscale = d.ky * 100;//чем дальше, тем меньше
  216.  
  217.     //с танцами и бубнами - усложняю чтобы получить уникальное число
  218.     //простой Math.random() подозрительно часто повторяется
  219.     d.swapDepths(Math.floor(d._y * 100 + Math.random() * 90));
  220.  
  221.     //случайно выбираем вид куста
  222.     if(Math.random() < .5) {
  223.         d.gotoAndStop(1);
  224.     } else {
  225.         d.gotoAndStop(2);
  226.     }
  227.  
  228.     //добавляю воздушную перспективу
  229.     var c = new Color(d);
  230.     var n = 60 - d.ky * 60; //подбираем на глаз
  231.     var ct = {rb:n,gb:n,bb:n};
  232.     c.setTransform(ct);
  233.  
  234.     d.onEnterFrame = function() {
  235.         this._x -= speed / 2 * (1 + this.ky);//от 50% до 100% от скорости
  236.         if(this._x < left._x){
  237.             this.removeMovieClip();
  238.         }
  239.     }
  240.     return d;
  241. };
  242.  
  243. //создаем изначально заросшее поле
  244. var i = 70; //подбираем на глаз
  245. while (i--){
  246.     var d = placeTree();
  247.     d._x = left._x + Math.random() * dist;
  248. }
  249.  
  250. onEnterFrame = function() {
  251.     if(lev++ % 4 == 0){ //каждый четвертый кадр
  252.         placeTree();
  253.     }
  254. }
  255.  
  256. -------------------------------------------------------
  257. -------------------------------------------------------
  258. -------------------------------------------------------
  259. -------------------------------------------------------
  260.  
  261. onClipEvent (load) {
  262.     speed = 4;//скорость
  263.     x0 = _x;//Запоминаем начальное положение
  264.     x9 = x0 - _width / 2;//максимально-допустимое левое положение
  265.     onEnterFrame = function() {
  266.         _x -= speed;
  267.         var dx = x9 - _x; //Вычисляем перебор
  268.         if (dx > 0) {
  269.             _x = x0 - dx;//Компенсируем его и возвращаем в начальное положение
  270.         }
  271.     }
  272. }
  273.  
  274. //------------------------------------------
  275.  
  276. onClipEvent (load) {
  277.     backSpeed = 4;//то же что и speed у фона
  278.     maxSpeed = 5;//будем ограничивать максимальную скорость
  279.     speedX = 0;
  280.     onEnterFrame = function() {
  281.         var dx = _parent._xmouse - _x;
  282.         speedX += dx * .1;//сила притяжения к курсору
  283.         speedX *= .7;//затухание
  284.         speedX = (speedX > maxSpeed)? maxSpeed : (speedX < -maxSpeed)? -maxSpeed : speedX;
  285.         if(_currentframe < 23) {
  286.             _x += speedX;//если в воздухе
  287.         } else {
  288.             _x -= backSpeed;//если прижаты к земле
  289.         }
  290.     }
  291. }
  292.  
  293. -------------------------------------------------------
  294. -------------------------------------------------------
  295. -------------------------------------------------------
  296. -------------------------------------------------------
  297. onClipEvent (load) {
  298.     y0 = _y;
  299.     t = 0;
  300.     onEnterFrame = function(){
  301.         _y = y0 + Math.sin(t += .15)*4;
  302.     }
  303. }
  304. //------------------------------
  305. onClipEvent (load) {
  306.     x0 = _x;
  307.     y0 = _y;
  308.     tx = Math.random()*10000;
  309.     ty = Math.random()*10000;
  310.     onEnterFrame = function() {
  311.         _x = x0 + Math.sin(tx += .3) * 15;
  312.         _y = y0 + Math.sin(ty += .4) * 25;
  313.     }
  314. }
  315. //------------------------------
  316. onClipEvent (load) {
  317.     t = 0;
  318.     onEnterFrame = function () {
  319.         _rotation = Math.sin(t += .1) * 5 - 3;
  320.     };
  321. }
  322. //------------------------------
  323. onClipEvent (load) {
  324.     t = 0;
  325.     x0 = _parent.light._x;
  326.     onEnterFrame = function(){
  327.         var k = Math.sin(t+= .05)*5;
  328.         _rotation = k;
  329.         _parent.light._x = x0 - k*3;//множитель подбирается
  330.     }
  331. }
  332. //------------------------------
  333. onClipEvent (load) {
  334.     y0 = _y;
  335.     t = 0;
  336.     onEnterFrame = function(){
  337.         t += .5;
  338.         _xscale = 100 + Math.sin(t)*30;
  339.         _yscale = 100 - Math.sin(t)*30;
  340.     }
  341. }
  342. //------------------------------
  343. onClipEvent (load) {
  344.     y0 = _y;
  345.     t = 0;
  346.     onEnterFrame = function(){
  347.         _y = y0 - Math.abs(Math.sin(t += .2))*70;
  348.     }
  349. }
  350. //------------------------------
  351. onClipEvent (load) {
  352.     y0 = _y;
  353.     t = 0;
  354.     onEnterFrame = function(){
  355.         _y = y0 - Math.abs(Math.sin(t -= .2))*70;
  356.         _xscale = 100 + Math.sin(t*2)*20;
  357.         _yscale = 100 + Math.cos(t*2)*20;
  358.     }
  359. }
  360. //------------------------------
  361. onClipEvent (load) {
  362.     y0 = _y;
  363.     x0 = _x;
  364.     t = 0;
  365.     onEnterFrame = function(){
  366.         _y = y0 - Math.abs(Math.sin(t -= .2))*70;
  367.         _x = x0 + Math.sin(t + Math.PI / 2)*30;
  368.         _rotation = Math.sin(t + Math.PI / 2)*10;
  369.         _xscale = 100 + Math.sin(t*2)*20;
  370.         _yscale = 100 + Math.cos(t*2)*20;
  371.     }
  372. }
  373.  
  374. -------------------------------------------------------
  375. -------------------------------------------------------
  376. -------------------------------------------------------
  377. -------------------------------------------------------
  378. import flash.geom.Transform;
  379. import flash.geom.Matrix;
  380.  
  381. var level = 0;//на сколько клипов вверх компенсировать трансформацию
  382.  
  383. cameraFrame._visible = false;//делаем саму рамку невидимой
  384. init();
  385.  
  386. //==================================
  387. //don't tuch this :)
  388.  
  389. function init(){
  390.     var oldMode = Stage.scaleMode;
  391.     Stage.scaleMode = "exactFit";
  392.     w = Stage.width;
  393.     h = Stage.height;
  394.     Stage.scaleMode = oldMode;
  395.     recalcParentMatrix();
  396.     cameraStep();
  397.     onEnterFrame = cameraStep;
  398.     onUnload = resetStage;
  399. }
  400. //-----------------------------
  401. function recalcParentMatrix() {
  402.     mc = _parent;
  403.     if(level){
  404.         var i = level - 1;
  405.     } else {
  406.         var i = 1000;
  407.     }
  408.     while (i-- && mc && mc != _root) {
  409.         var tempTrans = new Transform(mc);
  410.         if (!parentM) {
  411.             parentM = tempTrans.matrix;
  412.         } else {
  413.             parentM.concat(tempTrans.matrix);
  414.         }
  415.         mc = mc._parent;
  416.     }
  417.     cameraTrans = new Transform(this);
  418.     topLevelTrans = new Transform(mc);
  419.     resetM = topLevelTrans.matrix;
  420.     resetTopLevelColor = topLevelTrans.colorTransform;
  421. }
  422. //-----------------------------
  423. function cameraStep() {
  424.     topLevelTrans.colorTransform = cameraTrans.colorTransform;
  425.     curM = cameraTrans.matrix;
  426.     if (parentM) {
  427.         curM.concat(parentM);
  428.     }
  429.     curM.invert();
  430.     curM.translate(w / 2,h / 2);
  431.     topLevelTrans.matrix = curM;
  432.     //mc.filters = this.filters;
  433. }
  434. //-----------------------------
  435. function resetStage():Void {
  436.     topLevelTrans.matrix = resetM;
  437.     topLevelTrans.colorTransform = resetTopLevelColor;
  438. }
  439.  
  440. -------------------------------------------------------
  441. -------------------------------------------------------
  442. -------------------------------------------------------
  443. -------------------------------------------------------
  444.  
  445. partGo._visible = false; //скрываем эталонный символ
  446. i = 30;
  447. while (i--) {
  448.     d = partGo.duplicateMovieClip("p" + i, i); //делаем дубликат
  449.     d._rotation = Math.random() * 360; //какой сектор покрываем
  450.     d._xscale = d._yscale = Math.random()*70 + 50; //добавляем реализм
  451. }
  452.  
  453. _parent.removeMovieClip();//удалит клип boom если он добавлен программно
  454. stop();//просто остановит анимацию, если клип добавлен руками
  455.  
  456. //-----------------------------------
  457. boom._visible = false;
  458. lev = 0;
  459. function placeBoom(x, y){
  460.     lev++;
  461.     var d = boom.duplicateMovieClip("b" + lev, lev);
  462.     d._x = x;
  463.     d._y = y;
  464. }
  465. placeBoom(Math.random()*200, Math.random()*200);//ложим в случайное место
  466.  
  467. -------------------------------------------------------
  468. -------------------------------------------------------
  469. -------------------------------------------------------
  470. -------------------------------------------------------
  471. MovieClip.prototype.flipX = function () {
  472. this._xscale = -this._xscale;
  473. };
  474.  
  475. mc.flipX();
  476.  
  477. MovieClip.prototype.flipY = function () {
  478. this._yscale = -this._yscale;
  479. };
  480.  
  481. BuiltinObject.prototype.method = function () {
  482. // ну а здесь пошел наш код
  483. };
  484.  
  485. Array.prototype.push = function (data) {
  486. this[this.length] = data;
  487. };
  488.  
  489. Math.distance = function (x1, y1, x2, y2) {
  490. var dx = x2 — x1;
  491. var dy = y2 — y1;
  492. return Math.sqrt (dx*dx + dy*dy);
  493. };
  494.  
  495. -------------------------------------------------------
  496. -------------------------------------------------------
  497. -------------------------------------------------------
  498. -------------------------------------------------------
  499. onClipEvent (load) {
  500. // init variables
  501. startSize = 20;
  502. max = 20;
  503. sizeIncrement = 15;
  504. effectChoice = 1;
  505. roots = new Array();
  506.  
  507. // Duplication process
  508. for (var i = 0; i<max; i++) {
  509. duplicateMovieClip (originalRoot, «root»+i, i);
  510. roots[i] = eval(«root»+i);
  511. roots[i]. xscale = startSize+(i*sizeIncrement);
  512. roots[i]. yscale = startSize+(i*sizeIncrement);
  513. roots[i]. alpha = 100-(100/max)*i;
  514. roots[i].gotoAndStop(effectChoice);
  515. }
  516.  
  517. file://A function that changes the mouse effect
  518. function ChooseNewEffect(choice) {
  519. if (choice > 0 and choice <= originalRoot. totalframes){
  520. for (var n = 0; n < max; n ++) {
  521. roots[n].gotoAndStop(choice);
  522. }
  523. }
  524. }
  525.  
  526. originalRoot. visible = false;
  527. }
  528.  
  529. onClipEvent (enterFrame) {
  530. roots[0]. x = xmouse;
  531. roots[0]. y = ymouse;
  532. for (var i = 1; i<=roots.length; i++) {
  533. roots[i].xdistance = (roots[i-1]. x-roots[i]. x)/2 + roots[i].xdistance*0.3;
  534. roots[i].ydistance = (roots[i-1]. y-roots[i]. y)/2 + roots[i].ydistance*0.3;
  535. roots[i]. x += roots[i].xdistance;
  536. roots[i]. y += roots[i].ydistance;
  537. }
  538. }
  539.  
  540. -------------------------------------------------------
  541. -------------------------------------------------------
  542. -------------------------------------------------------
  543. -------------------------------------------------------
  544.  
  545. // изменить частоту кадров на 12 fps:
  546.  
  547. stage.frameRate = 12;
  548. //---------------------------
  549.  
  550. package {
  551.    
  552.    import flash.display.Sprite;
  553.  
  554.    
  555.  
  556.    public class ClassScope extends Sprite {
  557.  
  558.  
  559.      
  560.         public function ClassScope() {
  561.            
  562.              traceThis(); // "Class Instance"
  563.  
  564.            
  565.              var obj:Object = new Object();
  566.            
  567.              obj.traceThis = traceThis;
  568.            
  569.              obj.traceThis(); // "Class Instance"
  570.  
  571.  
  572.          
  573.              traceThis.call(new Sprite());
  574.  
  575.            // "Class Instance"
  576.        
  577.         }
  578.  
  579.        
  580.  
  581.     public override function toString():String {
  582.            
  583.              return "Class Instance";
  584.         }
  585.  
  586.        
  587.  
  588.        public function traceThis():void {
  589.            
  590.        trace(this);
  591.         }
  592.    
  593.    }
  594. }
  595.  
  596.  
  597. -------------------------------------------------------
  598. -------------------------------------------------------
  599. -------------------------------------------------------
  600. -------------------------------------------------------
  601.  
  602. var obj:Object = getMyCustomObject();
  603.  
  604. var customObj:MyClass = MyClass(obj);
  605.  
  606. var obj:Object = getMyCustomObject();
  607.  
  608. var customObj:MyClass = obj as MyClass;
  609.  
  610. stage.addEventListener(MouseEvent.MOUSE_MOVE, onMouseMove);
  611.  
  612.    import flash.display.Sprite;
  613.     import flash.events.MouseEvent;
  614.     import flash.events.Event;
  615.     import Box2D.Common.Math.b2Vec2;
  616.     import com.reyco1.physinjector.PhysInjector;
  617.     import com.reyco1.physinjector.data.PhysicsObject;
  618.     import com.reyco1.physinjector.data.PhysicsProperties;
  619.     public class Main extends Sprite {
  620.         private var physics:PhysInjector;
  621.         public function Main() {
  622.             physics=new PhysInjector(stage,new b2Vec2(0,10),true);
  623.             var floor:Sprite = new Sprite();
  624.             floor.graphics.beginFill(0x000000);
  625.             floor.graphics.drawRect(0,0,640,20);
  626.             floor.graphics.endFill();
  627.             floor.x=0;
  628.             floor.y=460;
  629.             addChild(floor);
  630.             var box2dFloor:PhysicsObject=physics.injectPhysics(floor,PhysInjector.SQUARE,new PhysicsProperties({isDynamic:false,friction:0.5,restitution:0.5}));
  631.             addEventListener(Event.ENTER_FRAME,update);
  632.             stage.addEventListener(MouseEvent.CLICK,addBox);
  633.         }
  634.         private function addBox(e:MouseEvent):void {
  635.             var box:Sprite = new Sprite();
  636.             box.graphics.beginFill(0x000000);
  637.             box.graphics.drawRect(0,0,50,50);
  638.             box.graphics.endFill();
  639.             box.x=mouseX-25;
  640.             box.y=mouseY-25;
  641.             addChild(box);
  642.             var box2dBox:PhysicsObject=physics.injectPhysics(box,PhysInjector.SQUARE,new PhysicsProperties({isDynamic:true,friction:0.2,restitution:0.5}));
  643.         }
  644.         private function update(event:Event):void {
  645.             physics.update();
  646.         }
  647.     }
  648. }
  649.  
  650. -------------------------------------------------------
  651. -------------------------------------------------------
  652. -------------------------------------------------------
  653. -------------------------------------------------------
  654.  
  655. package {
  656.     import flash.display.Shape;
  657.     import flash.geom.Point;
  658.     import flash.events.MouseEvent;
  659.     import flash.display.BitmapData;
  660.     import flash.display.Bitmap;
  661.     import flash.display.Sprite;
  662.  
  663.     //CLICK ON 2 BLACK TILES TO PATHFIND BETWEEN THEM!
  664.     public class Main extends Sprite {
  665.         //Maze should always be an odd-number of tiles! (eg. 9x9, 33x15, etc.)
  666.         public const MAZE_WIDTH:int=31;
  667.         public const MAZE_HEIGHT:int=23;
  668.         public const MAZE_SCALE:Number=20;
  669.  
  670.         //Directional constants
  671.         public const ILLEGAL:int=0;
  672.         public const OPEN:int=1;
  673.         public const RIGHT:uint=2;
  674.         public const LEFT:uint=3;
  675.         public const DOWN:uint=4;
  676.         public const UP:uint=5;
  677.  
  678.         public var closed:BitmapData=new BitmapData(MAZE_WIDTH,MAZE_HEIGHT,false,0);
  679.         public var data:BitmapData=new BitmapData(MAZE_WIDTH,MAZE_HEIGHT,false,0xFFFFFF);
  680.         public var bitmap:Bitmap=new Bitmap(data);
  681.  
  682.         public var start:Point;
  683.         public var end:Point;
  684.         public var pathShape:Shape = new Shape();
  685.  
  686.         public function Main() {
  687.             x=10;
  688.             y=10;
  689.             bitmap.scaleX=bitmap.scaleY=MAZE_SCALE;
  690.             addChild(bitmap);
  691.  
  692.             pathShape.scaleX=pathShape.scaleY=MAZE_SCALE;
  693.             pathShape.x=pathShape.y=MAZE_SCALE/2;
  694.             addChild(pathShape);
  695.  
  696.             generateMaze();
  697.             stage.addEventListener(MouseEvent.CLICK, onClick);
  698.         }
  699.  
  700.         public function onClick(e:MouseEvent):void {
  701.             start=end;
  702.             end = new Point(int(mouseX / MAZE_SCALE), int(mouseY / MAZE_SCALE));
  703.  
  704.             if (start != null) {
  705.                 pathShape.graphics.clear();
  706.                 pathShape.graphics.beginFill(0xFF0000);
  707.                 pathShape.graphics.drawCircle(start.x, start.y, 0.25);
  708.                 pathShape.graphics.drawCircle(end.x, end.y, 0.25);
  709.                 pathShape.graphics.endFill();
  710.                 pathShape.graphics.lineStyle(0, 0xFF0000);
  711.  
  712.                 var path:Array=pathfind(start,end);
  713.                 if (path != null && path.length > 1) {
  714.                     pathShape.graphics.moveTo(path[0].x, path[0].y);
  715.                     for (var i:int = 1; i < path.length; i++) {
  716.                         pathShape.graphics.lineTo(path[i].x, path[i].y);
  717.                     }
  718.                 }
  719.             }
  720.         }
  721.  
  722.         public function pathfind(start:Point, end:Point):Array {
  723.             if (! getTile(start.x,start.y)&&! getTile(end.x,end.y)) {
  724.                 closed.fillRect(closed.rect, 0xFF000000 | OPEN);
  725.                 setClosed(start.x, start.y, ILLEGAL);
  726.  
  727.                 var x:int;
  728.                 var y:int;
  729.                 var xQueue:Array=[];
  730.                 var yQueue:Array=[];
  731.                 xQueue.push(start.x);
  732.                 yQueue.push(start.y);
  733.  
  734.                 while (xQueue.length > 0) {
  735.                     x=xQueue.shift();
  736.                     y=yQueue.shift();
  737.  
  738.                     if (x == end.x && y == end.y) {
  739.                         var path:Array=[];
  740.                         var tile:int=getClosed(x,y);
  741.                         while (tile != ILLEGAL) {
  742.                             path.push(new Point(x, y));
  743.                             switch (tile) {
  744.                                 case RIGHT :
  745.                                     x++;
  746.                                     break;
  747.                                 case LEFT :
  748.                                     x--;
  749.                                     break;
  750.                                 case DOWN :
  751.                                     y++;
  752.                                     break;
  753.                                 case UP :
  754.                                     y--;
  755.                                     break;
  756.                             }
  757.                             tile=getClosed(x,y);
  758.                         }
  759.                         path.push(new Point(x, y));
  760.                         return path.reverse();
  761.                     }
  762.                     else {
  763.                         if (getClosed(x + 1, y) == OPEN && !getTile(x + 1, y)) {
  764.                             setClosed(x + 1, y, LEFT);
  765.                             xQueue.push(x + 1);
  766.                             yQueue.push(y);
  767.                         }
  768.                         if (getClosed(x - 1, y) == OPEN && !getTile(x - 1, y)) {
  769.                             setClosed(x - 1, y, RIGHT);
  770.                             xQueue.push(x - 1);
  771.                             yQueue.push(y);
  772.                         }
  773.                         if (getClosed(x, y + 1) == OPEN && !getTile(x, y + 1)) {
  774.                             setClosed(x, y + 1, UP);
  775.                             xQueue.push(x);
  776.                             yQueue.push(y + 1);
  777.                         }
  778.                         if (getClosed(x, y - 1) == OPEN && !getTile(x, y - 1)) {
  779.                             setClosed(x, y - 1, DOWN);
  780.                             xQueue.push(x);
  781.                             yQueue.push(y - 1);
  782.                         }
  783.                     }
  784.                 }
  785.             }
  786.  
  787.             return null;
  788.         }
  789.  
  790.         public function generateMaze():void {
  791.             var xStack:Array=[];
  792.             var yStack:Array=[];
  793.             var sides:Array=[];
  794.  
  795.             data.fillRect(data.rect, 0xFFFFFFFF);
  796.  
  797.             //Pick random start point
  798.             var x:int=1+int(Math.random()*(MAZE_WIDTH/2))*2;
  799.             var y:int=1+int(Math.random()*(MAZE_HEIGHT/2))*2;
  800.             xStack.push(x);
  801.             yStack.push(y);
  802.  
  803.             //Maze generation loop
  804.             while (xStack.length > 0) {
  805.                 x=xStack[xStack.length-1];
  806.                 y=yStack[yStack.length-1];
  807.                 sides.length=0;
  808.  
  809.                 if (getTile(x + 2, y)) {
  810.                     sides.push(RIGHT);
  811.                 }
  812.                 if (getTile(x - 2, y)) {
  813.                     sides.push(LEFT);
  814.                 }
  815.                 if (getTile(x,y+2)) {
  816.                     sides.push(DOWN);
  817.                 }
  818.                 if (getTile(x,y-2)) {
  819.                     sides.push(UP);
  820.                 }
  821.  
  822.                 if (sides.length>0) {
  823.                     var side:int=sides[int(Math.random()*sides.length)];
  824.                     switch (side) {
  825.                         case RIGHT :
  826.                             setTile(x + 1, y, false);
  827.                             setTile(x + 2, y, false);
  828.                             xStack.push(x + 2);
  829.                             yStack.push(y);
  830.                             break;
  831.                         case LEFT :
  832.                             setTile(x - 1, y, false);
  833.                             setTile(x - 2, y, false);
  834.                             xStack.push(x - 2);
  835.                             yStack.push(y);
  836.                             break;
  837.                         case DOWN :
  838.                             setTile(x, y + 1, false);
  839.                             setTile(x, y + 2, false);
  840.                             xStack.push(x);
  841.                             yStack.push(y + 2);
  842.                             break;
  843.                         case UP :
  844.                             setTile(x, y - 1, false);
  845.                             setTile(x, y - 2, false);
  846.                             xStack.push(x);
  847.                             yStack.push(y - 2);
  848.                             break;
  849.                     }
  850.                 }
  851.                 else {
  852.                     xStack.pop();
  853.                     yStack.pop();
  854.                 }
  855.             }
  856.         }
  857.  
  858.         public function getTile(x:int, y:int):Boolean {
  859.             if (x < 0 || y < 0 || x >= MAZE_WIDTH || y >= MAZE_HEIGHT) {
  860.                 return false;
  861.             }
  862.             return data.getPixel(x, y) > 0x000000;
  863.         }
  864.  
  865.         public function setTile(x:int, y:int, solid:Boolean):void {
  866.             data.setPixel(x, y, solid ? 0xFFFFFF : 0x000000);
  867.         }
  868.  
  869.         public function getClosed(x:int, y:int):int {
  870.             if (x < 0 || y < 0 || x >= MAZE_WIDTH || y >= MAZE_HEIGHT) {
  871.                 return ILLEGAL;
  872.             }
  873.             return closed.getPixel(x, y);
  874.         }
  875.  
  876.         public function setClosed(x:int, y:int, value:int):void {
  877.             closed.setPixel(x, y, value);
  878.         }
  879.     }
  880. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement