做飞机游戏经常使用的方向控制类 Direction.as

Title

 

package index.base.game{

  

  import flash.events.EventDispatcher;

  import flash.events.KeyboardEvent;

  import flash.events.Event;

  import flash.display.InteractiveObject;

  

  import index.base.events.DirectionEvent;

  

  public class Direction extends EventDispatcher{

    

    //方向表示

    public static const UP:uint = 0;

    public static const DOWN:uint = 1;

    public static const LEFT:uint = 2;

    public static const RIGHT:uint = 3;

    

    //作用区域

    public var area:InteractiveObject;

    

    //上下左右键值

    private const directionAr:Array = new Array(4);

    

    //是否上下左右

    private var _up:Boolean = false;

    private var _down:Boolean = false;

    private var _left:Boolean = false;

    private var _right:Boolean = false;

    

    public function Direction(_area:InteractiveObject,_up:uint = 38,_down:uint = 40,_left:uint = 37,_right:uint = 39){

      area = _area;

      directionAr[UP] = _up;

      directionAr[DOWN] = _down;

      directionAr[LEFT] = _left;

      directionAr[RIGHT] = _right;

      start();

    }

    

    //开始获取事件

    public function start():void{

      area.addEventListener(KeyboardEvent.KEY_DOWN,onKeyDown);

      area.addEventListener(KeyboardEvent.KEY_UP,onKeyUp);

      

      area.addEventListener(Event.ENTER_FRAME,onEnterFrame);

    }

    

    //事件帧频繁触发

    private function onEnterFrame(e:Event):void{

      var num:uint = Number(_up) + Number(_down) + Number(_left) + Number(_right);

      if(num == 0){

        return;

      }

      

      var eve:DirectionEvent = new DirectionEvent(DirectionEvent.DO);

      eve.up = _up;

      eve.down = _down;

      eve.left = _left;

      eve.right = _right;

      dispatchEvent(eve);

    }

    

    //停止获取事件

    public function stop():void{

      area.removeEventListener(KeyboardEvent.KEY_DOWN,onKeyDown);

      area.removeEventListener(KeyboardEvent.KEY_UP,onKeyUp);

    }

    

    //鼠标按下去事件

    private function onKeyDown(e:KeyboardEvent):void{

      key(e.keyCode,true)

    }

    

    //鼠标弹上来事件

    private function onKeyUp(e:KeyboardEvent):void{

      key(e.keyCode,false)

    }

    

    //变化状态

    private function key(num:uint,isDown:Boolean):void{

      switch(num){

        case directionAr[UP]:

          _up = isDown;

        break;

        case directionAr[DOWN]:

          _down = isDown;

        break;

        case directionAr[LEFT]:

          _left = isDown;

        break;

        case directionAr[RIGHT]:

          _right = isDown;

        break;

      }

    }

    

    //设置按钮

    public function setKey(num:uint,vars:uint){

      directionAr[num] = vars;

    }

  }

}

 

 

DirectionEvent.as文件

 

Title

 

package index.base.events{

  

  import flash.events.Event;

  

  public class DirectionEvent extends Event{

    

    public var up:Boolean;

    public var down:Boolean;

    public var left:Boolean;

    public var right:Boolean;

    

    public static const DO:String = "do";

    

    public function DirectionEvent(type:String){

      super(type);

    }

  }

}

 

 

导入:

 

Title

 

import index.base.game.Direction;

import index.base.events.DirectionEvent;

new Direction(stage).addEventListener(DirectionEvent.DO,doFun);

function doFun(e:DirectionEvent){

  if(e.up) mc.y -= 5;

  if(e.down) mc.y += 5;

  if(e.left) mc.x -= 5;

  if(e.right) mc.x += 5;

}

 

 

初略讲解:

利用事件管理的特性,当点击向上键,则up的逻辑值为true,当松开向上键,则up的逻辑值为false,且只要存在一个true值,也就是说存在一个人按钮被按下去,就持续调度事件DirectionEvent.DO!

静态属性讲解:

文章一开始有UP,DOWN等大写字母表示的数字,这个是方便在使用setKey的时候,第一个参数可以直接填写Direction.UP,则表示修改up的键值

面对新手需要讲解的几个地方:

1、

    //事件帧频繁触发

    private function onEnterFrame(e:Event):void{

      var num:uint = Number(_up) + Number(_down) + Number(_left) + Number(_right);

      if(num == 0){

        return;

      }

      

      var eve:DirectionEvent = new DirectionEvent(DirectionEvent.DO);

      eve.up = _up;

      eve.down = _down;

      eve.left = _left;

      eve.right = _right;

      dispatchEvent(eve);

    }

上面这段代码,关于num值的获取,也许会有些人看不明白,其实意思就是把4个逻辑值强行转换为数字型,如果为false那么结果为0,如果4个都为false则加起来

num应该等于0,这就表明没有任何一个方向键按下,则return!不执行后面事件DirectionEvent.DO的调度

反之,不等于0,就说明必定有一个以上的按键按下,则调度事件!

2、

构造函数中使用了抽象类InteractiveObject

也就是说继承了InteractiveObject,或者间接继承了InteractiveObject,都可以作为方向的焦点

比如:Stage,Sprite,SimpleButton,Loader,MovieClip…………

效果地址:把焦点置于flash中,按键盘的上下左右方向键,就可以看到效果

http://www.xiaos8.com/uploads/pro/direction.swf

你可能感兴趣的:(游戏,Flash,UP)