查看: 1027|回复: 0

Flash AS3教程:Direction类和Dot类(1)

[复制链接]
发表于 2009-5-15 02:05:06 | 显示全部楼层 |阅读模式
本篇对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 eveirectionEvent = 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 disisplayObject;<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(_disisplayObject,isInTime:Boolean = false):void{<br />                        dis = _dis;<br />                        updata();<br />                        if(isInTime) dis.addEventListener(&quot;enterFrame&quot;,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) &lt;= 90) * 2 - 1;<br />                        var dotot = 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(_dotot,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(_dotot,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(_dotot,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) &gt; 0;<br />                        var p2:Boolean = (_y - _dot.y) &gt; 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>
回复

使用道具 举报

本版积分规则

关注公众号

相关侵权、举报、投诉及建议等,请发 E-mail:admin@discuz.vip

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖
关注公众号
QQ客服返回顶部