flash重点积累

Flash/flex日常积累

1>>trace(square.mouseX, square.mouseY);相对于对象上的mouseX,相对于对象上的mouseY.

trace(event.localX,event.localY);事件相对于包含了事件发生点(Point)的sprite的点。

trace(event.stageX,event.stageY);事件发生时相对于整个stage的x,y.

trace(stage.mouseX,stage.mouseY);相对于stage的mousex,mousey.

Sprite.width,/height计算的时候是:应该是这样,从开始有东西的地方算起,到最后有东西的地方之间的宽度和高度,x,y不设定的话,默认是0,0;点。

就像算2条直线间的高度,中间可以有空白,只要两端有东西就可以。

只lineStyle的,有边框,中间也要填充透明色,不然也监听不了。

line.shapeChild.graphics.clear();

line.shapeChild.graphics.lineStyle(1,0x000000);//1

line.shapeChild.graphics.moveTo(beginPoint.x,beginPoint.y);//2

line.shapeChild.graphics.lineTo(arrowShape.x+1,arrowShape.y+1);//3

graphics.clear();把1.2.3的代码全部冲掉了。

 

2>>调整一个DisplayObject.rotation时,该对象的width,height也会变化.

DisplayObject.height指示显示对象的高度,以像素为单位。高度是根据显示对象内容的范围来计算的。如果您设置了 height 属性,则 scaleY 属性会相应调整。

 

3>>Math.atan2(y:Number, x:Number):Number

以弧度为单位计算并返回点 y/x 的角度,该角度从圆的 x 轴(0 点在其上,0 表示圆心)沿逆时针方向测量。返回值介于正 pi 和负 pi 之间。常常用来计算两个点之间与x轴(水平线)之间的角度。

例:跟随鼠标移动:

stage.addEventListener(MouseEvent.MOUSE_MOVE,stageClickHandler);

public function stageClickHandler(event:MouseEvent):void{

line.rotation = Math.atan2(stage.mouseY - line.y, stage.mouseX -

line.x) * 180 / Math.PI;

}

以A点位圆心,AB逆时针旋转到水平线经过的角度.

4>>关于旋转

结果:旋转MC的时候scaleX,scaleY都为1并没有发生变化,而width,height发生了变化.

转的时候计算的是一个外部的矩形,外部矩形变化,是MC的width,height变化,scaleX应该是计算的本身的,是getChild(x)的scaleX.而并非外部矩形(MC)的。

当你把一个shape放进一个sprite,一个空的sprite的width,height为0,装东西的时候会根据东西的width调整,紧接着放进一个UICOMPONET,那操作这个UICOMPOENT事例的时候

5>>关于MC和Shape

一个MC里可以有多个shape,如果想分别操作每个shape的话,可以分多个图层,每个图层上放单独的shape,操作的时候mc.getChildAt(0);例如:

trace(line.getChildAt(0))会输出Object Shape可以看出来时Shape类型的。

Falsh里的元件类型为图形的元件对应着flash.display.Shape的类型.

trace(line.getChildAt(0).name,line.getChildAt(1).name);;深度是按图层的顺序放的.实例名字为

Instance+给元件起的名字。

6>>关于enter_frame

ENTER_FRAME 其實默認情況下是多少幀,默认帧速度是 24,如果只有一个 enterframe事件在执行。一般都是 1秒执行20-30不等。每次速度不一样。如果很多个enterframe 速度会慢。

7>>arrow.graphics.moveTo(0, 0);//moveTo(x,y)相对于父显示对象注册点的水平位置,arrow.graphics是此显示对象的第一个child。

