loadin Do…

一条只能往前走的路,叫时光.

首页 联系 订阅 管理

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

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

转:xiaos8
posted on 2008-04-07 15:05  i'am sl  阅读(371)  评论(0)    收藏  举报