本篇对Direction类的方法属性和Dot的更新部分讲解。<br /><br />关于该例子的教程请关注第九篇笔记!<br />即将出Direction类与Dot类的实战使用教程,本篇只对Direction类的方法属性和Dot的更新部分讲解<br /><br />首先是<br />index.base.game.Direction类<br />作用:控制飞机游戏,坦克游戏,或者一些和方向有关的方向按键操作<br /><br />构造函数:<br />public function Direction(_area:InteractiveObject,isSole:Boolean = false,_up:uint = 38,_down:uint = 40,_left:uint = 37,_right:uint = 39)<br />参数一:方向键的作用区域,如果_area当前不是焦点,那么是侦听不到键盘事件的,一般这儿都是使用Stage做为作用区域<br />参数二:是否为单向事件触发,如果为false,那么按了什么键就是什么,可以同时触发上和左等两个或者两个以上的事件,反之以最后按的那个键为准<br />参数三,四,五,六:按键的键值,默认为38,40,37,39,分别是方向键的上下左右!<br /><br />start方法:<br />public function start():void<br />开始捕获事件,当触发构造函数,将自动执行start方法<br /><br />stop方法:<br />public function stop():void<br />停止捕获事件<br /><br />setKey方法:<br />public function setKey(num:uint,vars:uint):void<br />设置按键键值<br />参数一:方向键标识,请参考该类的常量属性<br />参数二:按键键值<br /><br />常量属性:<br />public static const UP:uint = 0;<br />public static const DOWN:uint = 1;<br />public static const LEFT:uint = 2;<br />public static const RIGHT:uint = 3;<br />分别代表:上下左右的方向键标识<br /><br />clear方法:<br />public function clear():void<br />清除所有方向记录<br /><br />area属性:<br />public var area:InteractiveObject<br />返回作用区域<br /><br />sole属性:<br />public var sole:Boolean<br />返回是否单向操作<br /><br />DirectionEvent.DO事件:<br />当有方向键是按下去的时候,则会发布事件,事件中含有up,down,left,right,4个属性,分别表示哪几个键是按下去的!<br /><br />========== 气 死 你 的 分 割 线 ==========<br /><br />Dot类在前面的整理笔记中,曾经说过,这次是更新类的方法和属性<br />增加了旋转属性,并且可以计算当前方向的某距离后的点<br /><br />以下只对更新的方法和属性进行讲解:其他的请看老的整理笔记:<br /><br />go方法:<br />public function go(num:Number,isChange:Boolean = false) ot<br />参数一,表示面向旋转方向前进多少的距离<br />参数二,表示是否也跟新该点基于num变化之后的点坐标<br /><br />clear方法:<br />public function clear():void<br />清空绑定对象的引用<br /><br />r 属性:<br />public function set r(num:Number):void<br />public function get r():Number<br />旋转属性的设置,如果isListener值为真,则改变旋转值会触发R_CHANGE的事件<br /><br />Direction类源代码:<br /><br />CODE:<br />package index.base.game{<br /> <br /> import flash.events.EventDispatcher;<br /> import flash.events.KeyboardEvent;<br /> import flash.events.Event;<br /> import flash.display.InteractiveObject;<br /> <br /> import index.base.events.DirectionEvent;<br /> <br /> public class Direction extends EventDispatcher{<br /> <br /> //方向表示<br /> public static const UP:uint = 0;<br /> public static const DOWN:uint = 1;<br /> public static const LEFT:uint = 2;<br /> public static const RIGHT:uint = 3;<br /> <br /> //作用区域<br /> public var area:InteractiveObject;<br /> //是否单向<br /> public var sole:Boolean;<br /> <br /> //上下左右键值<br /> private const directionAr:Array = new Array(4);<br /> <br /> //是否上下左右<br /> private var _up:Boolean = false;<br /> private var _down:Boolean = false;<br /> private var _left:Boolean = false;<br /> private var _right:Boolean = false;<br /> <br /> public function Direction(_area:InteractiveObject,isSole:Boolean = false,_up:uint = 38,_down:uint = 40,_left:uint = 37,_right:uint = 39){<br /> area = _area;<br /> sole = isSole;<br /> directionAr[UP] = _up;<br /> directionAr[DOWN] = _down;<br /> directionAr[LEFT] = _left;<br /> directionAr[RIGHT] = _right;<br /> start();<br /> }<br /> <br /> //开始获取事件<br /> public function start():void{<br /> area.addEventListener(KeyboardEvent.KEY_DOWN,onKeyDown);<br /> area.addEventListener(KeyboardEvent.KEY_UP,onKeyUp);<br /> area.addEventListener(Event.ENTER_FRAME,onEnterFrame);<br /> }<br /> <br /> //事件帧频繁触发<br /> private function onEnterFrame(e:Event):void{<br /> var num:uint = Number(_up) + Number(_down) + Number(_left) + Number(_right);<br /> if(num == 0){<br /> return;<br /> }<br /> <br /> var eve irectionEvent = new DirectionEvent(DirectionEvent.DO);<br /> eve.up = _up;<br /> eve.down = _down;<br /> eve.left = _left;<br /> eve.right = _right;<br /> dispatchEvent(eve);<br /> }<br /> <br /> //停止获取事件<br /> public function stop():void{<br /> area.removeEventListener(KeyboardEvent.KEY_DOWN,onKeyDown);<br /> area.removeEventListener(KeyboardEvent.KEY_UP,onKeyUp);<br /> area.removeEventListener(Event.ENTER_FRAME,onEnterFrame);<br /> }<br /> <br /> //鼠标按下去事件<br /> private function onKeyDown(e:KeyboardEvent):void{<br /> key(e.keyCode,true)<br /> }<br /> <br /> //鼠标弹上来事件<br /> private function onKeyUp(e:KeyboardEvent):void{<br /> key(e.keyCode,false)<br /> }<br /> <br /> //变化状态<br /> private function key(num:uint,isDown:Boolean):void{<br /> switch(num){<br /> case directionAr[UP]:<br /> if(sole) clear();<br /> _up = isDown;<br /> break;<br /> case directionAr[DOWN]:<br /> if(sole) clear();<br /> _down = isDown;<br /> break;<br /> case directionAr[LEFT]:<br /> if(sole) clear();<br /> _left = isDown;<br /> break;<br /> case directionAr[RIGHT]:<br /> if(sole) clear();<br /> _right = isDown;<br /> break;<br /> }<br /> }<br /> <br /> //设置按钮<br /> public function setKey(num:uint,vars:uint):void{<br /> directionAr[num] = vars;<br /> }<br /> <br /> //清空按键<br /> public function clear():void{<br /> _up = _down = _left = _right = false;<br /> }<br /> }<br />}<br />Dot类源代码:<br /><br />CODE:<br />package index.base.geom{<br /> <br /> import flash.events.EventDispatcher;<br /> import flash.display.DisplayObject;<br /> <br /> import index.base.events.DotEvent;<br /> <br /> public class Dot extends EventDispatcher{<br /> <br /> private var _x:Number;<br /> private var _y:Number;<br /> private var _r:Number;<br /> private var dis isplayObject;<br /> <br /> public var isListen:Boolean;<br /> <br /> public function Dot(x_:Number = 0,y_:Number = 0,r_:Number = 0,_isListen:Boolean = false){<br /> _x = x_;<br /> _y = y_;<br /> _r = r_;<br /> isListen = _isListen;<br /> }<br /> <br /> //绑定DisplayObject<br /> public function bind(_dis isplayObject,isInTime:Boolean = false):void{<br /> dis = _dis;<br /> updata();<br /> if(isInTime) dis.addEventListener("enterFrame",enterFrameFun);<br /> }<br /> <br /> //帧频繁事件<br /> private function enterFrameFun(e:Object):void{<br /> if(_x != dis.x) x = dis.x;<br /> if(_y != dis.y) y = dis.y;<br /> if(_r != dis.rotation) r = dis.rotation;<br /> }<br /> <br /> //更新xy数据<br /> public function updata():void{<br /> if(dis != null){<br /> _x = dis.x;<br /> _y = dis.y;<br /> _r = dis.rotation;<br /> }<br /> }<br /> <br /> //计算该点向R方向前进某距离后的点<br /> public function go(num:Number,isChange:Boolean = false) ot{<br /> updata();<br /> var yx:Number = Math.tan(_r * Math.PI / 180);<br /> var tmpx:Number = num / Math.sqrt(Math.pow(yx,2) + 1);<br /> var tmpy:Number = tmpx * yx;<br /> var n:int = Number(Math.abs(_r) <= 90) * 2 - 1;<br /> var dot ot = new Dot(_x + tmpx * n,_y + tmpy * n,_r);<br /> if(isChange){<br /> x = dot.x;<br /> y = dot.y;<br /> }<br /> return dot;<br /> }<br /> <br /> //计算该点与另外一点的距离<br /> public function from(_dot ot,isQuadrant:Boolean = false):Number{<br /> updata();<br /> var num:Number = Math.sqrt(Math.pow(_dot.x - _x,2) + Math.pow(_dot.y - _y,2));<br /> if(!isQuadrant) num = Math.abs(num);<br /> return num;<br /> }<br /> <br /> //计算该点与另外一点所形成的线段与水平线的夹角,按顺时间计算<br /> public function angle(_dot ot,isRadian:Boolean = false):Number{<br /> updata();<br /> var numx:Number = _dot.x - _x;<br /> var numy:Number = _dot.y - _y;<br /> var num:Number = Math.atan(numy/numx);<br /> if(!isRadian) num = num * 180 / Math.PI;<br /> return num;<br /> }<br /> <br /> //返回当前点处在另外一点的哪个象限中 或 返回另外一点处在当前点的哪个象限中<br /> public function quadrant(_dot ot,isMaster:Boolean = true):int{<br /> updata();<br /> if(_x == _dot.x || _y == _dot.y){<br /> return 0;<br /> }<br /> <br /> var num:int;<br /> var p1:Boolean = (_x - _dot.x) > 0;<br /> var p2:Boolean = (_y - _dot.y) > 0;<br /> num = isMaster ? (p1 ? (p2 ? 2 : 3) : (p2 ? 1 : 4)) : (p1 ? (p2 ? 4 : 1) : (p2 ? 3 : 2));<br /> <br /> return num;<br /> }<br /> <br /> //返回该点距0点的距离<br /> public function get length():Number{<br /> updata();<br /> var num:Number = Math.sqrt(Math.pow(_x,2) + Math.pow(_y,2));<br /> return num;<br /> }<br /> <br /> //清除显示对象<br /> public function clear():void{<br /> dis = null;<br /> }<br /> <br /> //改变旋转值<br /> public function set r(num:Number):void{<br /> _r = num;<br /> if(dis != null) dis.rotation = num;<br /> if(isListen) dispatchEvent(new DotEvent(DotEvent.R_CHANGE,true));<br /> }<br /> <br /> //改变旋转值<br /> public function get r():Number{<br /> updata();<br /> return _r;<br /> }<br /> <br /> //改变X坐标<br /> public function set x(num:Number):void{<br /> _x = num;<br /> if(dis != null) dis.x = num;<br /> if(isListen) dispatchEvent(new DotEvent(DotEvent.X_CHANGE,true));<br /> }<br /> <br /> //设置X坐标<br /> public function get x():Number{<br /> updata();<br /> return _x;<br /> }<br /> <br /> //改变Y坐标<br /> public function set y(num:Number):void{<br /> _y = num;<br /> if(dis != null) dis.y = num;<br /> if(isListen) dispatchEvent(new DotEvent(DotEvent.Y_CHANGE,true));<br /> }<br /> <br /> //设置Y坐标<br /> public function get y():Number{<br /> updata();<br /> return _y;<br /> }<br /> }<br />}<br /><br /><blockquote class="blockquote">From: http://www.photoep.cn/read.php?tid=101 Powered by PHPWind.com</blockquote> |