8>> stage.addEventListener(MouseEvent.MOUSE_MOVE,stageClickHandler);

              public function stageClickHandler(event:MouseEvent):void

              {

                     //trace(line.getChildAt(0).width);

                     //trace(line.getChildAt(0).name,line.getChildAt(1).name);

                     trace("stageMouseX对比:",stage.mouseY,stage.mouseX,"event.stageX对比                             ",event.stageY,event.stageX);//完全相同.

9>>旋转

arrow.rotation = Math.atan2(arrow.y - 90, arrow.x - 90) * 180 / Math.PI;

trace("角度:",arrow.rotation); 范围从-180 - 180。

 

10>>关于MOUSE_DOWN,MOUSE_UP,

两个事件都是在显示对象的范围内发生的。当mouse_down并拖到displayObject之外的时候,mouse_up的时候不会触发displayObject的mouse_up事件,由此看来这两个事件是定义在displayObject的范围内.只要鼠标一离开就不触发.

11>> target和currentTarget

currentTarget

用于定义处理该事件的事件侦听器的 Object。例如,如果您使用 myButton.addEventListener() 注册某个事件侦听器,则 myButton 为 currentTarget 的值。

target

调度该事件的 Object;它不一定是侦听该事件的 Object。使用 currentTarget 属性始终可以访问侦听事件的 Object。

     

简单说,target是事件的调用对象(event dispatcher),currentTarget是事件的处理对象(event processor)

12>>stage.displayState = StageDisplayState.FULL_SCREEN;  用这个全屏后不能 文本框里面不能输入数字了 只有退出全屏模式才能输入.

13>>.tabNavigator 样式设置
  {
  dropShadowEnabled: false;//控制阴影的,但默认就是false啊
  tabStyleName : tabBar;
  }
  .tabBar
  {
  borderColor : #ffffff;
  fillAlphas : 0, 0;
  themeColor : #ffffff;//这个颜色要与borderColor相同才不会有变化
  }

边框样式
TabNavigator {
  tabStyleName: "myTabs";
  firstTabStyleName: "myTabs";
  lastTabStyleName: "myTabs";
}
.myTabs {
  themeColor: #cccccc;
}
dropShadowEnabled 设置是否有阴影
指定组件是否具有可见投影的布尔值属性。此样式与 borderStyle="solid" 一起使用

14>>全屏撒:全凭模式只能用来看的,不支持键盘。AIR中支持键盘.

stage.displayState= stage.displayState==StageDisplayState.NORMAL?StageDisplayState.FULL_SCREEN:StageDisplayState.NORMAL;

15>>DataGrid他里面是按照总宽度的百分比 去分配列宽的,因为 总宽度 是一定的 一个列宽了 其他的也要损失一点宽度的。那你可以这样实现 ,如果列被拉宽了  总宽度也增加拉动的增量  如果显示不下就强制出现滚动条。

16>> override public function get columns():Array

    {

        return _columns.slice(0); //复制数组.

    } 

17>>强制回收内存:

(loader.contentLoaderInfo.content as Bitmap).bitmapData.dispose();

                try{

                    new LocalConnection().connect("foo");

                    new LocalConnection().connect("foo");

                }catch(error : Error){

                }

18>>S_eVent  21:15:58

BitmapData是存在一个bitmap的容器里面的

S_eVent  21:16:22

就像你透过一个天窗看天空,天上的云在动但是天窗是固定的

18>>移位运算

左移一位等于乘2,右移一位等于除2。

左移2位等于乘2的2次方,右移一位等于除2的2次方。

左移n位等于乘2的n次方,右移一位等于除2的n次方。

 

例如:

 

0000 1100  -- 10进制12

左移一位 0001 1000 -- 10进制24

右移一位 0000 0110 -- 10进制6

19>>systemManager:

我们只知道Flex 编译器在它生成和输入SWF文件时定义了这个连接,并定义了应用程序的SystemManger类作为SWF根部的MovieClip类,这就告诉了Flash Player在加载时构造SystemManger实例。

20>>

用户将指针设备移动到 InteractiveObject 实例上时调度。 事件目标为指针设备下的对象或该对象的父级。 relatedObject 是以前在指针设备下的对象。 在该对象的父级链以下连续调度 rollOver 事件,以除 relatedObject 的根或始祖之外的最高级别的父级开头,并以该对象结束。
 rollOver 事件的目的是简化带有子级的显示对象容器的移开行为的编码。 当鼠标离开显示对象区域或任何其子级区域并转到除其子级以外的对象时,显示对象调度 rollOver 事件。 这是与 mouseOver 事件行为不同的行为,因为该事件是在每次鼠标进入显示对象容器的任何子对象区域时才会被调度,即使鼠标已在显示对象容器的另一个子对象上也是如此。

 

    _spriteParent.addEventListener(MouseEvent.MOUSE_OVER, mouseHandler);

            _spriteParent.addEventListener(MouseEvent.MOUSE_OUT, mouseHandler);

            _spriteParent.addEventListener(MouseEvent.ROLL_OVER, mouseHandler);

            _spriteParent.addEventListener(MouseEvent.ROLL_OUT, mouseHandler);

经观察可以看到:显示对象有子级的时候,鼠标经过子容器或者父容器都只会触发一次rollOver事件,而鼠标进入父容器触发mouseOver事件,进入子对象又会触发mouseOver事件,触发了两次,这是个区别。mouseOut事件和mouseOver事件相同。

21>>一个游戏框架的三个基本模型:状态循环,游戏频率,事件模型。

22>>遮罩层必须有实心区域.

 

sp1.mask = sp2;

sp2 = new Sprite();

            sp2.graphics.lineStyle(1,0x000000);

            //sp2.graphics.beginFill(0xff0000);

            sp2.graphics.drawCircle(0, 0, 50);

            //sp2.graphics.endFill();

这样的代码是不起作用的,必须有实心区域。

被遮罩层和遮罩层都将不可见。被遮罩层也必须在显示列表里面,只是作为一个透视镜的存在,将不绘制自身。

23>>

var dx:Number = this.mouseX - spider.x;

            var dy:Number = this.mouseY - spider.y;

            var p:Number = Math.atan(dy / dx) * 180 / Math.PI;

           

            var rotateAngle:Number = (dx > 0)?(90 + p):(270 + p);

            trace(rotateAngle);

            //缓动

            spider.x += dx / speed;

            spider.y += dy / speed;

            spider.rotation = rotateAngle;

这样旋转是为了是为了一直保持 0-360的旋转,而不是-180 - 180的旋转。

-180 - 180的旋转  正负交替的话,rotation会 一会顺时针,一会逆时针,

24>>flash声音

应用程序可以从4个地方加载声音:

              运行时从外部声音文件里加载

              内嵌到SWF文件里的声音资源

              从连接到用户系统的麦克风上获取声音数据

              从远程多媒体服务器,比如Flash Media Server获取声音流

可以等到声音全部加载后再播放,也可以边加载边播放。

ActionScript 3.0和Flash Player支持以mp3格式存储的声音。它们不能直接加载或播放其他格式的声音,比如WAV或AIFF。

使用Adobe Flash CS3 Professional,可以导入WAV或AIFF格式的声音,然后就可以把它们以MP3的格式嵌入到SWF文件中。Flash开发工具可以压缩嵌入的声音文件以减少文件大小,不过这样需要以降低声音质量的代价。 更多信息查看 "Importing Sounds" in Using Flash.

25>>getChildAt(num--)先跑外层函数完了之后再 减减.

26>>数组的splice操作

var vegetables:Array = new Array("spinach",

                 "green pepper",

                 "cilantro",

                 "onion",

                 "avocado");

 

var spliced:Array = vegetables.splice(2, 2);

trace(vegetables); // spinach,green pepper,avocado

trace(spliced);    // cilantro,onion

 

trace(vegetables.splice(1, 0, spliced));//add one array

trace(vegetables,vegetables.length); // spinach,cilantro,onion,green pepper,avocado

trace(vegetables.splice(1, 0,"Hlello"));//add one element

trace(vegetables);

vegetables.splice(2);

trace(vegetables);

 

27>> flash builder4安装svn

http://hongyizung.blog.163.com/blog/static/632047652010111492235541/

28>>contentTextField.multiline = true;

    contentTextField.wordWrap = true;//多行并且自动换行.

Selectable = true;//可被选择

29>>textField.autoSize = TextFieldAutoSize.LEFT;这样设置后,再显示设置textField的宽和高不管用了就。

30>>textField.type = TextFieldType.INPUT;

    textField.multiline = true;//设置多行后,允许使用回车换行了。

_textField.wordWrap = true;

TextArea的实现。

31>>ti2 = new TextArea();

            ti2.width = 200;

//          ti2.height = 50;

            ti2.x = ti.width+10;

            ti2.textField.text = "大 字体";

            ti2.textField.setTextFormat(format1);

            ti2.updateSize();

这样手动调用一下updateSize();因为改变textField属性的时候没能触发updateSize()事件。

32>>类的实例化顺序:

简言之就是:

 

父类static变量----->子类static变量----->父类普通变量----->父类构造方法----->子类普通变量----->子类构造方法

33>>scrollRect 从来都是假设你的注册点在左上角。。

用于显示对象的一部分。类似遮罩。

_content.scrollRect = new Rectangle(x, y, rect.width, rect.height);

不断的赋值对象.scrollRect来做 滚动效果。比如:List组件的滚动.

34>>单独使用某个组件。

去CS工具里打开“组件”窗口,拖选你需要的组件到舞台上,此时就会看见库里面出现了几个元件,是你刚刚拖出来的组件,它已经自动帮你导出为Actionscript了,然后你去发布设置里勾选“导出为swc”,保存,测试影片,就会生成一个swc了,把这个swc编译到你的工程里面去就可以new出来这个组件了

35>>displayObject.root root属性是此 SWF 文件所表示的显示列表树结构部分中的顶级显示对象。即文档类。

36>>scrollV,scrollH 是不是在高度不随内容变化的textField才管用。。

垂直滚动的单位是行,而水平滚动的单位是像素。scrollV的意思是已滚动了多少行。。

bottomScrollV,textField当前看到的最后一行。

37>>SVN服务器上只放src目录,然后fb中import 从svn导入 选择 以后的项目,这样就能做到 只有svn下的目录跟服务器是同步的了。

38>>

我是经常使用cacheAsBitmap的,对于

cacheAsBitmap是有效的。我们觉得它没有效果,可能是因为把这个设置放在了动画上(动画是一直动的)

我不敢苟同。首先对于静止对象我首选自己转化bitmap,效果和cacheAsBitmap比优势非常明显。而动画对象才是资源消耗的大户,而这时自己转化bitmap显然是得不偿失的,所以我的做法是,静止对象自己转化bitmap,动画对象使用cacheAsBitmap(其实是有效果的)。

 

总之动画上不能用cacheAsBitmap... 转为bitmap我还没实验...

39>> 性能优化

不涉及鼠标交互和AddChild时使用Shape而不是Sprite和MovieClip,只在需要时间轴动画时用MovieClip.

用完的事件侦听及时删除,如果不知道什么时候删除,想让它闲置时自动删除就使用弱引用

遍历数组时不要频繁地计算数组长度:

如for(var i:int=0; i<ary.length; i++)这样不好,在进入数组前算好数组长度比较好

对数组操作不要频繁push,使用赋值比较好ary[i] = sp;

需要渲染多个图像时用bitmap,不要给舞台上添加多个Sprite或者Movieclip

对于没有动画的元件,请用cacheAsBitmap = true为它设置位图缓存

如果只是改变x,y,Flash不会重复建立位图缓存,对于改变rotation旋转,改变长宽则会重新建立位图缓存

不要频繁remove,addChild,若是暂时叫它消失,请用visible = false

尽可能地多使用位运算符 <<, >>, &, |

滤镜比较耗CPU,不要多用

做动画使用块传输技术,摒弃时间轴能大幅提高效率:
http://bbs.9ria.com/thread-45893-1-1.html

就是不要用CS工具在每一帧都加一个动画图片,改用Bitmap在每一帧或者每一个时间段改变其bitmapData来做这就实现了摈弃MovieClip,使用高效的bitmap来做

高效的游戏大多都对bitmap用得很赞哦

嗯,反正尽量减少对MovieClip的使用,尽量哦.

http://www.klstudio.com/post/141.html [AS3]URLLoader+URLRequest+JPGEncoder实现BitmapData图片数据保存

40.>> 

41.无尽SAGA  17:49:21

42.就是现在不是一般缩放都是控制的 百分比吗?

43.无尽SAGA  17:49:36

44.我想依据像素控制

45.无尽SAGA  17:49:44

46.就是得算一下

 

47>> 当textField.autoSize = "left"的时候,再调整textField.width ,height 的话不起作用,用的是测量值.

48>>关于事件机制。

49>>http://www.adobe.com/support/flashplayer/downloads.html flash_ax_debug下载地址一个A容器里有N个B,如果B抛出事件那你在A里面就得给每个B添加事件侦听才行。如果你不想这么做,就可以直接在A中添加一个事件侦听,然后设置B抛出的事件为冒泡类型即可,这样B抛出的事件在A里面也能侦听到了。

在鼠标所点击的位置向最底层的可交互对象

flash.display.InteractiveObject 

找寻鼠标所触及到的 最末尾的一个可交互的对象

在这中间  可能会经过很多层容器对象

flash.display.DisplayObjectContainer

在这个向下的过程中 叫做捕获阶段

当找到目标对象时  这个阶段叫 目标阶段

因为捕获阶段会找寻并记录下整条父路径的所有节点

所以最后会有一个冒泡阶段 

向来路的所有节点发送事件

 

比如一个主Sprite  A 它是空白的 没内容的

再里面 addChild一个空白的Sprite  B

再里面 addChild一个绘制了矩形的 Sprite C

点击矩形的时候

因为它在C内的 所以必然会红过 A 再入 B,最后到达C

操作系统渲染到显卡 最后输出屏幕的永远是RGB位图

所有的颜色 透明度操作 都是在flashPlayer底层实现的

最后把RGB合成的数据送给操作系统

 

只要发生事件,Flash Player 或 AIR 就会调度事件对象。如果事件目标不在显示列表中,则 Flash Player 或 AIR 将事件对象直接调度到事件目标。如果事件目标在显示列表中,则 Flash Player 将事件对象调度到显示列表,事件对象将在显示列表中穿行,直到到达事件目标。

“事件流”说明事件对象如何在显示列表中穿行。显示列表以一种可以描述为树的层次结构形式进行组织。位于显示列表层次结构顶部的是舞台,它是一种特殊的显示对象容器,用作显示列表的根。舞台由 flash.display.Stage 类表示,且只能通过显示对象访问。每个显示对象都有一个名为 stage 的属性,该属性表示应用程序的舞台。

 

比如一个 参数面板   里面子级有一个关闭按钮

而visible=false  隐藏面板的代码写在而面板的绑定类中

这种机制很好地实现的 面向对象中的  门前三包责任制

面板中的关闭按钮给它命名为  btn_close_pan

那样可以在面板的类中直接侦听   MouseEvent.CLICK事件

function fun(_evt:MouseEvent):void{

 

if(_evt.target.name = "btn_close_pan"){

 

     this.visible = false;

}

 

而不用在子类中为关闭按钮侦听事件 再去在处理函数中  使用  parent.visible = false

这样减少引用 进行解除耦合的操作

 

对象只负责自己最低限度的责任 不去越界访问其它对象的内部东西

 

不用在子级中去控制父级的东西

 

说句难听点的 你清楚知道你自己要做什么 别人管不着你  

 

有 那也只是通知你要干什么  至于怎样干  那是你自己处理好的问题

事件的target属性永远是指向目标阶段的对象的,currentTarget则是指向当前事件流流经的 目标

 

简单说,target是事件的调用对象(event dispatcher),currentTarget是事件的处理对象(event processor)

 

var s:Sprite = new Sprite()

for(循环 i){

s.addChild(苹果)

}

addChild(s)

s.addEventListener(MouseEvent.CLIC,fun,true)

function fun(_evt:MouseEvent):void{

     s.removeChild(_evt.target);

     _evt.target.removeEventListener(_evt.type,arguments.callee)

}

target永远是指向鼠标所在的对象的  这里只是说currentTarget的变化

这个事件流不是找target的。

target首先找到的。

找到后 再从stage开始向下 看看各节点是否有侦听事件。

事件流是找 addEventListener的对象

49>>

public static const FLAG_1 : int = 0x1;

public static const FLAG_2 : int = FLAG_1 << 1;

public static const FLAG_3 : int = FLAG_1 << 2;

 

flag = FLAG_1 | FLAG_2;

50>.其实有个非常好的开源 flixel

很多人说操作位图高效

就是基于位图

51>>清空数组所有的元素 arry.length = 0;

52>>就是直接操作位图啊,什么的现成代码,位图效果啊,数学计算都是现成的等等.

53>>Math.random() * 100 | 0  异或 去整.. 取代math.floor函数

 

54>>转换矩阵的理解var s:Sprite = new Sprite();

            s.graphics.beginFill(0xff0000,1);

            s.graphics.drawCircle(0,0,50);

            s.graphics.endFill();

            addChild(s);

            trace(s.x,s.y);

           

            var myMatrix:Matrix = s.transform.matrix; 

            myMatrix.tx += 50;

            s.transform.matrix = myMatrix; 

           

            trace(s.x,s.y);

           

            s.x = 50;

            trace(s.transform.matrix.tx);

           

            var bmpd:BitmapData = new BitmapData(100,100,true,0);

            var myMatrix2:Matrix = new Matrix();

            myMatrix2.translate(50,50);

            bmpd.draw(s,myMatrix2);

//          bmpd.draw(s,myMatrix2);

            var bpm:Bitmap = new Bitmap(bmpd);

            bpm.y = 100;

            addChild(bpm);\

这个测试表明:draw(,matix);第二个参数 和 显示对象本身的没有关系.

然后还表明 draw是从注册点开始的绘制的,如果想绘制全貌 只能translate了..改变x,y无济于事..

或者说,他draw的时候,并不会把原对象的x和y之类的属性也draw过去

这个说明他不会应用原来的改变效果

嘿嘿,这更验证了 旋转,神马的,draw只会draw原来的..对draw不起作用..

55>>

C:\Program Files\Adobe\Adobe Flash Builder 4\player\win

flashplayer_10_sa_debug.exe这个位置是fp默认找的位置,debug版本的fp。

56>> if (!parm) 意思是: if(parm == null);

57>>替换所有abc开头的的两种写法

(1)function tihuan(reg:RegExp,str:String,str2:String):String

{

    var arry:Array = str.match(reg);

    while(arry)

    {

         str = str.substr(arry[0].length);

         arry = str.match(reg);

    }

       return str2 + str;

}

trace(tihuan(/^abc/,"abcabcfdgegabcfdsf","我"));

(2)/g是全部匹配,没有g是只匹配第一个.

var str:String = "abcabcfdsabcfdabcabc";

var result:String = str.replace(/(abc)+/,"");

trace(result);

58>>D:\Program Files\Adobe\Adobe Flash Builder 4\player\win这里面扔一个debug版本的fp就行了,能debug模式运行了.

59>>如何改变字体的透明度:

    txt1.text = "随机文本";

            txt1.blendMode = "layer";

            txt1.x = 200;

            addChild(txt1);

//          var tmp_filter:BlurFilter = new BlurFilter(0,0,0);

//          txt1.filters = [tmp_filter];

            addEventListener(Event.ENTER_FRAME,hander);

        }

        private function hander(e:Event):void

        {

            trace("fdsfsdfds");

            txt1.alpha -= 0.00000001;

        }

posted on 2012-04-25 12:03  防空洞123  阅读(509)  评论(0编辑  收藏  举报

导航