Flash AS3教程:Direction類和Dot類
關(guān)于該例子的教程請(qǐng)關(guān)注第九篇筆記!
即將出Direction類與Dot類的實(shí)戰(zhàn)使用教程,本篇只對(duì)Direction類的方法屬性和Dot的更新部分講解
首先是
index.base.game.Direction類
作用:控制飛機(jī)游戲,坦克游戲,或者一些和方向有關(guān)的方向按鍵操作
構(gòu)造函數(shù):
public function Direction(_area:InteractiveObject,isSole:Boolean = false,_up:uint = 38,_down:uint = 40,_left:uint = 37,_right:uint = 39)
參數(shù)一:方向鍵的作用區(qū)域,如果_area當(dāng)前不是焦點(diǎn),那么是偵聽不到鍵盤事件的,一般這兒都是使用Stage做為作用區(qū)域
參數(shù)二:是否為單向事件觸發(fā),如果為false,那么按了什么鍵就是什么,可以同時(shí)觸發(fā)上和左等兩個(gè)或者兩個(gè)以上的事件,反之以最后按的那個(gè)鍵為準(zhǔn)
參數(shù)三,四,五,六:按鍵的鍵值,默認(rèn)為38,40,37,39,分別是方向鍵的上下左右!
start方法:
public function start():void
開始捕獲事件,當(dāng)觸發(fā)構(gòu)造函數(shù),將自動(dòng)執(zhí)行start方法
stop方法:
public function stop():void
停止捕獲事件
setKey方法:
public function setKey(num:uint,vars:uint):void
設(shè)置按鍵鍵值
參數(shù)一:方向鍵標(biāo)識(shí),請(qǐng)參考該類的常量屬性
參數(shù)二:按鍵鍵值
常量屬性:
public static const UP:uint = 0;
public static const DOWN:uint = 1;
public static const LEFT:uint = 2;
public static const RIGHT:uint = 3;
分別代表:上下左右的方向鍵標(biāo)識(shí)
clear方法:
public function clear():void
清除所有方向記錄
area屬性:
public var area:InteractiveObject
返回作用區(qū)域
sole屬性:
public var sole:Boolean
返回是否單向操作
DirectionEvent.DO事件:
當(dāng)有方向鍵是按下去的時(shí)候,則會(huì)發(fā)布事件,事件中含有up,down,left,right,4個(gè)屬性,分別表示哪幾個(gè)鍵是按下去的!
========== 氣 死 你 的 分 割 線 ==========
Dot類在前面的整理筆記中,曾經(jīng)說過,這次是更新類的方法和屬性
增加了旋轉(zhuǎn)屬性,并且可以計(jì)算當(dāng)前方向的某距離后的點(diǎn)
以下只對(duì)更新的方法和屬性進(jìn)行講解:其他的請(qǐng)看老的整理筆記:
go方法:
public function go(num:Number,isChange:Boolean = false):Dot
參數(shù)一,表示面向旋轉(zhuǎn)方向前進(jìn)多少的距離
參數(shù)二,表示是否也跟新該點(diǎn)基于num變化之后的點(diǎn)坐標(biāo)
clear方法:
public function clear():void
清空綁定對(duì)象的引用
r 屬性:
public function set r(num:Number):void
public function get r():Number
旋轉(zhuǎn)屬性的設(shè)置,如果isListener值為真,則改變旋轉(zhuǎn)值會(huì)觸發(fā)R_CHANGE的事件
Direction類源代碼:
CODE:
package index.base.game{Dot類源代碼:
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;
//作用區(qū)域
public var area:InteractiveObject;
//是否單向
public var sole:Boolean;
//上下左右鍵值
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,isSole:Boolean = false,_up:uint = 38,_down:uint = 40,_left:uint = 37,_right:uint = 39){
area = _area;
sole = isSole;
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);
}
//事件幀頻繁觸發(fā)
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);
area.removeEventListener(Event.ENTER_FRAME,onEnterFrame);
}
//鼠標(biāo)按下去事件
private function onKeyDown(e:KeyboardEvent):void{
key(e.keyCode,true)
}
//鼠標(biāo)彈上來事件
private function onKeyUp(e:KeyboardEvent):void{
key(e.keyCode,false)
}
//變化狀態(tài)
private function key(num:uint,isDown:Boolean):void{
switch(num){
case directionAr[UP]:
if(sole) clear();
_up = isDown;
break;
case directionAr[DOWN]:
if(sole) clear();
_down = isDown;
break;
case directionAr[LEFT]:
if(sole) clear();
_left = isDown;
break;
case directionAr[RIGHT]:
if(sole) clear();
_right = isDown;
break;
}
}
//設(shè)置按鈕
public function setKey(num:uint,vars:uint):void{
directionAr[num] = vars;
}
//清空按鍵
public function clear():void{
_up = _down = _left = _right = false;
}
}
}
CODE:
package index.base.geom{
import flash.events.EventDispatcher;
import flash.display.DisplayObject;
import index.base.events.DotEvent;
public class Dot extends EventDispatcher{
private var _x:Number;
private var _y:Number;
private var _r:Number;
private var dis:DisplayObject;
public var isListen:Boolean;
public function Dot(x_:Number = 0,y_:Number = 0,r_:Number = 0,_isListen:Boolean = false){
_x = x_;
_y = y_;
_r = r_;
isListen = _isListen;
}
//綁定DisplayObject
public function bind(_dis:DisplayObject,isInTime:Boolean = false):void{
dis = _dis;
updata();
if(isInTime) dis.addEventListener("enterFrame",enterFrameFun);
}
//幀頻繁事件
private function enterFrameFun(e:Object):void{
if(_x != dis.x) x = dis.x;
if(_y != dis.y) y = dis.y;
if(_r != dis.rotation) r = dis.rotation;
}
//更新xy數(shù)據(jù)
public function updata():void{
if(dis != null){
_x = dis.x;
_y = dis.y;
_r = dis.rotation;
}
}
//計(jì)算該點(diǎn)向R方向前進(jìn)某距離后的點(diǎn)
public function go(num:Number,isChange:Boolean = false):Dot{
updata();
var yx:Number = Math.tan(_r * Math.PI / 180);
var tmpx:Number = num / Math.sqrt(Math.pow(yx,2) 1);
var tmpy:Number = tmpx * yx;
var n:int = Number(Math.abs(_r) <= 90) * 2 - 1;
var dot:Dot = new Dot(_x tmpx * n,_y tmpy * n,_r);
if(isChange){
x = dot.x;
y = dot.y;
}
return dot;
}
//計(jì)算該點(diǎn)與另外一點(diǎn)的距離
public function from(_dot:Dot,isQuadrant:Boolean = false):Number{
updata();
var num:Number = Math.sqrt(Math.pow(_dot.x - _x,2) Math.pow(_dot.y - _y,2));
if(!isQuadrant) num = Math.abs(num);
return num;
}
//計(jì)算該點(diǎn)與另外一點(diǎn)所形成的線段與水平線的夾角,按順時(shí)間計(jì)算
public function angle(_dot:Dot,isRadian:Boolean = false):Number{
updata();
var numx:Number = _dot.x - _x;
var numy:Number = _dot.y - _y;
var num:Number = Math.atan(numy/numx);
if(!isRadian) num = num * 180 / Math.PI;
return num;
}
//返回當(dāng)前點(diǎn)處在另外一點(diǎn)的哪個(gè)象限中 或 返回另外一點(diǎn)處在當(dāng)前點(diǎn)的哪個(gè)象限中
public function quadrant(_dot:Dot,isMaster:Boolean = true):int{
updata();
if(_x == _dot.x || _y == _dot.y){
return 0;
}
var num:int;
var p1:Boolean = (_x - _dot.x) > 0;
var p2:Boolean = (_y - _dot.y) > 0;
num = isMaster ? (p1 ? (p2 ? 2 : 3) : (p2 ? 1 : 4)) : (p1 ? (p2 ? 4 : 1) : (p2 ? 3 : 2));
return num;
}
//返回該點(diǎn)距0點(diǎn)的距離
public function get length():Number{
updata();
var num:Number = Math.sqrt(Math.pow(_x,2) Math.pow(_y,2));
return num;
}
//清除顯示對(duì)象
public function clear():void{
dis = null;
}
//改變旋轉(zhuǎn)值
public function set r(num:Number):void{
_r = num;
if(dis != null) dis.rotation = num;
if(isListen) dispatchEvent(new DotEvent(DotEvent.R_CHANGE,true));
}
//改變旋轉(zhuǎn)值
public function get r():Number{
updata();
return _r;
}
//改變X坐標(biāo)
public function set x(num:Number):void{
_x = num;
if(dis != null) dis.x = num;
if(isListen) dispatchEvent(new DotEvent(DotEvent.X_CHANGE,true));
}
//設(shè)置X坐標(biāo)
public function get x():Number{
updata();
return _x;
}
//改變Y坐標(biāo)
public function set y(num:Number):void{
_y = num;
if(dis != null) dis.y = num;
if(isListen) dispatchEvent(new DotEvent(DotEvent.Y_CHANGE,true));
}
//設(shè)置Y坐標(biāo)
public function get y():Number{
updata();
return _y;
}
}
}
相關(guān)文章

