Flash实例教程:通过实例学习AS3.0【AS】
学习目的:
通过个实例了解到:
1.AS3采用了新的监听机制.例如:
添加事件:boarder_mc.addEventListener(MouseEvent.MOUSE_DOWN, drag);
事作处理函数: function drag(event:MouseEvent):void
{
if(event.target.name == "boarder_mc")
{
}
}
复制代码通过event.target.name来取得事件发生的对象名,2.AS3里没有了root,addChild相当于把某个mc搬到了舞台上,其实是TimeLine0.addChild(mc),同时保证该mc是在舞台的最顶层(AS3里没有了深度管理)。可以通过addChild将mc放在任何的mc内.
首先声明:本人大菜鸟一个,刚接触AS3不久,许多理念还没来得及灌输,这些case都是从网上down的,但因为解说是英文的,不利我们学习,我就充当一个translater,顺便可以让自己巩固一下知识。
水平有限,错误难免,欢迎大虾小虾,大鸟小鸟指正。
下面进入正题:
案例1:熟悉新的事件机制和addChild的运用
说明:拖动小人到滑板上,然后拖动滑板,可以发现小人已经跟滑板粘在了一起。
代码:
boarder_mc.addEventListener(MouseEvent.MOUSE_DOWN, drag);
boarder_mc.addEventListener(MouseEvent.MOUSE_UP, drop);
red_mc.addEventListener(MouseEvent.MOUSE_DOWN, drag);
red_mc.addEventListener(MouseEvent.MOUSE_UP, drop);
blue_mc.addEventListener(MouseEvent.MOUSE_DOWN, drag);
blue_mc.addEventListener(MouseEvent.MOUSE_UP, drop);
复制代码AS3采用了新的监听机制,而且注意到对每个mc的鼠标按下弹起都使用了相同的函数,
这就需要在函数里判断事件的发生者,从而做出相应的处理。 function drag(event:MouseEvent):void
{
if(event.target.name == "boarder_mc")
{
addChild(boarder_mc);
event.target.startDrag(true);
boarder_mc.x = mouseX;
boarder_mc.y = mouseY;
}
else
{
event.target.startDrag();
}
}
复制代码通过event.target.name来取得事件发生的对象名,AS3里没有了root,addChild相当于把某个mc搬到了舞台上,其实是TimeLine0.addChild(mc),同时保证该mc是在舞台的最顶层(AS3里没有了深度管理)。通过event.target来获取事件发生的对象,接着来看drop函数: function drop(event:MouseEvent):void
{
event.target.stopDrag();
if(boarder_mc.hitTestObject(red_mc))
{
red_mc.addChild(boarder_mc);
boarder_mc.x = 0;
boarder_mc.y = 0;
}
else if(boarder_mc.hitTestObject(blue_mc))
{
blue_mc.addChild(boarder_mc);
boarder_mc.x = 0;
boarder_mc.y = 0;
}
}
复制代码当鼠标弹起时,啥也不管,先停止拖动,如果小人和滑板有重合区域,则将小人放到滑板里,滑板就像一个container,boarder_mc成了red_mc的child,将boarder_mc的x坐标和y坐标清零是为了将小人放到滑板的正确位置。
如果小人已经成为了滑板的child,那么再次拖动滑板时,由于又执行了一次addChild(boarder_mc);所以滑板的父类又变成了舞台。
整个案例1的分析到此结束,涉及的知识点不多,主要是熟悉一下AS3的语法。
源文件下载: changing_parents_final.rar
========================================================================
Flash实例教程:通过实例学习AS3.0二
案例2:熟悉addChild和removeChild在不同的swf之间的运用,以及loader的用法。
说明:点击picture会载入另一个swf,点击载入的swf上的一个按钮,该swf消失。
加载一个mc用
var loadoader=new Loader();
load.load(new URLRequest("loadertest.swf"));
此时load作为一个mc
可以用removeChild方法把它删除。
代码:swfA(也就是按钮所在的flash)
var loaderoader = new Loader();
loader.load(new URLRequest("opup.swf"));
picture_btn.addEventListener(MouseEvent.CLICK, showPicture);
function showPicture(event:MouseEvent):void
{
addChild(loader);
}
复制代码AS3里用loader代替了loadMovie,load的时候不能直接添加路径名,需要通过URLRequest来载入。整段代码都很简单,首先载入Popup.swf,然后给监听按钮的click事件定义一个showPicture函数,这个函数的功能很简单,通过addChild把刚刚载入的swf放到舞台上。
swfB(载入的flash->opup.swf)
close_btn.addEventListener(MouseEvent.CLICK, closeWindow);
function closeWindow(event:MouseEvent):void
{
this.parent.parent.removeChild(this.parent);
}
复制代码很简洁,监听close按钮的click事件,事件触发时调用closeWindow函数,这里用到了parent,简单分析一下,由于这个swf已经被载入到另一个swf里,所以this.parent应该指代的是loader,而this.parent.parent则指代的是TimeLine0,也就是舞台。所以这句话也就比较好理解了:从舞台上卸下载入该swf的loader。
案例2分析到此结束。
源文件下载:different_movies.rar
————————————————————————————————————————————————–
Flash实例教程:通过实例学习AS3.0三
案例3:熟悉tween以及tweenEvent的运用
说明:点击标签载入特定的图片说明(其实是一个mc,只是坐标不同),同时还有渐隐渐现效果,没做loading,可能载入会有点慢。
代码:初始化,给一些变量赋值
import fl.transitions.Tween;
import fl.transitions.easing.*;
import fl.transitions.TweenEvent;
var homeX:Number = -301;
var homeY:Number = 110;
var newsX:Number = -17;
var newsY:Number = -777;
var aboutX:Number = -1354;
var aboutY:Number = -445;
var xTween:Tween;
var yTween:Tween;
var inTween:Tween;
var outTween:Tween;
复制代码
先是导入一些需要用到的类,然后定义几个坐标,这几个坐标都是一个大mc的不同位置。然后是初始化tween类,并对tween类监听。
xTween = new Tween(main_mc,"x",Strong.easeInOut,main_mc.x,homeX,2,true);
yTween = new Tween(main_mc,"y",Strong.easeInOut,main_mc.y,homeY,2,true);
inTween = new Tween(main_mc.home_mc,"alpha",None.easeNone,0,1,.5,true);
outTween = new Tween(main_mc.home_mc,"alpha",None.easeNone,1,0,.5,true);
xTween.addEventListener(TweenEvent.MOTION_FINISH,fadeIn);
xTween.addEventListener(TweenEvent.MOTION_START,fadeOut);
home_btn.addEventListener(MouseEvent.CLICK, navigate);
news_btn.addEventListener(MouseEvent.CLICK, navigate);
about_btn.addEventListener(MouseEvent.CLICK, navigate);
复制代码
实例化xTween,yTween后并不会马上就运行,如果在之后的代码发现了stop动作的话。这些参数跟AS2并没有多大差别。xTween和yTween是实现mc的缓动效果,inTween和outTween是实现渐隐渐现效果的。
这里只监听xTween而没有监听yTween,因为这两个是同时进行的所以监听一个就行了。最后是对3个按钮的click监听。
接下来就是最关键的上面提到的几个函数:
function navigate(event:MouseEvent):void
{
if(event.target == home_btn)
{
setTween(homeX,homeY,main_mc.home_mc);
}
else if(event.target == news_btn)
{
setTween(newsX,newsY,main_mc.news_mc);
}
else
{
setTween(aboutX,aboutY,main_mc.about_mc);
}
}
function setTween(tweenX:Number,tweenY:Number,tweenMC:MovieClip):void
{
xTween.begin = main_mc.x;
yTween.begin = main_mc.y;
xTween.finish = tweenX;
yTween.finish = tweenY;
tweenMC.alpha = 0;
inTween.obj = tweenMC;
xTween.start();
yTween.start();
}
function fadeIn(event:TweenEvent):void
{
inTween.start();
outTween.obj = inTween.obj;
}
function fadeOut(event:TweenEvent):void
{
outTween.start();
}
复制代码先来看看navigate函数,这是被3个按钮共同调用的函数,通过判断不同的target.name设置不同的setTween。再来看看setTween,参数tweenX和tweenY是目标坐标,tweenMC是目标mc,通过设置begin,finish,obj参数来改变xTween和yTween的初始坐标,目标坐标,作用对象,最后调用start函数开始运动。
fadeIn函数的作用是使inTween开始,并且将inTween作用的对象赋予outTween,这样outTween被调用的时候就能作用在正确的mc上了。
源文件下载:http://www.websbook.com/upimg/allimg/080321/20071126114920795.rar
案例4:熟悉xml的运用
说明:一个简单的相册,先载入xml,然后载入xml列表里的images缩略图,点击缩略图出现大图以及大图的说明。这个案例较前面几个复杂了一些,不过如果熟悉了AS3的语法,还是比较容易理解的。
代码:import fl.transitions.Tween;
import fl.transitions.easing.*;
var imageText:TextField = new TextField();
var fadeTween:Tween;
var imageLoaderoader;
var xml:XML;
var xmlList:XMLList;
var xmlLoader:URLLoader = new URLLoader();
xmlLoader.load(new URLRequest("data/images.xml"));
xmlLoader.addEventListener(Event.COMPLETE, xmlLoaded);
复制代码跟之前的一样,先导入几个包,这是为了实现图片的渐入渐出效果。然后是定义几个变量,这里xmlList可能比较陌生,这个变量的作用主要是获得xml的child列表,下面具体运用的时候,它的作用就一目了然了。通过URLLoader载入xml,然后监听xml,一旦载入完成,就触发xmlLoaded函数。function xmlLoaded(event:Event):void
{
xml = XML(event.target.data);
xmlList = xml.children();
for(var i:int = 0; i < xmlList.length(); i++)
{
imageLoader = new Loader();
imageLoader.load(new URLRequest(xmlList.attribute("thumb")));
imageLoader.x = 25;
imageLoader.y = i * 150 + 25;
imageLoader.name = xmlList.attribute("source");
addChild(imageLoader);
imageLoader.addEventListener(MouseEvent.CLICK, showPicture);
}
}
复制代码这里有一些地方需要注意,比如第一句
xml = XML(event.target.data);
如果直接
xml = event.target.data
会报错,因为两个变量的类型不一样。这里可以看到xmlList,它是取得xml的children,对于使用xml非常方便。然后实例化imageLoader,并载入xmlList里定义的缩略图,注意这里的写法。调整一下坐标,并给imageLoader添加了一个name属性,这个属性的值就是xml文件里的图片地址,这有利于下面的showPicture函数。然后将缩略图放到舞台上,并监听它的鼠标点击事件。function showPicture(event:MouseEvent):void
{
imageLoader = new Loader();
imageLoader.load(new URLRequest(event.target.name));
imageLoader.x = 200;
imageLoader.y = 25;
addChild(imageLoader);
imageText.x = imageLoader.x;
imageText.y = 351;
for(var j:int = 0; j < xmlList.length(); j++)
{
if(xmlList[j].attribute("source") == event.target.name)
{
imageText.text = xmlList[j];
}
}
fadeTween = new Tween(imageLoader,"alpha",None.easeNone,0,1,1,true);
}
imageText.autoSize = TextFieldAutoSize.LEFT;
addChild(imageText);
复制代码这个点击后显示大图的函数,由于前面已经给name属性添加了图片地址,所以这里直接拿来用就可以了。大图载入后分配一下坐标,添加到舞台上,接下来就该显示图片的说明了。这里的做法是循环xmlList,然后比较xml里source是否与这里的name相等,是的话,将该xml的值赋予imageText,不过显然有更简单的做法,就是在上面的xmlLoaded函数中为imageLoader添加一个text属性,然后在showPicture里直接拿来用就可以了。然后给图片来一个渐入效果,这个之前已经讲过了。最后两行是定义imageText的对齐方式,这里是左对齐,然后放到舞台上。
整个案例到此结束。
源文件下载:http://www.websbook.com/upimg/allimg/080321/20071126115345804.rar
Flash实例教程:通过实例学习AS3.0五
案例5:熟悉AS3的package,以及多个package之间的相互通信
说明:一个很简单的demo,有4个按钮,当鼠标划过和移开时会呈现出不同的状态,单击后变成disabled,再点击其他的按钮时,之前disabled的按钮恢复,被点击的按钮失效。
准备工作:打开源文件communicating_final.fla,点击属性里的发布设置,点击Actionscript3旁边的设置,在最下面的classpath里,引入classes的文件夹的路径,然后点击确定,前期工作就准备完了。
代码:源文件里的代码很简单:import todd.interactive.ButtonSet;
var buttons:ButtonSet = new ButtonSet();
buttons.addButtons([one_mc,two_mc,three_mc,four_mc]);
addChild(buttons);
复制代码导入ButtonSet类,实例化,然后调用里面的一个方法,最后将它放到舞台上。classes文件夹下面的todd->interactive文件夹里有两个as文件,其中一个就是刚刚调用的ButtonSet,来看看ButtonSet的源码:package todd.interactive
{
//其实只需载入display和events就可以了,不过多载入几个并不影响文件大小和效率
import flash.display.*;
import flash.events.*;
import flash.filters.*;
import flash.net.*;
import flash.geom.*;
import flash.ui.*;
import flash.utils.*;
import fl.transitions.*;
import fl.transitions.easing.*;
public class ButtonSet extends MovieClip
{
public var buttons:Array;
public function ButtonSet()
{
}
public function addButtons(buttonSet:Array):void
{
buttons = buttonSet;
for(var i:int = 0; i < buttons.length; i++)
{
addChild(buttons);
}
}
}
}
复制代码一个类应该被放在一个package里面,就像钱应该被放到钱包里一样。package后面定义的是该类的路径。然后一系列常用的类。定义了一个全局变量buttons,在变量前面加一个public就可以了。这样就能在整个类中被访问到。类名应该和文件名一样(区分大小写),然后定义一个同名函数,这个函数会在类被初始化时调用,就像php4的类一样。这里只是搭了个架子,没有具体内容。然后定义了一个函数addButtons,它的作用就是将一些mc或者sprites放到自己的container里(addChild)。还有一个类:DisablingButton,也是位于todd->interactive文件夹下,这也是这个案例的核心。对了,之前已经将RectButton的linkage里的baseClass设置为todd.interactive.DisablingButton。代码稍微有点长,且听我细细道来:package todd.interactive{
import flash.display.*;
import flash.events.*;
import todd.interactive.ButtonSet;
public class DisablingButton extends MovieClip {
var labels:Array;
var thisParent:*;
var thisIndex:int;
public function DisablingButton() {
labels = this.currentLabels;
this.addEventListener(MouseEvent.CLICK, disableButton);
this.addEventListener(MouseEvent.ROLL_OVER, over);
this.addEventListener(MouseEvent.ROLL_OUT, out);
this.addEventListener(Event.ADDED,setParent);
}
function disableButton(event:MouseEvent):void {
for (var i:int = 0; i < labels.length; i++) {
if (labels.name == "disable") {
this.gotoAndPlay("disable");
}
}
this.removeEventListener(MouseEvent.CLICK, disableButton);
this.removeEventListener(MouseEvent.ROLL_OVER, over);
this.removeEventListener(MouseEvent.ROLL_OUT, out);
enableOthers();
}
function enableButton():void {
this.addEventListener(MouseEvent.CLICK, disableButton);
this.addEventListener(MouseEvent.ROLL_OVER, over);
this.addEventListener(MouseEvent.ROLL_OUT, out);
this.gotoAndStop(1);
}
function over(event:MouseEvent):void {
for (var j:int = 0; j < labels.length; j++) {
if (labels[j].name == "over") {
this.gotoAndPlay("over");
}
}
}
function out(event:MouseEvent):void {
for (var k:int = 0; k < labels.length; k++) {
if (labels[k].name == "out") {
this.gotoAndPlay("out");
}
}
}
function setParent(event:Event):void {
if (this.parent is ButtonSet) {
thisParent=this.parent;
for (var w:int=0; w < thisParent.buttons.length; w++) {
if (this == thisParent.buttons[w]) {
thisIndex=w;
}
}
}
}
function enableOthers():void {
for (var z:int=0; z < thisParent.buttons.length; z++) {
if (z != thisIndex) {
thisParent.buttons[z].enableButton();
}
}
}
}
}
复制代码载入了两个常用类后,又载入了刚刚定义的ButtonSet类,这样我们就能使用ButtonSet的一些方法了。
注意:这个类必须继承Movieclip类,因为该类的对象是一个mc。然后定义了一些全局变量(默认均为public)。创建析构函数DisablingButton,labels = this.currentLabels; 这句话的意思是取得当前mc的label属性,以array的形式返回,包含了label.frame,label.name等等的属性。然后监听自己的鼠标点击、移入、移出事件。
this.addEventListener(Event.ADDED,setParent);这句话的意思是当自己被添加进一个容器时调用setParent函数。disableButton这个函数作用是,将当前mc的状态变成disabled,然后取消监听事件,同时激活其他的按钮。enableButton函数的作用就是激活自己的监听事件,并初始化自己的状态。over和out函数很简单,就是设置自己当前的状态。setParent函数的最终目的是捕获点击事件发生在哪个mc上(gotoAndPlay方法将触发EVENT.ADDED,所以over和out函数都将触发setParent函数,这也是一个待改进的地方)。enableOthers函数顾名思义,激活其他的按钮。因为setParent已经记住了,最后的点击事件发生在哪个mc上,所以只要遍历一下buttons,然后激活其他的mc就可以了。
案例分析完毕。