不定期更新日志,来源:网络、翻译或者原创; ^_^------- 转载请保留出处,我的信息以及其他相关信息

发布新日志

  • 关于近日发布日志的声明

    2007-08-24 11:41:53Top 1

        近日发布了很多篇日志,大多数是以前收集的资料,也有几篇是个人工作中的记录。日志中包含作者或者其他信息的,我均已保留,如果某些内容对原文作者有伤害的话,请在此留下评论给我,我会立即处理的。
  • 为什么加载了图片的MC对鼠标事件没有响应?

    2007-08-24 11:45:51

    为什么加载了图片的MC对鼠标没有响应?其实不单是对鼠标,对键盘也没有响应。这是为什么呢?
    至于为什么,我也不知道。不过我是这样解决的:在这个MC里面再新建一个空的MC,然后在那个空的MC里面加载图片,这样整个MC对于鼠标和键盘就有响应了…………
  • 注册点与中心点

    2007-08-24 11:38:08

    变形工具和AS代码实现缩放和旋转效果时,依据的基准点是不同的,前者以中心点为基准,后者以注册点为基准。 改变MC的_rotation,MC内部的座标系会相应的进行旋转.

    元件编辑界面中的小十字,表示注册点。
    注册点是注册点所在场景的座标原点(0,0)。
    元件的座标是以它的外边框左上角所在位置来表示的。

    元件中的小圆圈表示中心点。
    形状的中心点在选中状态下可以进行移动,放弃选中则恢复到几何中心。

    窗口操作中的测试结果:

    所有的旋转和缩放都是围绕着相应的中心点进行的。

    元件在拖入某场景后,形成中心点,默认情况下按钮的中心点与注册点位置重合,MC和图形的中心点位于该元件的几何中心。

    元件的中心点可以通过任意变形工具进行改变,但注册点无法从外部改变。

    元件发生旋转后由水平线与垂直线构成的最大外框的左上角成为元件在场景中的新座标。
    元件发生缩放时,是以中心点为基准向外进行的,因此,距中心点越远,元件缩放后在场景中的座标值变化就越多。

    元件在嵌套放置的时候,中心点的变化如同将该元件拖入主场景中:默认情况下 按钮的中心点与注册点位置重合,MC和图形的中心点位于该元件的几何中心。

    MC的中心点在外部改动后,无论MC内部是否还有其它元件,或是增删 MC 内部的元件,中心点与注册点的座标关系都将保持不变。

    信息窗口,仅用于显示座标位置,选中左上角显示的是当前对象的座标,选中中间,显示的是对象中心点的座标。该显示信息与注册点位置无关。
    将目标转换为元件时,窗口中可以设置默认注册点的相对位置。该处的9方格显示与信息窗口中的9方格显示是没有关系的。

    AS代码操作的测试结果:

    通过改变对象的 _xscale _yscale 及 _rotation 而实现的变形效果都是以目标对象的注册点为基准点的。

    AS代码生成的空影片剪集的注册点总是位于其内部的左上角(0,0)。

    一个MC只有一个唯一的注册,在编辑状态下,点中MC中内嵌的MC,显示出来的另一组注册点及中心点,是下一级MC(也就是内嵌MC的注册点、中心点)与当前MC无关。

    剩余问题:

    怎样获取注册点和中心点?

    如果是几何中心,并且未做改动,那么:
    中心点座标为 {(this._x+ this._width/2), (this._y+this._height/2)}
    AS代码产生的动作与中心点无关,因此可以忽略该位置点。

    注册点的计算可以通过同时放大对象的 _xscale 和 _yscale ,计算放大后的 _x _y 可以得到注册点在当前场景的座标。
    计算过程如下:
    x1 = this._x;
    y1 = this._y;
    this._xscale = 200;
    this._yscale = 200;
    x2 = this._x;
    y2 = this._y;
    regPtX = x1 - (x2 - x1); //因为是等比放大了两倍,这里计算就很简单
    regPtY = y1 - (y2 - y1);

    在实际的测试中又可以发现, 当MC进行旋转(改变_rotation)后, MC内部的座标系也同时会发生旋转,于是内置元件的注册点座标相对于MC的基准点来说总是不变的.


  • Flash的 魔法深度值 –16384

    2007-08-24 11:36:34

    点击查看全图 我们知道Flash中的元素使用深度的概念,所有创作中的元素都从 -16383 开始,所以如果我们要让某个元素显示在最底层的话,可以把深度设定为魔法深度值。
    其中原因我们不妨深究下:
    原来Macromedia's mx.managers.DepthManager 类中定义了下面的值:
    1 : // highest allowed depth is reserved for tooltips and cursors
    2 : static var reservedDepth:Number = 1048575;
    3 : // highest depth for all other objects
    4 : static var highestDepth:Number = 1048574;
    5 : // lowest allowed depth
    6 : static var lowestDepth:Number = -16383;
    7 : // lowest depth plus this number of layers is reserved
    8 : // for statically placed content
    9 : static var numberOfAuthortimeLayers:Number = 383;

    这下就应该明白个中原因了吧~


  • flash的AS倒参问题

    2007-08-24 11:35:49

    我以前看到过讨论这个问题的文章,不过当时还没有深入了解AS编程,所以没有多留心。刚刚看闪吧上的帖子,说到AS的倒参问题,帖子已经很老了。原文如下:
    ————————————————————
    制作游戏一定要明白的一个语法陷阱!大家快看那~~~

    作游戏,一定要有对所有活动物体完全的控制力那么请问,下面这段代码复制出来的MC叫什么名字?深度是多少?复制之后mcdepth是多少?

    QUOTE:
    mcdepth=0; MC.dumplicteMovieClip("MC"+mcdepth,mcdepth++);

    大家可以试一试不要以为很简单哦~其中有一个重大语法陷阱的~ (如果没人回我这贴就算了…… T T)
    唉,顺便说一句,Flash的语法陷阱何其多阿~最BT的就是gotoAndPlay 还有不同MC的onClipEvent()加载时间随机性问题、hitTest()等等……
    ———————————————————————
    什么陷进啊?
    ——————————————————————
    呵呵,你把上面问题的答案写出来看看~
    ——————————————————————
    mc名字:mc1,mc2,...mcN 深度:1,2....N mcdepth:0 怎么了,有什么陷进么,不理解啊 ox_thedrakness兄还给说说嘛~
    ——————————————————
    赫赫真是不好意思,深度写错了,下面也是mcdepth…… 改了一下上面的再看看~ 顺便说一句,就刚才的代码,你的答案的深度错了(不过问题的重点不是这个)再看看代码,给出答案时候讲解一下~
    ——————————————————
    mc名:MC1; 深度:0; mcdepth:1; 我测出来好像是这样子的,不知道对不对里面MC应该是MC0才对的啊[em04]
    ——————————————————
    是啊你看 mcdepth=0 所以复制("MC"+mcdepth,...) 应该复制出"MC0"才对为什么复制出来的是"MC1"呢?
    答案是:Flash传参顺序是反过来的—— duplicateMovieClip("MC"+mcdepth,mcdepth++) 首先传进去mcdepth++, 为0,所以复制的MC深度为0 然后传进去mcdepth为1,所以复制的MC叫"MC1"
    可以试试这个:
    function Fun(a,b,c){ trace(a+" "+b+" "+c); } x=0; Fun(x++,x++,x++);
    结果不是0,1,2 也不是0,0,0 而是2,1,0
    ——————————————————
    晕我原来在做一些雪花复制的时候,里面的运算我就觉得和我学的C好像不一样么原来flash是倒过来算的,巨汗。。
    ——————————————————
    多谢了,我会注意的 ox_thedarkness,再讲讲as还有什么陷阱 :)
    ——————————————————
    呵~gotoAndPlay、gotoAndStop的陷阱很多,比如说:
    请问在一个5帧动画的第五帧这样写(没有其他AS):
    [quote] gotoAndPlay(1); trace("已经不在这一帧了,我会不会被执行呢?"); [/qutoe] 1〉请问这个循环共有几帧?第5帧是如何处理的?
    2〉那个trace();会不会被执行?
    如果你需要用AS控制主角的动作,比如,跑动循环4次之后执行攻击动作,有时是需要知道的或者想用gotoAndPlay()充当return的作用,是很重要的
    ——————————————————
    用过flasm的都知道倒参这个特性, 因为它们是push进数组的。
    ——————————————————
    原来如此啊,真是透彻!
    flasm是你总是用来显示实际生成代码的那个的吧? 我一开始还以为是拼错了呢~
    【完】


  • Flash的常见问题

    2007-08-24 11:34:28

    Q1:Flash 怎么读取文本框“Textfield”?
    Load Variables ("*.txt", 1)------建一个文本框。ariable填你要的名字。例如:text-------建一个txt文件。放在和swf同一个目录,里面的内容: text=你要的内容
    Q2: 如何能为自己的作品加上密码保护?
    选择菜单Flie-Export Moive弹出下面的Export Flash PLayer对话框,勾选其中的“Protect from import”一项,就可限制别人对你作品的import使用。但有时自己的源文件搞丢了,或者是要让好友导入使用你的动画,就不方便了。这时可勾选对话框中的“Password”一项,再输出动画。这样你只要牢记你的密码,就可让自己或者好友导入使用你的动画了。
    Q3: 如何在Flash中调用EXE文件?
    fscommand ("exec", "path/*.exe") ,path 为路径名,必须是绝对路径。
    Q4: 导出的.EXE文件如何自动关闭?
    在flash最后一帧上或在按钮上加 fscommand(“quit”)
    Q5: 如何禁止菜单、Zoom In(Out)功能,以及完成双击SWF文件时直接全屏 ?
    全屏->FS Command (“fullscreen”, true)本全屏只是简单地将屏幕占满,动画部分并不会因此而放大。
    禁止缩放->FS Command (“allowscale”, False)
    禁止菜单->FS Command (“showmenu”, False)
    Q6: 如何通过按钮给别人发E-mail?
    添加下列语句: get url:mailtyourname@sina.com
    Q7: 如何在Flash中打开一个定制的浏览器新窗口?
    添加 Get URL ("java scrīpt:window.open('new.htm','newwin','width=320,height=320');")
    或者直接用getURL(“http地址”,显示窗口的方法[,-]);(详见Flash的帮助文件)
    Q8:如何在Flash中打开其他非EXE类型的文件?
    1、在Flash中如何打开Word文档?
    Flash不支持调用Word文件,但浏览器可以直接打开.doc文档,那么就用getURL来解决即可,路径用绝对地址[url]http://www..../word.doc[/url] ; 。
    2、 在Flash中如何调用mpeg文件?
    Flash中不支持调用mpeg文件,首先要安装一个三方软件,名字为Swiffcanvas1.0;接着打开fla文件,如果mpeg文件的目录为aa,mpeg文件名字为bb,那么就可以就添加下面的语句: FS Command ("exec", "SwiffEXEC(LOCAL:aaa\111.mpeg) ");
    然后把fla文件输出为exe文件 ,并用Swiffcanvas打开这个exe文件,然后在Swiffcanvas里设置完成自己的要求。最后再输出为.exe文件,就可以了。
    补:如果觉得上面的方法麻烦,可以下载一个辅助软件flix(闪派软件园有),它可以把mpeg等视频文件转为swf文件,然后再导入flash中或者从外部调用,外部调用动画参考下题答案。
    3、通过打开批处理文件的方式打开其他文件
    通过Fscommand(“exec”, “ ”);可打开批处理文件,例如:fscommand(“exec”, “open.bat”); 其中批处理文件open.bat可用记事本编写,BAT文件内容如下:
    @echo off
    start Primer_c++.pdf
    exit
    start后面跟的是文件名.后缀。
    Q9: Flash如何与数据库连接?
    只能通过后台文件,如CGI脚本,Active Server Pages (ASP),或 Personal Home Page (PHP)等。传递值到flash中,实现数据库的操作。


  • FLASH读外部数据(文本|XML|ASP)

    2007-08-24 11:25:37

    前些日子一直在浏览韩国网站,看过后再来看我们中文的网站,觉得实在相差太多了。。。中文网站现在真的不敢随便逛,指不定就有个病毒,弹出窗口等一大堆乌七八糟的广告。可是看韩国网站却干净的多,而且多以flash为主,而且速度都很快,这就让我奇怪,制作精美的flash大多需要几百k,可是韩国的 flash怎么会播放的这么快。。原来这是flash调用xml技术。我国现在一些大型网站已经开始运用,但还并不是十分普遍。

    其实我也并不怎么会用,却真的很想好好学学,到处收集素材,不断学习

    第一讲:最基本的读取

    程序代码 程序代码
    loadVariables()
    loadVariablesNum()


    用法
    程序代码 程序代码
    loadVariables ("url" , target [, variables])
    loadVariablesNum ("url" ,level [, variables])


    区别:
    大家都知道FLASH里有层级(level),也有影片剪辑(MC)那么:
    ·如果你想让FLASH读取到的数据放到某个影片剪辑中,那你就用第一个loadVariables
    ·如果你想让FLASH读取到的数据放到某个特定的级别,那你就用第二个loadVariablesNum

    FLASH4 就有的语法,这个函数的功能就是从外部文件(例如文本文件,或由 CGI 脚本、Active Server Page (ASP)、PHP 或 Perl 脚本生成的文本)中读取数据,并设置目标影片剪辑中变量的值。此动作还可用于使用新值更新活动 SWF 文件中的变量。

    举例说明:

    1、我们先准备一个 TXT记事本。在里面写以下内容:
    t_name=sun-yan&t_age=20&t_from=beijing
    解释:上面的文本内容我定义了3个变量 t_name t_age t_from 并且分别让给他们赋予了一个值。而且中间用了 & 分隔开了,不明白的朋友就会问了?用&分开是啥意思?那我就来告诉你,FLASH读取外部数据,当外部数据被程序载入的时候,FLASH会自动根据 & 来 分割数据 也就是说 上面文本里的东西如果被FLASH读取到,FLASH就自动认识它们是3个变量。

    2、我们新建一个FLASH文件,在第一个桢写上:
    loadVariables("tommyheng.txt", "_root");
    或者(选一个就行,别2个都写哦)
    loadVariablesNum("tommyheng.txt", 0);
    解释:用2种方法把tommyheng.txt载入到FLASH中。
    第一种方法:把文本中的数据载入到FLASH的主场景中(_root 其实就是FLASH的主场景,当然,如果你想把数据放到FLASH中的某个MC中,你可以把它修改成,_root.mc意思就是载入到主场景中的一个叫做MC的影片剪辑)

    第二种方法:把文本中的数据载入到FLASH的场景中的第0个级别

    然后,在第5桢处插入一个关键空白桢,里面写

    程序代码 程序代码
    trace(t_name);
    trace(t_age);
    trace(t_from);
    stop();

    解释:trace()是FLASH里是一个信息输出函数,在制作FLASH的时候,开发者可以通过这个函数,把程序返回的结果(变量)直接输出来观察运行的是否正确等等,但是它只能在FLASH里使用(也就是说按CTRL+ENTER的时候)你才能看到它的功能。
    把FLASH和tommyheng文本保存到同一个文件夹中。按CTRL+ENTER直接测试影片
    你会发现会输出一下结果:

    sun-yan
    20
    beijing

    如果你想把这些结果显示到文本框中,而不是输出来看,那可以又2种方式:
    第一种方式:直接分配方式

    就是直接做3个动态文本框,分别点选每个文本框,在其属性中找到变量,并分别填写: t_name t_age t_from

    第二中方式:自定分配方式

    同样建立3个动态文本框,但是不同的是,分别点选每个文本框,在其实例名称处分别填写随便的3个名字 比如:a1 a2 a3
    然后在这桢上写如下程序:

    程序代码 程序代码
    a1.text = t_name
    a2.text = t_age
    a3.text = t_from


    这样FLASH就完成了读取外部数据的功能!!!
    特别提示:
    某些朋友根据我的文件进行测试或者学习,会出现一个问题,那就是英文和数字显示很正常,但是中文就显示不正常变正了乱码(这个是编码问题,很高难的哦)。不要怕,我们有办法对付它,在第一桢处写上
    System.useCodepage=true;这句话的意思就是让FLASH认识中文(嘿嘿),按照理论上讲就是让FLASH使用运行播放器的操作系统的传统代码页来解释外部文本文件。

    本讲结束语:
    虽然我只写了FLASH读取文本TXT文件,但是它同样试用其他的格式文件的读取。如果你愿意,你可以把文件的扩展名修改成 .dat 甚至你可以把它修改成 .tommyheng 还有,也可以是ASP了。不过如果想读取ASP 那你必须要会ASP哦。起码把要ASP的输出结果也是t_name= tommyheng&t_age=25岁&t_from=辽宁沈阳
    从此我们不难看出,其实FLASH读取什么都无所谓,重要的一点,这个文件输出来的东西要能被FLASH认识 也就是 被 & 分开来的变量格式

  • flash事件模型核心:监听器和广播器

    2007-08-24 11:20:58

    这对一些想深入了解flash MX运行机制,想进步的AS爱好者来说是非常重要的。
    我在各个flash网站上搜寻了一下,有两篇比较好的文章,我先翻译其中的一篇给大家作为参考。I sorry that I am shit in English.
    Listeners(监听器)和ASBroadcaster(AS广播器)
    Author: Santiago Esperanza
    translater: AOL
    版本:Flash MX

    用监听的方法是在flash MX中才出现的概念。监听器顾名思义, 就是一个用来监听特定事件的发生情况的对象。如果你对actionscrīpt非常熟悉的话,你肯定多次用到过监听器,但是你可能不知道它们。从技术上说,从flash 5以来所有的影片剪辑,都是监听器;所有的按钮也都是如此。这些flash对象都是用来监听一个事件, 当这个事件发生了,它就执行一段语句。但是在flash MX以前, 它们是怎么样的呢?这个东西也不是什么新事物了, 只是直到flash 版本为MX的时候actionscrīpt语言才让我们完全地运用监听器而已。

    进一步的认识
    学习监听器, 从按钮开始是一个不错的方法。按钮给我们的整个概念就是非常具有代表性的交互功能。当你按下一个按钮的时候,一个你所期待的结果就会发生。确定这些事情是不是发生了, 这是按钮为达到与用户交互的工作。当按下一个按钮的事件被检测到或者这个事件是由flash播放器发送出去的,在按钮上的on(press)事件和里面的代码就会执行。还有一些按钮监听的事件, 比如说释放(release),滑上(rollOver),等等。而flash的影片剪辑也有类似的为一些事件如enterFrame,mouseMove,keyDown等探测的监听器。
    在flash MX以前, 这些监听器(按钮和影片剪辑)都是预先定义好了的,而且它们是不能改变的,我们用户是没有人能够定义别的类型的监听器的。所有的这些都在flash运用新的事件模型后彻底改变了。按钮和影片剪辑仍然是预先定义好了的,但是现在你可以定义你自己的为某些你特指的事件的监听器,就像被公认了的按钮和影片剪辑一样的事件监听器。当然你所定义的监听器不仅仅可以对像keyDown或者mouseMove这样的事件进行监听。你可以用ASBroadcaster(Action scrīpt广播器)来定义你要监听的事件。
    flash内建的监听事件类型和广播器是怎么样的呢,请看下表。

    你会注意到不是所有的事件, 比如说 onDragOut,都和一件广播器有关联。你可以想象它们是被flash播放器广播的, 而不是通过一个具体的flash actionscrīpt对象。这些事件被限定只能用于列表中对应的监听器。用onDragout来说,它只能用于按钮或者影片剪辑对象。当一件事情被初始化的时候,你就可以广播器添加上面的列表中所允许的监听器。例如, 你可以用actionscrīpt建立一个普通的对象,然后使他监听一个鼠标对象(广播器)。这个鼠标对象可以在当鼠标被按下,移动或者释放的时候让物体执行onMouseDown,onMouseMove和onMouseUp代码。
    认识监听器和广播器有两种不同的方法。其中一种方法,表面上在我们的认识当中,独立的监听器是可以意识到的,它们监听事件是否在flash中发生。为了真正了解它们是怎么工作的,我们运用第二种方法,使我们知道监听器和广播器在flash内部是怎么工作的。
    监听器监听
    我第一次运用到监听器是在MX的影片剪辑运用一个onKeyUp事件。如果在一个影片剪辑自身加了一个onClipEvent(keyUp),这个keyUp事件是被认可的,我加入里面的代码也就会执行了。试着用这种方法来定义事件:instance_mc.onKeyUp = function(){...},没有产生什么结果。直到后面我才意识到我没有把这个影片剪辑定义成Key对象(事件广播器)的一个监听者(器)。只有定义了之后, 它才可以探测到键盘上的一个键是否被按下,然后在被释放的时候,执行这个事件。所以我们可以这样写(直接在时间轴上写,而不是在影片剪辑上写):

    Key.addListener(instance_mc);
    instance_mc.onKeyUp= function(){
    // key up code
    }

    为什么一个影片剪辑不会在用onClipEvent的时候一样,自动地成为Key对象的一个监听器呢?老实地说,我也不太清楚,我很懒,没有去研究,这也不是这篇文章的目的。一个影片剪辑被默认注册为Mouse对象的监听器,而不是Key对象,这样的话 instance_mc.onMouseUp=function(){...}就可以工作。(虽然这个概念不完全正确,因为影片剪辑监听的事件也不是被Mouse对象广播,而是flash播放器自身广播的,但是你可以这样理解)
    尽管如此, 不管什么对象,就像我的影片剪辑对象一样,可以成为一个广播器的监听者。它可以识别一个广播器所广播的事件而产生对应的动作。从上表中我们可以看到flash自定义的广播器有以下几种:
    Key
    Selection
    Mouse
    Stage
    TextField

    其中的每一个对象都可以用addListener()方法来给它们添加监听器,使得监听器可以明白它广播的事件。用Selection对象做例子, 有一个onSetFocus事件。这个事件是在flash中焦点变化的时候发生。当一个对象被添加到Selection对象中, 做为它的一个监听器(它可以是任何对象,普通对象,一个影片剪辑或者一个按钮对象),这时这个对象就可以明白在任何时刻Selection对象广播的事件,可以执行onSetFocus函数所分配给它的任何动作。

    例1.
    让我们来建立一个对象, 使这个对象成为Mouse对象的监听器。这是我上面所说的第一种认识方法的练习,从表面上来认识监听器是怎么工作的。一个监听器是一个用来监听一件事情发生的对象,事件发生了, 它就执行事件中所定义的代码。
    aBigEar = new Object(); // 建立一个普通对象

    // 定义执行一个任务的函数
    Flicked = function(){
    trace("Ouch, you just flicked me!");
    }

    //使得aBigEar成为Mouse对象事件的监听器
    Mouse.addListener(aBigEar);

    // 分配一个onMouseDown事件给aBigEar
    //当aBigEar是Mouse对象的一个监听者
    //它就可以像一个影片剪辑那样识别Mouse事件
    aBigEar.onMouseDown = Flicked;
    你可以把这段代码加入影片当中然后运行。 当你按下鼠标的时候,output窗口就会显示“Ouch, you just flicked me!” 。aBigEar,做为Mouse对象的监听器,当鼠标按下的时候,onMouseDwon所分配给它的函数就会执行,在这里,Flicked函数就会执行, 它包含的一个trace消息也就会显示出来了。
    onMouseDown自身,对aBigEar对象来说,仅仅是一个普通的函数。它除了会在flash action编辑器中彩色显示显示之外并没有什么特别的。你可以用aBigEar.onMouseDown()函数轻松地调用这个函数。Mouse 对象,有onMouseDown事件来关联它。因此,当aBigEar被定义为Mouse对象的一个监听器的时候,触发了onMouseDown事件,它就能识别出来,并运行自己定义的onMouseDown函数(在这里就是Flicked函数),这样就可以让你让监听器调用任何你定义的函数。
    AS广播器(ASBroadcaster)
    我们将拓展监听器的用途,但不是对ASBroadcaster浅尝辄止,而是研究它是怎么实现的。这个对象和监听器对象有非常密切的关系,甚至比你想像的还要密切。每一个上表列出的事件广播器(Key,Mouse,Selection,Stage,TextField)都使用ASBroadcaster在flash场景后面预先定义好了。ASBroadcster使得这些对象可以广播监听器所监听的事件。
    ASBroadcaster对象, 不要去把它想得很神秘,其实就是一个普通的有一个初始化方法的类。为了实现广播,它加了三个新的方法和一个新的属性,这样变成了一个新的类。这些方法是:addListener,removeListener,broadcastMessage。还有一个属性是:_listeners. 使用addListener方法可以让你广播器添加个新的监听器。removeListener可以让你除去一个。broadcastMessage是一个产生用来发送到监听器的事件(像onMouseDown)的命令。而_listeners是一个关联到这个广播器的所有监听器的列表。因此, 我们使用ASBroadcaster有下列的方法:
    ASBroadcaster.initialize(objToBroadcast);
    objToBroadcast.addListener(listenObj);
    objToBroadcast.removeListener(listenObj);
    objToBroadcast.broadcastMessage("event");
    objToBroadcast._listeners; 中文参考如下,flash中可以用中文变量名和函数名。
    ASBroadcaster.initialize(广播器);
    广播器.addListener(监听器);
    广播器.removeListener(监听器);
    广播器.broadcastMessage("事件");
    广播器._listeners;

    注意到你没有像使用其它的对象一样,用new关键字为ASBroadcaster对象建立一个实例。初始化函数是一个简单的对象容器, 你可以把它看成一个独立的函数。只有当一个对象被初始化为另一个对象的事件监听器的时候,ASBroadcaster发出的事件才会生效。
    拿Mouse对象来说吧, 它会在Flash中用ASBroadcaster自动初始化。它具有addListener和removeListener方法让你可以自行增加和删除你的监听器,并且当你按下、移动或者释放你的鼠标的时候,broadcastMessage方法也会自动执行。所以如果你按下你的鼠标,Flash会在内部执行下面的代码:
    Mouse.broadcastMessage("onMouseDown");
    所有的Mouse对象的监听器, 比如movieclip(在flash中自动定义为Mouse对象的监听器),就会识别onMouseDown,并且运行关联的动作。 例2.
    现在我们对ASBroadcaster有了一个简单的了解,我们可以用broadcaster对象自定义自己的广播器和响应它的监听器。这个例子还会沿用例一,那是属于你的监听器。它可以识别和监听事件的发生。 在这个例子里,我将会带你回到古老的两千多年前, 那儿有一个统治别人的国王和一些被驱使的奴仆。我们在这里所做的就是产生几个对象(一个是国王和一个从属于他的奴仆),然后用ASBroadcaster对控制他们之间的交互作用。国王, 作为国王,它将下达命令,而我们的奴仆将监听命令,当命令到达的时候就会执行一个特定的动作。所以我们必须建立这些对象,分别给这些对象定义属于它们的特点和能力。拿国王为例,当我们定义它为驱使者(用ASBroadcast.initialize)。这时我们的奴仆必须被驱使(用addListener),它成为国王的一个服务者并且被用命令指派它的工作。这里是代码:
    King = {}; // 产生国王
    ASBroadcaster.initialize(King); // 初始化国王为驱使者 subject = {}; // 产生奴仆
    King.addListener(subject); //把它加到国王的被驱使者 //告诉我们的奴仆,他应该做的事
    subject.onKingScream = function(){
    trace("带葡萄过来!");
    } // 这里我们让国王高吼两次, 用来加强语气,:)
    King.broadcastMessage("onKingScream");
    King.broadcastMessage("onKingScream");


  • Flash数据传输问题

    2007-08-24 11:12:35

    Flash MX推出後,Macromedia積極推出很多和Flash有關的產品,有DRK、Flash Remoting、FlashCom、Data Connecton Kit,即將來臨還有Central和Royale……其中最令一般Flash玩家疑惑的是Flash Remoting和Data Connecton Kit,究竟他們有什麼用?兩者有什麼分別?我只用過Flash Remoting,所以只能夠先談一談Flash Remoting有何用途。

    簡單地說,兩者都是用來使Flash和Server更容易交換Data,查詢Database等,因此如果只是用Flash來製作動畫、單機小遊戲、演示介面,不接觸Server的工作,就不需要Flash Remoting和DCK。

    背景資料
    自Flash 4開始,Flash可以連接Server來交換Data,方法是利用loadVariable()連接Middleware,即Server-side Program,亦即ASP、PHP等,Flash用GET和POST傳Data給Middleware,和傳統HTML Form一樣。Middleware則以URL-encoded格式傳回給Flash,即print、echo、response.write(Sytnax視乎用什麼Server-side Program)一句String出來,例如:

    myName=luar&place=hong+kong

    loadVariable()的缺點是Variable只可以一個一個地傳,而且Flash將收到Variable的Data Type全部認為是String(數字也不例外)。如果要傳一系列的Variables,只有:

    var1=123&var2=456&var3=789...

    或者:

    var=123|456|789...

    然後再自己拆開,Flash 4沒有Array和split(),這是一個甚痛苦工作。遇上Dynamic數量的Variables,還要靠Middleware傳多一個varTotal=10來代表Variable總數,方便拆開Data。

    Flash 5支持Array和split(),對傳一系列的Variables,可以方便地用split()拆成Array,不過split()拆大量Data時速度很慢,那時Branden Hall寫了string.as優化split()執行速度。

    loadVariable()另一個問題就是非同步延誤,Flash完全不知道Data究竟何時已經load入來,因此新手經常loadVariable()後立即調用那Variable而引致問題,解決方法就是在傳回那個String頭尾加上bof=1和eof=1,例如:

    bof=1&myName=luar&place=hong+kong&eof=1

    然後用兩格Frame不停循環播放,檢查bof和eof是否等於1,例如:

    [Frame 1]
    loadVariable("var.php", 0);

    [Frame 2]
    if (bof==1 and eof==1){
    gotoAndPlay(4);
    }

    [Frame 3]
    gotoAndPlay(2);

    [Frame 4]
    trace ("Data is loaded!");

    XML時代
    當要傳大量相關數據,類似Database Table欄目Recordset時,利用拆成Array方法始終不便,幸好Flash 5開始支持XML,使傳入來的Data可以更有系統,例如:

    <record>
    <item>
    <name>luar</name>
    <place>hong kong</place>
    </item>
    <item>
    <name>kelly</name>
    <place>kowloon</place>
    </item>
    </record>

    XML.onload更使Flash知道Data已經load入來,可以開始進行XML Parsing,意思是將XML中Data轉為Flash可以運用的Data Type,通常都是轉成Array,不過XML Parsing轉成Array,Array Element的Data Type都是只有String。

    Flash 5處理XML的速度很慢,廣為人詬病,遇著大量Data,例如10k或以上,XML Parsing甚至會拖垮Flash Player,那時Branden Hall寫了XMLNitro優化XML Parsing執行速度。不過,有時寧願用回loadVariable和拆Array方法,更簡單、方便和快捷。

    Flash 6新面貌
    Flash Player 6執行Flash 5/6文件時,拆Array和XML Parsing的速度改善了很多很多,不過Data Type依舊是String,針對loadVariable()非同步延誤缺點,Flash 6加入了LoadVars Object,用它來處理和Server交換Data的工作,方便很多,LoadVars.onLoad更使Flash知道Data已經load入來。

    XML Socket
    Flash 5另外加入了XML Socket,其實通過是Server運行著的Socket Server,主動Push Data給Flash,這主要用來做Multiuser應用,或者股票即時報價等。Macromedia沒有出品Socket Server,要自己寫一個,或者使用其他人寫的Socket Server(例如:Unity、ElectroServer等),Socket Server要一直運行著,隨時接收Data。普通Hosting未必可以讓人Run Server,而且在Flash和Server交換Data上要再靠Socket Server,一般都很少會用在日常開發工作中。

    Flash Remoting
    交待了一大堆背景資料,就是想說Flash Remoting是針對以上問題而生的技術,我認為Flash Remoting最主要功能有2個:與Server直接交換不同Data Type,連接Remote Services。

    從Server傳到Flash的Data的Data Type是String,同樣從Flash傳到Server的Data的Data Type都是String,Flash Remoting可以直接將Number、Boolean、Array等在Flash和Server間互相傳遞,這可以減少Client和Server兩端在Data Type轉換上的工作量。例如Server可以將Data直接以Array傳給Flash,Flash可以立即使用,很方便;甚至整個Recordset傳給Flash,配合Data Grid顯示出來。另外,最重要是Flash中使用Flash Remoting的Actionscrīpt是NetServices,它有兩種狀態_Status和_Result。_Status用來處理Exception,例如傳遞失敗等情況,_Result用來處理成功傳送情況。因此在Data傳遞上,Flash Remoting可以使Flash完全掌握整個過程。

    第2個功能我認為影響更深遠,因為它使Flash和網絡技術大趨勢Web Services接上。在沒有XML之前,數據格式是各自為政,不同技術、生產商是不同,就算現實工作上,在同一公司,不同部門製作的程序,處理、儲存或輸出格式都是不同,因此在Data互通上做成很大麻煩,要使用人家的Data,就要先寫一個解讀程序。但是有了XML後,加上SOAP通訊協議,不同程序可以用XML來交換Data。換句話說,程序輸出結果是XML格式,其他程序可以「明白」它。Internet是最大交換Data的平台,Web Services就是遠端電腦中程序,其他電腦可以連接使用。

    Web Services的影響
    再簡單地說,Flash Remoting使Flash能連接自己Domain以外的地方,傳遞Data,突破本身Sandbox的安全限制。平日開發的以Flash作介面的Web Based應用,Server傳來的Data(URL-encoded格式),基本上針對Flash而度身訂做的,就算是XML,為了減少XML Parsing負荷,XML都是精簡到只有Data,別的程序用不著這些Data,就是浪費了開發時間和資源,減低交換Data的能力,換了Web Based程序以Web Services形式開發,Flash可以通過Flash Remoting使用,其他程序都可以用WSDL知道怎去使用,正正是現今資訊要流通,開發程序要有更大可重用性和擴充能力的大趨勢。

    總結
    當知道所開發的程序是怎樣定位,對於Flash和Server間Data交換有何要求時,或者就會明白是否需要Flash Remoting。作為一個單一Actionscrīpter,只會寫Actionscrīpt,沒有Server-side編程能力,基本上很難會用上Flash Remoting,因為Flash Remoting在Flash那邊很簡單,只要連上負責Flash Remoting的Gateway,指出要什麼Service,等候接收Data便可,Server-side編程才是技巧之所在,所以要成為一個全面Flash Developer,應要學習一種Server-side Program旁身,可以選ColdFusion、ASP.NET或者PHP等。
     

  • Flash中的打印控制

    2007-08-24 11:09:08

    作者:vibo 时间: 2006-07-31 文档类型:原创 来自:蓝色理想
    这个估计很多人没有关心过。但是很有用。我贴上来吧。 Flash中负责打印的类是 PrintJob,首先了解它一下
    属性:
    orientation:String [只读] 图像的打印方向。图像的打印方向。此属性可以为 "landscape" 或 "portrait"。请注意,只有在调用 PrintJob.start() 方法后,此属性才可用。
    pageHeight:Number [只读] 页面上实际可打印区域的高度(以磅为单位)。
    pageWidth:Number [只读] 页面上实际可打印区域的宽度(以磅为单位)。
    paperHeight:Number [只读] 纸张总高度(以磅为单位)。
    paperWidth:Number [只读] 纸张总宽度(以磅为单位)。
    用法:
    addPage(target:Object, [printArea:Object], [options:Object], [frameNum:Number]) : Boolean
    target:Object - 一个数字或字符串;要打印的影片剪辑的级别或实例名称。传递一个数字来指定级别(例如,0 表示 _root 影片)或传递一个字符串(括在引号中 [""])来指定影片剪辑的实例名称。
    printArea:Object [可选]
    一个对象,它指定要打印的区域,采用以下格式:
    程序代码:
    {xMin:topLeft, xMax:topRight, yMin:bottomLeft, yMax:bottomRight}
    为 printArea 指定的坐标表示屏幕像素,这些屏幕像素相对于 _root 影片剪辑(如果 target = 0)的注册点或由 target 指定的级别或影片剪辑的注册点。您必须提供所有四个坐标。宽度 (xMax-xMin) 和高度 (yMax-yMin) 必须均大于 0。
    磅是打印度量单位,像素是屏幕度量单位;磅的实际大小是固定的(1/72 英寸),但是像素的大小取决于特定屏幕的分辨率。您可以使用以下换算公式将英寸或厘米转换为缇或磅(1 缇为 1/20 磅):
    1 磅 = 1/72 英寸 = 20 缇
    1 英寸 = 72 磅 = 1440 缇
    1 厘米 = 567 缇
    您无法可靠地在像素和磅之间转换;转换比率取决于屏幕及其分辨率。例如,如果屏幕设置为每英寸显示 72 个像素,则一磅等于一个像素。
    注意:如果以前曾使用 print()、printAsBitmap()、printAsBitmapNum() 或 printNum() 从 Flash 进行打印,则可能使用过 #b 帧标签来指定要打印的区域。当使用 addPage() 方法时,您必须使用 printArea 参数来指定打印区域;#b 帧标签将被忽略。
    如果省略了 printArea 参数或错误地传递了该参数,则将打印 target 的整个舞台区域。如果您不希望指定 printArea 的值,但希望指定 options 或 frameNumber 的值,请为 printArea 传递 null。
    options:Object [可选]
    一个参数,它指定打印为矢量还是打印为位图,采用以下格式:
    {printAsBitmap:Boolean}
    默认值为 false,表示请求矢量打印。若要将 target 打印为位图,请为 printAsBitmap 传递 true。当确定要使用的值时,请记住以下建议:
    如果要打印的内容包括位图图像,请使用 {printAsBitmap:true} 以包括任何透明度和色彩效果。
    如果内容不包括位图图像,请省略此参数或者使用 {printAsBitmap:false} 以较高品质的矢量格式打印内容。
    如果省略或错误传递了 options,则使用矢量打印。如果您不希望指定 options 的值,但希望指定 frameNumber 的值,请为 options 传递 null。
    frameNum:Number [可选]
    一个数字,用于指定要打印的帧;传递 frameNumber 不会导致调用该帧上的 Actionscrīpt。如果省略此参数,则打印 target 中的当前帧。
    注意:如果以前曾使用 print()、printAsBitmap()、printAsBitmapNum() 或 printNum() 从 Flash 进行打印,则可能在多个帧上使用过 #p 帧标签以指定要打印哪些页。若要使用 PrintJob.addPage() 打印多个帧,必须对每个帧发出 PrintJob.addPage() 命令;#p 帧标签将被忽略。有关以编程方式执行此操作的方法,请参见"示例"部分。
    返回 Boolean - 一个布尔值:如果页成功发送到打印后台处理程序,则返回 true;否则返回 false。
    send() : Void
    用在 PrintJob.start() 和 PrintJob.addPage() 方法之后,将经过后台处理的页发送到打印机。
    start() : Boolean
    显示操作系统的打印对话框并开始进行后台处理
    PrintJob 构造函数
    var my_pj:PrintJob = new PrintJob();
    范例1:
    CODE:
    //pt2_mc 为影片剪辑名称
    var my_pj:PrintJob = new PrintJob();
    var myResult:Boolean = my_pj.start();
    if (myResult) {
    my_pj.addPage(pt2_mc);
    my_pj.send();
    } else {
    trace("没有进行打印或打印失败");
    }
    delete my_pj;
    范例2:
    CODE:
    //pt2_mc 为影片剪辑名称
    //打印结果为三页
    var my_pj:PrintJob = new PrintJob(); //构造函数
    if (my_pj.start()) {
    var pagesToPrint:Number = 0;
    if (my_pj.addPage(pt2_mc)) {
    pagesToPrint++;
    }
    if (my_pj.addPage(pt_mc)) {
    pagesToPrint++;
    }
    if (my_pj.addPage(pt_mc)) {
    pagesToPrint++;
    }
    if (pagesToPrint>0) {
    my_pj.send();
    }
    }
    delete my_pj;


  • Flash中调用外部文件

    2007-08-24 11:00:44

    Flash可以通过帧、按扭、影片剪辑来调用外部文件。调用的外部文件包括:外部文本文件、外部程序文件、外部*.swf文件、外部图片文件、外部音乐文件、外部脚本文件。
    一.调用外部文本文件:(文本文件开头要以flash中的动态文本框的变量名开头,如msg=".........."这样的形式,要和编辑的Flash文件放在同一目录下)
    1.用工具箱中的文本工具,选择动态文本,给动态文本一个变量名,如:msg,在编辑区拖出一个文本框
    2.制作两个按扭(一个调用,一个清除)拖放到场景中。
    3.调用按扭上添加AS:
    on(release){//松开鼠标后执行下面的代码;
    loadVariables("msg.txt",msg);//调用和你编辑的Flash处于同一目录下的msg.txt文本文件到动态文本msg中;
    System.useCodepage=true;//使外部文件的中文字符能够正确显示;
    }
    4.清除按扭上的AS:
    on(release){//松开鼠标后清楚动态文本框中的内容;
    msg="";
    }
    5.Ctrl+Enter测试.

    loadVariables("文件URL", "目标");与loadVariablesNum("文件URL","层级");是有区别的大家都看到了.其实上面的语句可改为

    on(release){//松开鼠标后执行下面的代码;
    loadVariablesNum("msg.txt",0);//调用和你编辑的Flash处于同一目录下的msg.txt文本文件到动态文本msg中," 0 "是层级;
    System.useCodepage=true;//使外部文件的中文字符能够正确显示;
    }

    当然代码也可以写在帧上调用按扭的实例名是bt1,清除按扭的实例名是bt2)
    在第一帧上加如下代码:
    stop();
    _root.bt1.onRelease=function(){
    loadVariables("msg.txt",msg);
    System.useCodepage=true;
    }
    _root.bt2.onRelease=function(){
    _root.msg="";
    }

    Ctrl+Enter测试.

    调用的外部文本文件能够滚动:
    1.用工具箱中的文本工具,选择动态文本,给动态文本一个变量名,如:msg,在编辑区拖出一个文本框
    2.新建一层,制作两个按扭(一个调用,一个清除)拖放到此层中
    3.新建一层,在动态文本框的右侧用矩形工具画一个竖条,高度和动态文本一样;再制作一个向上的方向"箭头"按F8转为按扭元件;复制一个"箭头"按扭,垂直镜象,使这两个按扭和竖条的两端对齐.
    4.调用按扭上的AS:
    on(release){//松开鼠标后执行下面的代码;
    loadVariables("msg1.txt",msg);//调用msg1.txt文本文件到动态文本框msg中;
    System.useCodepage=true;//使外部文件的中文字符能够正确显示;
    }
    清除按扭上的AS:
    on(release){
    _root.msg="";//清除动态文本框中的内容;
    }
    向上的按扭上的AS:
    on(press){//在按扭的感应区上每按一次鼠标执行下面的代码;
    _root.msg.scroll=_root.msg.scroll-1;//文本向下滚动一行;
    }
    向下的按扭上的AS:
    on(press){//在按扭的感应区上每按一次鼠标执行下面的代码;
    _root.msg.scroll=_root.msg.scroll+1;//文本向上滚动一行;
    }
    Ctrl+Enter测试.

    当然代码也可以写在帧上调用按扭的实例名是bt1,清除按扭的实例名是bt2,向上按扭的实例名是:up,向下按扭上的实例名是down)
    在第一帧上加如下代码:
    _root.bt1.onRelease=function(){//松开鼠标后执行下面的代码;
    loadVariables("msg1.txt",msg);//调用msg1.txt文本文件到动态文本框msg中;
    System.useCodepage=true;//使外部文件的中文字符能够正确显示;
    }
    _root.bt2.onRelease=function(){//松开鼠标后执行
    _root.msg="";//清除动态文本框中的内容;
    }
    _root.up.onPress=function(){//在向上按扭上每按一次鼠标执行下面的代码;
    _root.msg.scroll=_root.msg.scroll-1;//文本向下滚动一行;
    }
    _root.down.onPress=function(){//在向下按扭上每按一次鼠标执行下面的代码;
    _root.msg.scroll=_root.msg.scroll+1;//文本向上滚动一行;
    }

    二.调用外部*.swf文件(加载到影片剪辑中):
    外部*.swf文件要和编辑的Flash文件放在同一目录下
    1.新建立一个空的影片剪辑mymc,把它放在场景中,实例名是:mymc.
    2.新建一层,制作两个按扭(一个调用,一个清除)拖放到此层中
    3.调用按扭上的AS:
    on(release){//鼠标离开按扭后执行下面的代码;
    loadMovie("flash8.swf","mymc");//加载外部的"flash8.swf"文件到"mymc"空影片剪辑中;
    mymc._x=70;//加载影片的X轴坐标;
    mymc._y=20;//加载影片的Y轴坐标;
    mymc._xscale=70;//加载影片的宽度;
    mymc._yscale=70;//加载影片的高度;
    }
    清除按扭上的AS:
    on(release){//鼠标离开按扭后执行下面的代码
    unloadMovie(mymc);//删除用loadMovie加载的*.swf文件;
    }
    Ctrl+Enter测试

    三.调用外部*.swf文件(加载到时间轴上):
    外部*.swf文件要和编辑的Flash文件放在同一目录下
    1.制作两个按扭(一个调用,一个清除)拖放到场景中
    2.调用按扭上的AS:
    on(release){//鼠标离开按扭后执行下面的代码
    loadMovie("flash8.swf",1);//加载外部的"flash8.swf"文件到场景中,层深为1;
    }
    清除按扭上的AS:
    on(release){//鼠标离开按扭后执行下面的代码
    unloadMovie(1);//删除层深为1的用loadMovie所加载的"flash8.swf"文件
    }
    Ctrl+Enter测试。
    当然二和三的代码都可以写在帧上。

    四.调用外部图片(加载到影片剪辑中)
    外部图片必须和正在编辑的Flash文件放在同一目录下
    1.制作两个按扭(一个调用,一个清除)拖放到场景中
    2.制作一个空的影片剪辑,拖到场景中,实例名是:mymc;
    3.时间轴上第一帧上的AS:
    i=0;//定义一个变量i,并且赋初值为0;
    调用按扭上的AS:
    on(release){//鼠标离开按扭后执行下面的代码;
    i++;
    if(i>9){//因为外面这有9张图,当变量大于9的时候,让变量为1,这样能够使加载的图片是连续的,即,每点一次按扭,就换一张图,等到换到第9张图,再点按扭,则循环到第一张图(j1.jpg到j9.jpg,因为没有j0.jpg,如果i=0,则会提示没有找到j0.jpg);
    i=1;
    }
    loadMovie(("j"+i)+".jgp",mymc);//从j1.jpg开始加载图片到影片剪辑mymc中;
    mymc._x=110;//以下设置加载图片的属性
    mymc._y=35;
    mymc._xscale=130;
    mymc._yscale=130;
    }
    清除按扭上的AS:
    on(release){
    unloadMovie(mymc);//删除掉用loadMovie加载到影片剪辑的图片;
    }
    Ctrl+Enter测试。
    当然AS可以写在帧上。

    五.调用外部声音文件(加载到场景中)
    外部声音文件必须和正在编辑的Flash文件放在同一目录下
    1.制作两个按扭(一个调用,一个清除)拖放到场景中
    2.调用按扭上的AS:
    on(release){//鼠标离开按扭后执行下面的代码;
    mySound=new Sound();//建立一个新的声音对象mySound;
    mySound.loadSound("zaihuni.mp3",true);//加载外部的*.mp3声音文件到mySound对象中,并且按流的方式播放(参数为false时,是以装载完后播放);
    }
    清除按扭上的AS:
    on(release){
    mySound.stop();//当按下清除按扭后,停止声音的播放
    }
    Ctrl+Enter测试。


    如何在Flash中调用EXE文件?
    来源:中国flash技术中心 发布:doudou 发布时间:2006-6-17 22:54:44
    fscommand("exec", "path/*.exe")
    path为路径名,可以是绝对路径也可以是相对路径。
    导出的.EXE文件如何自动关闭?
    在flash最后一帧上或在按钮上加
    fscommand("quit")

  • Flash中未公开的使用摄像头和麦克风的秘密

    2007-08-24 10:25:49

    摄像头:
    在Library里新建Video,拖到主场景里,给个名字比如cam,然后在_root第一帧写:
    _root.cam.attachVideo(Camera.get());

    播放的时候先要从右键settings里选择允许播放器使用Camera,然后如果你有Camera的话就可以看到了!

    Flash MX其实有Camera这个对象,
    Camera.get()方法返回当前可用摄像头的引用
    Camera.names[]是一个数组,每个元素是一个系统安装的摄像头的名字。

    麦克风:
    _root.createEmptyMovieClip("micAudio", 1);
    _root.micAudio.attachAudio(Microphone.get());
    _root.myMic = Microphone.get();
    _root.myMic.setUseEchoSuppression(1);//使用回声消除,0或1
    _root.myMic.setRate(44);//设定采样率44kHz,其他可以是5,8,11,22kHz
    _root.myMic.setSilenceLevel(5);//尚不明确
    _root.myMic.setGain(25);//增益,0-100

    另外,Microphone.activityLevel()返回麦克风音量,-1-100

    使用环境:flash Player 6, 2004,本地使用或者flash Communication Server MX环境下。
    先来做一个小的实验,请有网络摄像头的朋友做好准备。
    打开flash MX,新建一个movie。选中菜单Window>Library,调出Library面板。在Library面板右上角的pop-up菜单上选中New Video选项,在Library里面将会出现一个Video对象的图标(也是Communication的一个新对象)。

    将这个东东拖进主场景,在属性面板上给它起一个名字myBox。选中菜单Window>Actions,调出,actionscipt编辑面板,选中当前的帧,写下如下的代码:
    //抓取当前默认的摄像头图像
    cam = Camera.get();
    //把图像在flash里面播放出来
    myBox.attachVideo(cam);
    运行一下,会首先弹出一个安全性提示对话框,询问本地是否允许使用摄像头 ,确定以后,你就会看见摄像头采集的图像就能够在flash里面播放了。是不是巨简单,这就是MM公司的宗旨:不求麻烦,但求简单。嘿嘿,这是我加的台词。
    当然,Camera对象和Video对象的出现主要是为了在网上运用,提供了针对Camera网络设置的一系列属性、方法和处理器。
    方法:Camera.get,Camera.setKeyFrameInterval,Camera.setLoopback,Camera.setMode,Camera.setMotionLevel,Camera.setQuality;
    属性:Camera.activityLevel,Camera.bandwidth,Camera.currentFps,Camera.fps,Camera.height,Camera.index,Camera.keyFrameInterval,Camera.loopback,Camera.motionLevel,Camera.motionTimeOut,Camera.muted,Camera.name,Camera.names,Camera.quality,Camera.width。
    处理器:Camera.onActivity,Camera.onStatus。
    这里只是提供一个介绍,有兴趣的朋友可以去MM的网www.macromedia.com找资料看的。
    反正有兴趣的一定会去看,没有兴趣的翻译出来也不会看。
    ************************************************************
    有的朋友没能看见弹出的安全性提示面板,可以这样做。
    在电影上点击右键“设置”(setting...),在弹出的面板上面选择第一个标签项,去掉“记住”(remember)选项,再运行一下就行了。
    ---------------------如果还没有出现------------------
    看到最后一个标签面板,camera面板,只有当这里检测到并出现了下拉菜单的时候,
    运行上面的代码才能弹出上面的第三幅图所表示的安全性提示面板。

    作者:vista
    mx和2004在camera上好像差不多,有什么改进还真是不清楚


  • FSCommand功能详解

    2007-08-24 10:19:00

    fscommand(cmd_string, arg_string)
    执行主机端指令。cmd_string指定所要执行的指令名,可为FlashPlayer的
    指令或浏览器javascrīpt函数。arg_string声明该指令所用到的参数。
    FlashPlayer的指令有(只能在独立播放器时使用):
    "fullscreen" 是否全屏播放,参数为true或false
    "allowscale" 是否允许通过拉伸窗口缩放影片,参数为true或false
    "showmenu" 是否在播放器显示菜单,参数为true或false
    "trapallkeys" 是否屏蔽播放器的快捷键(如Esc表示停止播放并恢复
    "save" 隐藏属性,作用是存变量到文本文件.
    视窗显示),参数为true或false。但Alt+F4系统快捷
    键(关闭窗口)依然可用。
    "exec" 运行arg_string所指定的文件。

    ■□ FSCommand语句中的exec命令可以使swf 文件具有读写磁盘的功能
    这部分内容说的是,FSCommand->exec命令与操作系统进行交互的用法,包括如何打开本地文件,存储文件,建立目录,打开浏览器窗口以及其它外部程序。针对MAC机和PC机使用不同的操作系统,FSCommand语句在实际写法上不尽相同,本文以PC机为例进行说明。(MAC机中的情况不作翻译)

    适用于Windows 9X的FSCommand->exec命令详细说明:
    (注:若要将以下命令句法移植到NT/2000/Me上,不能原封不动的照搬,需要略作改动,请自行实践。)
    1、存储文件到硬盘
    有时我们想要在用户的机子上留下cookie,或在用户的硬盘上存储一些其它类型的信息,唯一可行的方法就是借助FSCommand,它通过调用用户Windows系统的command.com命令打开MS-DOS窗口实现文件的存储。因为使用DOS命令行的方式生成文件,所以MS-DOS窗口是必然要出现的,但在高配置机子上,这个过程一闪而过,用户不易察觉。使得该命令生效的前提是,含有这个FSCommand语句的swf文件必须是在本机上运行,而不是通过网络来访问。

    举例:将swf文件中文本输入框(变量名为:textbox)的内容存到一个新创建的和swf文件位于相同目录下的名为textfile.txt的文件中,并作为值赋给新的变量var。如下书写FSCommand 语句:
    打开Action面板选择Normal模式,在语句列表中选取FSCommand语句,转到面板下部:
    在Command框中填写:exec (不要复选其后的Expression复选框)
    在Arguments框中填写:"command.com" add chr(9) add "/c" add chr(9) add "echo" add chr(9) add "var=" add textbox add ">textfile.txt" (一定要将其后的Expression复选框打上钩!)
    若在Expert模式下编写,则应写成:
    fscommand ("exec", "command.com" add chr(9) add "/c" add chr(9) add "echo" add chr(9) add "var=" add textbox add ">textfile.txt");

    说明:一个chr(9) 表示一个空格;/c为command.com的参数,加上这个参数其后的命令才能被执行;>是重定向符,我们正是靠它将变量值写入textfile.txt中。另外,还可指定文件存放目录,如要在用户桌面上建立textfile.txt文件,那么将">textfile.txt"改为">c:\\windows\\desktop\\textfile.txt"
    【注】:\\ 是转意字符。在Flash中,“ \ ”被当成保留关键字,已失去了本来的意义,所以要想显示斜杠 \ ,必须加前缀转意符 \ ,使之是还原本来的意义,连在一起写就成了两个斜杠的形式。又比如,要想表示单引号,须写成 \' 这样的形式;实现回车的效果,须用转意符号 \r 。

    2、删除硬盘上的文件
    通过FSCommand->exec命令还可以删除硬盘上的文件,下面的语法只适用于Windows 9X系统。
    举例:将前面创建的textfile.txt删除
    打开Action面板选择Normal模式,在语句列表中选取FSCommand语句,转到面板下部:
    在Command框中填写:exec (不要复选其后的Expression复选框)
    在Arguments框中填写:"command.com" add chr(9) add "/c" add chr(9) add "del" add chr(9) add
    "textfile.txt" (一定要将Expression复选框打上钩!)
    若在Expert模式下编写,则应写成:
    fscommand ("exec", "command.com" add chr(9) add "/c" add chr(9) add "del" add chr(9) add
    "textfile.txt");
    警告:使用这个命令要慎重,因为是采用DOS命令删除文件,在回收站里是看不到的被删文件的。还有,万勿用来做坏事。

    3、在硬盘上新建目录
    通过执行FSCommand->exec生成的cookie若置于和所属swf文件位于同一目录下,容易被识别,用户在清理系统垃圾时极有可能将其清除,那样的话就失去意义了,考虑到用户一般不会轻易删除文件夹,我们专门新建一个目录存放cookie不失为一个好计。

    举例:在swf文件所在目录下新建一个名为textfile的子目录
    打开Action面板选择Normal模式,在语句列表中选取FSCommand语句,转到面板下部:
    在Command框中填写:exec (不要复选其后的Expression复选框)
    在Arguments框中填写:"command.com" add chr(9) add "/c" add chr(9) add "md" add chr(9) add
    "textfile" (一定要将Expression复选框打上钩!)
    若在Expert模式下编写,则应写成:
    fscommand("exec","command.com" add chr(9) add "/c" add chr(9) add "md" add chr(9) add "textfile"
    说明:md是DOS命令集中用来建立目录的专用命令;如果换成rd则可以删除硬盘上已存在的目录,提醒诸位三思而后行。

    ■□ 用FSCommand调用EXE可执行程序
    我们都知道,调用一个可执行程序(扩展名为.exe或.bat或.com) 和打开一个一般文件是不同的,前者可自动运行,而后者需要相应的可执行程序支持打开,像扩展名为doc和pdf的文件必须由相应的可执行程序才能打开阅读。分三种情况考虑:
    ● 开启一个外部可执行程序:扩展名.exe可以省略。具体来说,若一个exe文件(假设为another.exe)和该swf文件本身在同一个目录下,则直接键入程序文件名即可。如:
    fscommand("exec","another")
    否则,应写明路径。如打开IE浏览器窗口:
    fscommand("exec","c:\\progra~1\\intern~1\\iexplore")
    //注意DOS下对长文件(夹)名的处理形式。
    下面两种情况也可以不写路径——
    (1)当可执行程序是在c:\windows目录下时,可以不写路径。如调用windows的计算器,下面三种写法均可:
    fscommand("exec","c:\\windows\\calc.exe")
    fscommand("exec","c:\\windows\\calc")
    fscommand("exec","calc")
    (2)调用DOS命令也可省略路径。如下例打开MS-DOS下的Edit编辑器:
    fscommand("exec","edit.com")
    如果熟悉批处理文件写法,通过FSCommand->exec命令执行批处理文件可以一举多得。
    ● 调用默认程序打开一般文件:这种情况不能省略扩展名,同样要注意文件路径。比如我们要打开和该swf文件本身在同一个目录下的名为fs.htm的文件,则命令写作:
    fscommand("exec","start" add chr(9) add "fs.htm")
    执行后,如果用户机子默认的浏览器是IE,则自动调用IE打开这个网页文件。
    ● 指定程序打开一个一般文件:Windows并未规定一种类型的文件只能由一种程序打开(比如.txt文件既可以用记事本打开,也可以用写字板阅读),这就使我们可以任意选择可用于打开一般文件的可执行程序。当然前提是在大多数用户机子上都能够找到我们所指派的可执行程序,因此实际上能选取的是那些常用的、随windows 9X预装的程序,像记事本(notepad)、写字板(write)、IE浏览器(iexplorer)、command命令等等。如我们希望调用客户机上的“写字板”程序,打开一个和该swf文件本身在同一个目录下的名为fs.txt的文本文件,可以这么写命令: fscommand("exec","c:\\windows\\write.exe" add chr(9) add "fs.txt")

    前已述及,凡是在c:\windows目录下的可执行程序,在书写FSCommand->exec命令时都可以省略路径,简写成:fscommand("exec","write" add chr(9) add "fs.txt") 也是正确的。

    以上只对FlashMX以下版本才有效
    ----------------------------------------------
    Flash MX中增强了安全性,它虽然也可以调用exe文件,但它是有条件的。
    1.你的flash文件不能是swf,而应该是exe文件,比如jimsons.exe;
    2.要在jimsons.exe同一目录中新建一命名fscommand目录,你要调用的外部可执行文件要在fscommand目录下,且不能在子目录下,比如是notepad.exe,请copy notepad.exe到fscommand目录下;
    3.action的写法为:
    on (release) {
    fscommand("exec", "notepad.exe");
    }
    4.导出exe格式
    发布方法如下:
    选中 File -> Publish Settings 或按ctrl+shift+F12 ,它默认的发布类型为HTML(.html)与Flash(.swf),你将这两项取消,选中Windows Projectors(.exe)即可将你的Flash文件直接发布为exe可执行文件 ,按ctrl+F12即可发布。若你的文件尚未保存则它会发布在你flash的安装目录中 ,若你的文件已保存则会发布在你的文件同一目录下 。还有一种比较简便的方法是:
    先用 File -> Export Movie...或按Ctrl+Alt+Shift+S 导出swf文件 ,再打开这个文件,通过 文件 -> 创建播放器 即可产生EXE可执行文件 。
    下面有个例子
    ―――――――――――――――――――――――
    □■ 关于 Fscommand 和 javascrīpt 的配合

    在网页里面,flash播放器是可以和浏览器通讯的。你可以在flash 里面用 Fscommand() 发送参数给浏览器,然后在浏览器里面用 Movie1_DoFscommand() 获得参数。movie1是你在html里面给这个swf文件的ID名。
    •新建一个flash,插入一个按钮 ,在按钮上添加AS
    on (release) {
    fscommand("press");
    }
    • 作用为当鼠标按下这个按钮时,发出一个名字叫"press"的FS Command
    • 然后把它插进网页中,给它起一个ID的名字,如"jimsons";
    • 然后在<head></head>中加进如下的代码:
    <scrīpt LANGUAGE="javascrīpt">
    function jimsons_DOFSCommand(command,args)
    //上面的一般是调用FS Command所需要的格式,其中"jimsons"就是给插入网页中的FLASH动画的ID名字
    {
    if (command=="press")
    //当fs command="press"时(按钮被按下时发出这个FS Command)
    alert("呵呵,不要碰我啦!");
    //弹出警告菜单,这是属于javascrīpt里的语句
    }
    </scrīpt>
    <scrīpt LANGUAGE="VBscrīpt">
    Sub jimsons_FSCommand(ByVal command, ByVal args)
    call jimsons_DoFSCommand(command, args)
    end sub
    </scrīpt>
    //运用VBscrīpt,当FLASH发出FS Command时,执行flash1_DoFSCommand(command, args);
    //flash1为FLASH动画的id ,这也是运用FS Command时一般所需要的格式
    • 将flash插入到网页中,将其ID号命名为jimsons如下
    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
    codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0" name="jimsons" width="300" height="300" id="jimsons">
    <param name="movie" value="jimsons.swf">
    <param name="quality" value="high">
    <embed src="jimsons.swf" width="300" height="300" quality="high" pluginspage=" http://www.macromedia.com/go/getflashplayer" ;; type="application/x-shockwave-flash"
    name="jimsons"></embed></object>

    □■ Flash Methods函数集
    看了上面的例子,你一定对Flash Methods有所了解了吧!下面我来介绍一下Flash Methods的全部函数:
    Flash Method函数 函数解释
    Play() 使已停止了的FLASH动画在停止处开始播放
    格式:YourMovieName.Play()
    StopPlay() 停止正在播放的FLASH文件
    格式:YourMovieName.StopPlay()
    IsPlay() 如果FLASH文件正在播放中,此函数值为true
    例如:if (YourMovieName.IsPlaying)
    alert("Playing")
    如当动画正在播放,就会弹出一个警告条。
    GotoFrame(int frameNum) 控制FLASH跳到指定的frame
    格式:YourMovieName.GotoFrame(10)
    TotalFrames() 传回FLASH动画的总帧数
    格式:YourMovieName.TotalFrames()
    CurrentFrame() 传回FLASH动画目前所在的帧数减一,FS Command控制的帧都是由0开始的
    格式:YourMovieName.CurrentFrame()+1
    Rewind() 控制FLASH动画条回到第一帧并停止
    格式:YourMovieName.Rewind()
    SetZoomRect(int left, int top,int right,int bottom) 放大指定的坐标区域(int left=左坐标的整数;int right为右坐标的整数;int top和int bottom分别表示上坐标和下坐标的整数) 
    Zoom(int percent) 改变FLASH动画的大小。这函数只允许你将放大后的 图片缩小到原图片的大小
    YourMovieName.Zoom(50)放大一倍
    YourMovieName.Zoom(200)缩小一倍
    YourMovieName.Zoom(0)恢复原始尺寸
    Pan(int x,int y,int mode) 平移放大后的FLASH动画。x,y表示移动目的地的x轴和y轴的坐标;int mode表示 表示坐标的单位,但其值为"0"时,以象数为单位,为"1"时,以百分比为单位。
    PercentLoaded() 回传0~100的值,此值为浏览器载入FLASH的百分比程度。可用此功能制作loading画面
    如:if (YourMovieName.PercentLoaded()<100)
    YourMovieName.GotoFrame(YourMovieName.PercentLoaded())
    LoadMovie(int layer,String url) 载入其他的FLASH动画,"int layer"为level的值,数值越大,动画就放得越上;"string url"为要栽入的动画的路径和名称
    如:LoadMovie(1, "yourmovie.swf")表示把yourmovie.swf的动画加载到原来的动画上,level为1
    LoadMovie("", "yourmovie.swf")表示卸载yourmovie.swf动画
    TGotoFrame(String target,int frameNum) 控制动画跳到指定的movie clip的第几帧
    TGotoFrame("_flash0/mm",10)表示跳到instance name为mm的movie clip的第十帧
    TGotoLabel(String target,String label) 控制动画跳到指定的movie clip的指定的label
    TGotoFrame("_flash0/mm","ten")
    TCurrentFrame(String target) 传回指定的movie clip的当前所在帧减一
    fras=YourMovieName.TCurrentFrame("_flash0/mm")+1
    TCurrentLabel(String target) 传回指定的movie clip当前所在的label
    label=play_movie.TCurrentLabel("_flash0/mm")
    TPlay(String target) 控制指定的movie clip从停止出开始播放
    YourMovieName.Play("_flash0/mm")
    TStopPlay(String target) 控制指定的movie clip停止播放
    YourMovieName.Play("_flash0/mm")
    GetVariable(variable_name) 获取变量
    SetVariable(variable_name,value) 变量赋值
    TCallFrame(movie_clip,frame_number) call指定帧上的action
    TCallLabel(movie_clip,label) call指定标签上的action
    TGetProperty(movie_clip,property) 获取movie_clip的指定属性
    TSetProperty(movie_clip,property,number) 设置movie_clip的指定属性
       需要说明的是:最后两个函数在获取movie_clip的属性时,是以0到18的数字来表示的。下面列出它们分别代表的意思:
    属性 作用 数字 使用方式
    X Position X坐标 0 Get,Set
    Y Position Y坐标 1 Get,Set
    X Scale X方向缩放比率 2 Get,Set
    Y Scale Y方向缩放比率 3 Get,Set
    CurrentFrame movie_clip当前所在帧数 4 Get
    TotalFrames movie_clip总帧数 5 Get
    Alpha movie_clip的透明度 6 Get,Set
    Visibility movie_clip是否可见 7 Get,Set
    Width movie_clip的宽度 8 Get
    Height movie_clip的高度 9 Get
    Rotation movie_clip的旋转度 10 Get,Set
    Target movie_clip的路径 11 Get
    Framesloaded movie_clip已载入的帧数 12 Get
    Name movie_clip的实体名字 13 Get,Set
    DropTarget movie_clip的拖拽 14 Get
    Url 包含movie_clip的动画的url 15 Get
    HighQuality 设置画面质量为高质量 16 Get,Set
    FocusRect 显示按钮边框 17 Get,Set
    SoundBufTime 预设声音缓冲时间 18 Get,Set

       我们可以看到,FS Command为Flash打开了一个使用脚本语言的接口,这可以弥补Flash在函数上的不足。所以,利用好这个方法,将使我们在制作Flash动画时如虎添翼!

    □■ 最后,我想说说在FLASH中如果想调用javascrīpt(或VBscrīpt)的另外一种方法,不需要用FS Command, 只需要运用getURL.
    • 这做法为先在<head>与</head>之间写如下javascrīpt代码:
    <scrīpt language="javascrīpt">
    function jimsons(theURL,winName,features) {
    window.open(theURL,winName,features);
    }
    </scrīpt>
    • 意思是定义一个jimsons()的函数,若被调用时,就打开一个新的窗口。
    函数里面有三个参数theURL是网址,winName是网页的标题,features是用来设置一些窗口特性如是否显示状态栏,滚动条等
    • 然后就用FLASH做一个按钮,把它拖到场景后,在按钮上写入AS
    on (release) {
    getURL("javascrīpt:jimsons(http://bbs.flash8.net&#39;,Jimsons制作 ,scrollbars=no,width=550,height=400)");
    }
    • 作用是,当按下按钮时,就从本网页中的javascrīpt获取jimsons()这个函数。

    下面压缩包中有两个例子分别FScommand与javascrīpt的结合与getURL与javascrīpt的结合
    将页面设为首页和加入收藏夹
    【 用getURL的方法 】
    设为首页:
    on (release) {
    getURL("javascrīpt:void(document.links.style.behavīor=url(#default#homepage));void document.links.setHomePage( http://www.flash8.net/& #39;)", "_self", "POST");
    }
    注意要将网页中的flash的ID号命名为"links"
    加入收藏夹:
    on (release) {
    getURL("javascrīpt:void window.external.AddFavorite( http://www.flash8.net& #39;,闪吧);", "_self", "POST");
    }
    【用fscommand的方法】
    1,先在flash的按钮上添加代码:
    首页:
    on (release) {
    fscommand("setHomePage", " http://www.flash8.net" ;;;;);
    }
    收藏夹:
    on (release) {
    fscommand("addFavorite", " http://www.flash8.net |闪吧");
    }
    然后在发布设置中选择flash with fscommand,发布成html
    2,修改html:
    找到
    // Handle all the the FSCommand messages in a Flash movie </E< p>
    function sethomepage_DoFSCommand(command, args) {
    }
    这一段,修改成:
    // Handle all the the FSCommand messages in a Flash movie
    function sethomepage_DoFSCommand(command, args) {
    var sethomepageObj = InternetExplorer ? sethomepage : document.sethomepage;
    if (command == "setHomePage") {
    document.links[0].style.behavīor = "url(#default#homepage)";
    document.links[0].setHomePage(args);
    } else if (command == "addFavorite") {
    args = args.split("|");
    window.external.AddFavorite(args[0], args[1]);
    }
    }
    最后,如果html里一个链接都没有,还需在<scrīpt LANGUAGE=javascrīpt>这句的前面添加一句<a href="javascrīpt:"></a>


  • java分割图片

    2007-08-24 10:06:13

    Java线程控制的图像分割与合成

    索红光 石乐义 丁淑妍 高振东

      摘 要:使用Java对WEB静态图像进行分割重组,然后根据用户的交互操作合成显示,并利用线程对程序的并发性加以控制,从而达到图像显示的动态性和交互性效果。
      关键词:Java语言 类Class 线程Thread

      Java是一种面向对象的编程语言。它具有与平台无关、面向对象、动态、安全等特点,允许直接使用多线程方式进行编程,对程序进行并发控制。Java还支持分布式网络操作,从而能够方便地进行网络文件对象的存取。利用Java语言本身提供的绘图功能,可以绘制一些简单的图形。而对于复杂图形,一般先用绘图软件制成图像,然后采用Java所提供的方法对图像下载并进行处理和控制,从而实现静态图像的动态显示。
    1 Java图像处理与线程的并发控制
    1.1 Java图像处理
      Java语言提供了丰富的类(Class)、接口(Interface)以及相应的调用方法(Method)。使用这些类或接口,可以定义自己的类或子类,充分利用Java面向对象的特性进行编程。在java.awt包中,提供了专门的Image类,它是1种抽象类,可提供抽象的方法描绘图片的一些共同特性。而在Applet类和Tookit类中都提供了2种getImage()方法下载图像,分别根据绝对地址和相对地址查询所要下载的图像。通常采用相对地址的下载方法,它的语法定义及功能如下:
      1.public Image getImage(URL url,String name)
      功能:根据相对地址下载图像。
      参数:url——URL(统一资源定位)基地址,
    name——图像文件名。
      获取图像后就可以调用Graphics类提供的drawImage()方法显示图像。
      2.public drawImage(Image img,int x,int y,observer)
      功能:在指定位置显示图像。
      参数:img——待显示图像,x——横坐标,y——纵坐标,observer——图像监视器,用来监视图像的下载情况,接受图像装载信息(当图像完全载入时返回True,否则返回False)。
      在显示图像时,通常希望获得对图像的控制,从而以自己喜欢的各种方式实现媒体播放。为此,Java专门提供了用于跟踪包括图像和声音等多媒体对象的ImageObserver类和MediaTracker类,在本文程序中主要用到的是跟踪多幅图像状态的MediaTracker类。
    1.2 Java多线程并发功能
      目前,线程(Thread)已经为许多操作系统和应用开发系统所采用。线程是程序的单个控制流,具有顺序程序的特点,但是线程不是1个程序,它仅仅是程序的1个执行序列。线程具有很强的并发功能,在同一时刻可能有多个线程同时处于执行状态。线程是动态的,具有一定的生命周期,分别经历从创建、执行、阻塞直到消亡的过程。Java语言中提供了专门的Thread类,以支持直接的多线程编程。Thread类提供了对线程的控制方法,如Start(),Stop(),Run()、Suspend()、resume()、Sleep()以及Run()方法等等,它们可以对线程的状态进行控制。并可以运用SetPriority()方法设置线程的运行优先顺序。Thread类的定义方法如下:
      Thread(ThreadGroup group,Runable target,String name)
      SetPriority()用来设置线程的优先级。线程优先级是1个介于MINPRIORITY(在类中定义为1)和MAXPRIORITY(在类中定义为10)之间的整数。线程不同的优先级决定了不同线程之间的切换。
    2 Java图像分割与合成的算法及实现
      Java程序首先将一个完整的图像下载,然后将其分割成20个单元拼图,即分为5行4列。在本例中特地将第20幅图像单元设为1个空白图像,以便拼图时用户交互操作使用。这些参数分别定义在相应的变量中。
      final int XCELLS=5;  //每行拼图的数目
      final int YCELLS=4;//每列拼图的数目
      final int ALLCELLS=20;//分割元素的数目
      final int EMPTY=19;//将第20单元,即cells[19]置成
    //空白图像
      然后将这些图像分割单元存于1个Cell类数组cells[]中,在这里Cell类中含有图像以及它的起始位置和当前位置,其具体定义如下:
      class Cell
      {int sx,sy; //起始位置
      int cx,cy; //当前位置
      Image img; //单元图像
      public Cell(Image img,int x,int y) //Cell类构造函数
      {this.img=img;
      sx=x;sy=y;} //给起始位置赋值为x,y
      }
      为了对每个图像分割单元进行状态跟踪,还需要建立1个MediaTracker类的实体(instance),然后调用addImage()方法,为每个要跟踪的图像指定1个唯一的标识符。标识符决定了图像获取时的优先顺序并使得图像能够独立完整地进行处理。
      MediaTracker tracker=new MediaTracker(this)
      //为当前使用类建立1个MediaTracker实体,用于跟踪类
      //上的图像
      cells[EMPTY]=new Cell(createEmpty(),toPoint(EMPTY).x,toPoint(EMPTY).y);
      tracker.addImage(cells[EMPTY].img,0);
      //调用createEmpty()方法产生空白图像,并加入到所跟踪
      //的cells数组中20单元
      void setPosition(int x,int y)  //设置单元图像当前位置
      {cx=x;cy=y;}
      各个图像单元的位置存放于位置数组position里:
      int position[][]=new int[XCELLs][YCELLS]
      这样就可以使用Cell类数组cells[]对图像的各个单元进行操作,从而将各个单元图像进行合成显示,并通过position[][]数组改变各个单元的位置。为了对各单元进行并发操作,需要对线程加以控制,并通过鼠标事件和按键事件控制进程的开始、睡眠和进行等状态变化,其实现方法如下(仅以run()方法为例):
      Thread imageThread=null; //定义线程imageThread,初始
    //值为空
      public void run()
      {imageThread.setPriority(Thread.MINPRIORITY);//设置线
    //程执行优先级别

      try
        {imageThread.sleep(2000);//线程睡眠等待2000ms
        }catch(InterruptedException e){}
      first=changeArray();//调用changeArray()方法随机改变图
    //像单元位置
      while(!loaded)//判断图像若未被跟踪载入,则调用相关
    //方法跟踪并加载图像
        {repaint();
        try
         {imageThread.sleep(100);
         }catch(InterruptedException e){System.out.println(e);}
        }
      }
      changeArray()方法用来随机地改变图像单元的位置,其实现方法如下:
      boolean changeArray()
      {
      int source[]=new int[20];
      int full[]=new int[20];
      for(int i=0;i<ALLCELLS;i++)
        {
        int r=(int)(Math.random()*20);
        while(full[r]!=0)
        r=(r+(int)(Math.random()*20))%20;
        source[i]=r;
        full[r]=1;
        }
      int pos=0;
      for(int i=0;i<ALLCELLS;i++,pos++)
        {
        Point p=toPoint(source[pos]);
        cells[pos].setPosition(p.x,p.y);
        position[p.x][p.y]=pos;
        }
      x=cells[EMPTY].cx;
      y=cells[EMPTY].cy;
      return(false);
      }
      当applet执行后点击鼠标,线程就被启动,开始装载图像并执行changeArray()随机选择1个位置来移动图像单元,此时可以使用键盘移动图像上的任意单元到任何位置。在这里还有一个重要内容就是怎样将图像分割成许多的单元,我们可以通过引用CropImageFilter方法来分割图像,它是1个分割图像过滤器。其实现方法如下:
      Image crop(int pos)
      {//pos参数为调用函数给出的图像单元位置号
      Point p=toPoint(pos);//将位置号转化为坐标形式
      ImageFilter filter=new CropImageFilter(xside*p.x,yside*p.y,xside,yside);
      //在给定坐标和长宽的绝对矩形区域内创建分割图像过
      //滤器实体filter
      ImageProducer producer=new FilteredImageSource(baseImage.getSource(),filter;)

    //由原图像和分割图像过滤器实体创建新的图像

          //产生器producer
      return createImage(producer);//由图像产生器producer产生
    //图像并返回
      }

      通过以上步骤,整个图像的分割与合成显示就完成了。本程序主要利用了crop()、changeArray()、mousedown()、Thread()等方法以及几个表示程序运行状态的布尔变量实现了一个线程控制和动感图像相结合的图像处理过程。





  • loadVars类从远程文本中载入数据

    2007-08-24 09:59:17

    LoadVars 类在 Flash Player 6 中引入,为与 Web 服务器交换 CGI 数据的常见任务提供一个更清晰、更面向对象的接口。LoadVars 类的优点包括以下几项:

    *您无需创建容器影片剪辑来保存数据,或在现有影片剪辑中塞满特定于客户端/服务器通讯的变量。
    *类的接口与 XML 对象类似(XML 对象在 Actionscrīpt 中提供某些一致性)。它使用 load()、send() 和 sendAndLoad() 方法启动与服务器的通讯。LoadVars 和 XML 类之间的主要差别是 LoadVars 数据是 LoadVars 对象的属性,而不是存储在 XML 对象中的 XML 文档对象模型 (DOM) 树的属性。
    *类接口比旧的 loadVariables 接口更直观,其方法名为 load、send 和 sendAndLoad。
    *可以使用 getBytesLoaded 和 getBytesTotal 方法获取有关通讯的其它信息。
    *可以获取与数据下载有关的进度信息(尽管不能在数据完全下载前访问这些数据)。
    *回调接口通过 Actionscrīpt 方法 (onLoad) 实现,而不是 loadVariables 需要的 onClipEvent(数据)方法(此方法已经废弃,不赞成使用)。
    *具有错误通知。
    *可以添加自定义的 HTTP 请求标头。
    *您必须创建一个 LoadVars 对象来调用其方法。这个对象是用来保存已加载数据的一个容器。


    loadVars类从远程文本中载入数据
    loadVars类放在网页上时.需要从服务器载入文本数据.因为loadVars.load('')在载入时需要一定时间.导致后面在用到这个时.变量的值仍为未定义,致使程序出错.
    所以请教高手:如何让程序在这个类载入完成以后才能继续后面的执行代码.
    急盼回复.............
    l=new LoadVars()
    l.load("xxx.txt")
    l.onLoad=function(ok){
    if(ok){
    //在这里输入你要在加载后执行的代码代码
    }

    }


  • 载入外部文件时,许多人问到的问题

    2007-08-24 09:44:51

    以载入XML文件为例
    问题描述

    newsread = new XML();
    newsread.ignoreWhite = true;//忽略空白
    newsread.load("config.xml");//加载数据文件
    newsread.onLoad = function(success) {//如果加载成功
    if (success) {
    stat=this.childNodes[0].childNodes[0].attributes.edit;
    trace(stat);//输出显示了XML里面的数据
    }
    }
    trace(stat);//输出显示了空值

    这样写在第一帧!那么在函数完成之后内存会把数据清空!在函数外就没办法读到stat这个变量的值了
    有什么办法能把XML所读到的数据保留起来!并且不管在什么位置,什么帧上都可以读到该数据
    就是说如果把上面的代码写在第一帧!我在第二帧写上trace(stat);也可以正常输出XML里面的数据!


    原因:
    在执行载入XML文件的时候,Flash不会等待载入完成后再执行后面的代码
    因此,在XML文件没完全载入的情况下trace(stat)自然没有任何值
    而在XML文件载入完成后,会调用onLoad事件,因此trace时,会得到你想要的值

    比如:
    第一帧
    stop();
    newsread = new XML();
    newsread.ignoreWhite = true;
    //忽略空白
    newsread.load("config.xml");
    //加载数据文件
    newsread.onLoad = function(success) {
    //如果加载成功
    if (success) {
    stat = this.firstChild.firstChild;
    nextFrame();
    }
    };
    第二帧:
    trace(stat);

    便可获得正确的值

    为了更加表明问题所在
    第一帧:
    newsread = new XML();
    newsread.ignoreWhite = true;
    //忽略空白
    newsread.load("config.xml");
    //加载数据文件
    newsread.onLoad = function(success) {
    //如果加载成功
    if (success) {
    stat = this.firstChild.firstChild;
    }
    };

    第N帧:
    trace(stat);

    一般来说XML文件很小时,N > 1也应该能看到效果,但实际上本人在测试时,N>2才得获得stat的值(FPS12),这跟个人电脑的速度有关吧


  • 倒计时类

    2007-08-24 08:59:42

    Flash探索
    最近在写游戏,有个倒计时效果,写个类
    import mx.events.EventDispatcher;
    import mx.utils.Delegate;
    //倒计时
    class game.time.Time {
    private var _id:Number;
    private var _second:Number;
    private var _total:Number;
    private var dispatchEvent:Function;
    public var addEventListener:Function;
    public var removeEventListener:Function;
    public function Time(s) {
    EventDispatcher.initialize(this);
    _second = s;
    _total = s;
    }
    public function getTime() {
    return _second;
    }
    private function timeing() {
    if (_second>0) {
    _second--;
    this.dispatchEvent({type:"onPlay", value:_second});
    } else {
    this.dispatchEvent({type:"onStop", value:_second});
    trace("stop")
    this.stop();
    }
    }
    public function play() {
    _id = setInterval(Delegate.create(this, timeing), 1000);
    }
    public function stop() {
    _second = _total;
    clearInterval(_id);
    }
    }
    使用
    import game.time.Time;
    //倒计时的时间
    var _totalTime = 30;
    var _time = new Time(_totalTime);
    _time.addEventListener("onPlay", timeStart);
    _time.addEventListener("onStop", timeOver);
    //计时中..
    function timeStart(obj) {
    time = obj.value;
    score = _score;
    update();
    }
    //超时,结束游戏
    function timeOver() {
    gotoAndStop("over");
    }
    startBtn.onRelease=function(){
    //启动倒计时
    _time.play()
    }

  • 关于TXT文本中的多变量加载

    2007-08-24 08:58:17

    一开始的尝试的结果:
    加载同一文件到多个文本似乎失败了。
    可能的一种解释是第一个回车后的内容都被忽略了,测试出的结果支持上述想法。
    Support:文本中空一行后加载,啥都没有。
    所以,当第一个变量后出现了第二个回车键时,加载是不可能成功的。

    下面是刚开始的一些测试:

    1loadVarialbesNum
    1.1In Txt:

    DataInTxt=This it the Data.txt,make it a litte longer ,see what will happen?
    Tips=By Now ,I think ,you have known that How does loadVariablesNum have its power:)
    loadVarialbesNum("data1.txt",0);

    两个文本的层次都是一样的。
    _level0.a
    _level0.b

    1.2


    //In Txt:
    DataInTxt=This it the Data.txt,make it a litte longer ,see what will happen?
    Tips=By Now ,I think ,you have known that How does loadVariablesNum have its power:)
    //In FLA
    loadVarialbesNum("data1.txt",0);

    文本变量为Tips.

    结果,当然是什么也没有。

    1.3换了层次后想想都应该一样的:
    //这种想法被否定了,因为loadVarialbesNum是针对Text文本域的,而换层是一个针对MC的动作。

    2.1
    用两个内嵌Text文本域的MC:mcTxt1及mcTxt2
    各自内嵌的文本域变量分别为:DataInTxt及Tips
    //AS
    loadVariables("data1.txt","mcTxt1");
    loadVariables("data1.txt","mcTxt2");

    效果当然也是失败了。

    3暂时只好用两个文本进行解决了。
    用两个内嵌Text文本域的MC:mcTxt1及mcTxt2
    各自内嵌的文本域变量分别为:DataInTxt及Tips
    //AS
    loadVariables("data1.txt","mcTxt1");
    loadVariables("data2.txt","mcTxt2");

    4相对层级路径。
    正确的方法1:
    loadVariables("chDir/data1.txt","mcTxt1");
    loadVariables("chDir/data2.txt","mcTxt2");

    正确方法2:[好是奇怪,在DW里,这样写可是被看作根路径的]
    loadVariables("/chDir/data1.txt","mcTxt1");
    loadVariables("/chDir/data2.txt","mcTxt2");

    出错一:
    loadVariables("chDir\data1.txt","mcTxt1");
    Error opening URL "file:///D|/MyAS2/Loader/chDir\ata1.txt"

    出错二:
    loadVariables("\chDir/data1.txt","mcTxt1");
    Error opening URL "file:///D|/MyAS2/Loader/\hDir/data1.txt"

    出错三:
    loadVariables("\chDir\data1.txt","mcTxt1");

    Error opening URL "file:///D|/MyAS2/Loader/\hDir\ata1.txt"

    5由于Flash加强了安全性,尽管在自己机子上运行的挺好,
    可跑到Web上直接读数据就没法子了,唉~~~~

    6今天终于成功了:
    最近上网的时候稍微注意了一些跟随网址后变的一些内容,可以很清楚的看出来都采用的value=...&value=...形式。
    所以,想试试看加&号有没有用,结果,呵呵~~~成功了。
    6.1Trial1:
    loadVariablesNum
    文本中的内容
    DataInTxt=This it the Data.txt,make it a litte longer ,see what will happen?
    &Tips=By Now ,I think ,you have known that How does loadVariablesNum have its power:)
    //文本内容有回车也行的,只要有&号就能正确区分为多变量.
    DataInTxt=This it the Data.txt,make it a litte longer ,see what will happen?
    &Tips=By Now ,I think ,you have known that How does loadVariablesNum have its power:)

    主场景中只要一句就行了:
    loadVariablesNum("data1.txt",0);

    6.2Trial2:设定参2.1
    loadVariables:
    loadVariables("data1.txt","mcTxt1");
    loadVariables("data1.txt","mcTxt2");
    感觉会网页的朋友应该比较熟悉这个&号~~~

    7
    更正一下5,真正放到网上,还是可以读数据的(放在主页里面),不过有些不稳定~~~
    现在总结一下放到网页上的加载条件.
    a只能通过单文本加载.
    b第一个变量会被忽略,所以,可将变量文本写成下面的形式:
    false=hehe
    &DataInTxt=This it the Data.txt,make it a litte longer ,see what will happen?
    &Tips=By Now ,I think ,you have known that How does loadVariablesNum have its power:)

    再配合6.1及6.2都是可以的.

  • 关于鼠标拖拽的细节分析

    2007-08-24 08:57:26

        鼠标拖拽是一种较常用的效果,但在使用中发现有这样的问题,当被拖动的MC位于其它MC下方时,拖拽有可能异常结束,分析之后得到以下的结论:
      首先,同一时间只有一个目标可以被拖拽,因此,stopDrag()中不需要填写参数(因为只有一个目标)。
      其次,当MC在某一位置发生重叠时,上层的MC中对某一事件写的代码,将被优先执行,看上去就像是上层MC对下层的MC事件进行了拦截。
      当MC中包含了一个MC,并且对同一事件有各自的处理代码时,上最外层的MC中的处理方法将被调用,内部的方法将被忽略。
      这或者可以看作是事件处理程序上的优先级,也就是从上到下,由外到内,如果希望多个对象同时响应某个事件,应该采用添加侦听器模式。


  • 广告播放器设计模式

    2007-08-24 08:56:15

    这是一个简单的RIA应用

    加载部分代码:
    /**
    AbstractLoad类
    1.0 版
    19/10/2005
    版权所有 章精设(zjs35).
    */
    import mx.utils.Delegate;
    import mx.events.EventDispatcher;
    class fbook.load.AbstractLoad {
    private var dispatchEvent:Function;
    public var addEventListener:Function;
    public var removeEventListener:Function;
    private var loadObject:Object;
    private var loadID:Number;
    function getBytesLoaded() {
    return loadObject.getBytesLoaded();
    }
    function getBytesTotal() {
    return loadObject.getBytesTotal();
    }
    private function checkProgress() {
    var perLoaded:Number = Math.floor(getBytesLoaded()/getBytesTotal()*100);
    dispatchEvent({type:"onProgress", value:perLoaded});
    endLoad(perLoaded);
    }
    private function startLoad() {
    EventDispatcher.initialize(this);
    loadID = setInterval(Delegate.create(this, checkProgress), 30);
    dispatchEvent({type:"onProgress", value:0});
    }
    private function endLoad(perLoaded) {
    if (perLoaded>=100) {
    dispatchEvent({type:"onComplete", value:loadObject});
    clearInterval(loadID);
    }
    }
    }
    /**
    Movie类
    1.0 版
    19/10/2005
    版权所有 章精设(zjs35).
    */
    import fbook.load.AbstractLoad;
    class fbook.load.Movie extends AbstractLoad {
    private var loadObject:MovieClip;
    function Movie(mc) {
    //装载影片等的影片剪辑
    loadObject = mc;
    }
    public function load(url:String) {
    loadObject.loadMovie(url);
    startLoad();
    }
    public function unload() {
    loadObject.unloadMovie();
    }
    }
    /**
    Xml类
    1.0 版
    19/10/2005
    版权所有 章精设(zjs35).
    */
    import fbook.load.AbstractLoad;
    import mx.utils.Delegate;
    class fbook.load.Xml extends AbstractLoad {
    private var loadObject:XML;
    function Xml() {
    loadObject = new XML();
    loadObject.ignoreWhite = true;
    System.useCodepage = true;
    }
    public function load(url:String) {
    loadObject.load(url);
    startLoad();
    }
    }
    数据处理部分
    /**
    XMLParse类
    1.0 版
    19/10/2005
    版权所有 章精设(zjs35).
    */
    import fbook.load.Xml;
    import mx.utils.Delegate;
    import mx.events.EventDispatcher;
    class XMLParse {
    private var dispatchEvent:Function;
    public var addEventListener:Function;
    public var removeEventListener:Function;
    //存放广告url的数组
    private var urlArray:Array;
    //加载xml数据的Xml类的实例
    private var xmlData:Xml;
    //xml文件的url
    private var url:String;
    //loading
    private var showLoading:MovieClip;
    //构造函数,传递两个参数
    function XMLParse(url, loading) {
    EventDispatcher.initialize(this);
    this.url = url;
    showLoading = loading;
    urlArray = new Array();
    xmlData = new Xml();
    init();
    }
    //初始化函数
    function init() {
    xmlData.load(url);
    xmlData.addEventListener("onComplete", Delegate.create(this, loadComplete));
    xmlData.addEventListener("onProgress", Delegate.create(this, loadPorgress));
    }
    //加载完成后,读取节点中的数据
    function loadComplete(obj) {
    //隐藏loading
    showLoading._visible = false;
    //获取第一个节点
    var temp = obj.value.childNodes[0].childNodes;
    //通过循环,读取其中的数据
    for (var i = 0; i<temp.length; i++) {
    urlArray[i] = temp[i].attributes.url;
    }
    //分配一个事件
    dispatchEvent({type:"onDataLoaded", value:urlArray});
    }
    //加载过程中,显示loading
    function loadPorgress(obj) {
    if (!showLoading._visible) {
    showLoading._visible = true;
    }
    showLoading.bar._xscale = obj.value;
    showLoading.loading.text = obj.value+"%";
    }
    }
    //主播放器
    /**
    RMAPlayer类
    1.0 版
    19/10/2005
    版权所有 章精设(zjs35).
    */
    import fbook.load.Movie;
    import mx.utils.Delegate;
    import Trans;
    class RMAPlayer {
    private var urlArray:Array;
    private var urlIndex:Number = 0;
    //加载影片的实例
    private var imgLoader:Movie;
    private var transInstance:Trans;
    //放置广告的影片剪辑
    private var imgMc:MovieClip;
    //loading的实例名
    private var showLoading:MovieClip;
    public function RMAPlayer(mc, loading, url) {
    urlArray = url;
    imgMc = mc;
    showLoading = loading;
    transInstance = new Trans(imgMc);
    transInstance.addEventListener("onEndTrans", Delegate.create(this, nextImg));
    init();
    }
    function init() {
    loadImg(urlArray[urlIndex]);
    }
    private function loadImg(url) {
    var imgLoader = new Movie(imgMc);
    imgLoader.load(url);
    imgLoader.addEventListener("onProgress", Delegate.create(this, loading));
    imgLoader.addEventListener("onComplete", Delegate.create(this, loaded));
    }
    //显示loading
    function loading(obj) {
    if (!showLoading._visible) {
    showLoading._visible = true;
    }
    showLoading.bar._xscale = obj.value;
    showLoading.loading.text = obj.value+"%";
    }
    //加载完成
    function loaded(obj) {
    //清除loading
    showLoading._visible = false;
    //添加过渡
    //imgMc._alpha = 0;
    transInstance.trans_1();
    }
    //下一个广告
    function nextImg() {
    if (urlIndex>=urlArray.length-1) {
    urlIndex = -1;
    }
    urlIndex++;
    loadImg(urlArray[urlIndex]);
    }
    }
    过渡效果
    简单写了个测试
    /**
    Trans类
    1.0 版
    19/10/2005
    版权所有 章精设(zjs35).
    */
    import mx.events.EventDispatcher;
    class Trans {
    private var dispatchEvent:Function;
    public var addEventListener:Function;
    public var removeEventListener:Function;
    //设置过渡的影片剪辑
    private var _mask:MovieClip;
    //加载广告的影片剪辑
    private var _target:MovieClip;
    //时间的临时变量
    private var _time:Number = 0;
    //广告停留时间
    private var _delayTime:Number = 15
    function Trans(tar) {
    _target = tar;
    _mask = _target.duplicateMovieClip("mc", 1);
    drawRect(_mask, 300, 200);
    EventDispatcher.initialize(this);
    }
    public function trans_1() {
    var ins = this;
    //透明度变化的速度
    var v = -5;
    _mask._alpha = 100;
    _mask.onEnterFrame = function() {
    //开始透明度递减
    this._alpha += v;
    //当递减到小于或等于0时
    if (this._alpha<=0) {
    //开始计时
    ins._time++;
    //计时到延迟时间
    if (ins._time>=ins._delayTime) {
    //速度取反,透明度开始递增
    v *= -1;
    //临时时间清0
    ins._time = 0;
    }
    }
    //如果速度大于0并且透明度还原到100
    if (v>0 && this._alpha>100) {
    //删除事件处理函数
    delete this.onEnterFrame;
    //发生过渡完成的事件
    ins.dispatchEvent({type:"onEndTrans"});
    }
    };
    }
    function drawRect(mc, _w, _h) {
    with (mc) {
    beginFill(0xffffff, 100);
    moveTo(0, 0);
    lineTo(_w, 0);
    lineTo(_w, _h);
    lineTo(0, _h);
    lineTo(0, 0);
    endFill();
    }
    }
    }

361/212>
Open Toolbar