flash cs6鼠標(biāo)跟隨效果實(shí)現(xiàn)代碼分享
flash cs6想要實(shí)現(xiàn)鼠標(biāo)跟隨效果?該怎么制作呢?今天我們就來看看使用as2.0實(shí)現(xiàn)鼠標(biāo)跟隨效果的教程,需要的朋友可以參考下2019-05-19
Flash cs6怎么使用代碼輸入中英文文本?Flash cs6中可以使用文字工具直接輸入文本,也可以使用代碼來輸入文本,該怎么使用代碼輸入文本呢?請(qǐng)看下文詳細(xì)的教程,需要的朋友2018-03-11
flash as3.0抽象類怎么定義? as3.0中有很多抽象類,該怎么定義抽象類和抽象方法呢?下面我們就來看看簡(jiǎn)單的例子,需要的朋友可以參考下http://m.fzitv.net/softs/408402.2018-02-28
flash cs6中怎么使用ActionScript3.0?
flash cs6中怎么使用ActionScript3.0?flash cs6中想要使用ActionScript3.0功能,該怎么使用呢?下面我們就來看看詳細(xì)的教程,需要的朋友可以參考下2018-01-25
Flash中怎么實(shí)現(xiàn)鼠標(biāo)點(diǎn)擊決定圖像位置?
本教程給大家分享一個(gè)Flash小教程,教大家在Flash CS6中怎么實(shí)現(xiàn)鼠標(biāo)點(diǎn)擊決定圖像位置?方法很簡(jiǎn)單,感興趣的朋友歡迎前來一起分享學(xué)習(xí)2018-01-12
Flash中如何用代碼將圖片放在自己想要的舞臺(tái)位置?
本教程教腳本之家的ActionScript教程學(xué)習(xí)者在Flash中如何用代碼將圖片放在自己想要的舞臺(tái)位置,教程講解的詳細(xì),感興趣的朋友歡迎前來分享學(xué)習(xí)2017-11-20
在Flash CS6中使用with函數(shù)繪制背景圖教程
本教程教腳本之家的ActionScript教程學(xué)習(xí)者如何在Flash CS6中使用with函數(shù)繪制背景圖?教程一步步講解的挺詳細(xì),方法也不難,非常適合Flash新手入門學(xué)習(xí)2017-11-18
Flash怎么設(shè)置元件坐標(biāo)?flash使用代碼設(shè)置元件的坐標(biāo)的教程
Flash怎么設(shè)置元件坐標(biāo)?flash中導(dǎo)如的元件需要添加坐標(biāo),該怎么定位元件坐標(biāo)呢?下面我們就來看看flash使用代碼設(shè)置元件的坐標(biāo)的教程,需要的朋友可以參考下2017-10-11
Flash怎么制作來回?fù)u擺的花朵的動(dòng)畫?
Flash怎么制作來回?fù)u擺的花朵的動(dòng)畫?Flash中想要給花朵制作一段搖擺的動(dòng)畫效果,該怎么制作呢?下面我們就來看看詳細(xì)的教程,很簡(jiǎn)單,需要的朋友可以參考下2017-05-23
Flash怎么制作流動(dòng)七彩色的文字?想要讓文字動(dòng)起來,該怎么使用flash給文字制作一個(gè)流動(dòng)七彩色的動(dòng)畫呢?下面我們就來看看詳細(xì)的教程,需要的朋友可以參考下2017-04-23











