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中,按键盘的上下左右方向键,就可以看到效果