+ -
当前位置:首页 → 问答吧 → Flash Action Scrip 3.0

Flash Action Scrip 3.0

时间:2009-10-07

来源:互联网

笔记
调试程序前保存文件是一个好习惯
输出窗口,只在trace输出语句或出现语法错误时自动弹出,即trace在直接双击运行的swf文件中没有任何效果
AS3中,只有在任何函数或类外定义的变量就是全局变量
时间轴变量也是全局变量,用于该时间轴上的任何脚本(在时间轴的任一帧使用var语句初始化这些变量),必须首先声明时间轴变量,然后才能访问它
{本地变量} ,在该函数外部将不可用
Flash Player隐藏错误,增加了稳定性,给开发人员调试带来不少困难
常见出错点    网络通信 用户操作 文件读写 条件不足 设备忙

排除运行时错误
trace语句
断点调试       单击代码左方的蓝色获取,可设置/取消断点    程序执行到断点处会自动暂停,调试器中显示当前程序状态
通过抛出的错误信息查出错误

混淆数字+与字符串+
要使用Number强制类型转换
字符识别

Keyboard
Mouse
Math
不需要也不能创建类实例(对象),更不能被继承,而是直接用类名引用类的静态属性和方法    如 Mouse.hide();

swf 文件本身就是一个影片剪辑,MovieClip就是Flash构架

import…
var mc = new MovieClip();
var txt = new TextField();
mc.x=50; …
txt.text=”ABCD”;
txt.name=”insName”;
mc.graphics.beginFill(0xFFFF00);
mc.graphics.drawRect(0,0,80,80);
mc.addChild(txt);
addChild(mc);
//时间轴的方法
mc.addEventListner(MouseEvent.MOUSE_DOWN,dragMC);
function dragMC(evt:MouseEvent)
{
mc.startDrag();
//mc跟随鼠标移动
TextField(mc.getChildByName(“insName”)).text=”startDrag1”;
//强制类型转换
}

计算机屏幕的坐标原点是左上角
看一下AS3中所有类的继承关系和作用,灵活使用这些类的属性对于大多数游戏应用来说已经游刃有余
对象名.成员对象名.方法名(参数s)

Object基础对象方法
EventDispatcher类的事件侦听相关方法
DisplayObject的坐标变换以及冲突检测相关的方法
DisplayObjectContainer类的与子项目相关操作
Sprite类的对象拖放方法

Flash是一个影片剪辑,它可以设计动画,并嵌套其它影片剪辑(包括按钮和图形),并可继续嵌套
Flash以可视对象层次结构为主,在此基础上集成代码,脚本在其上属于从属位置(动画为主,代码为辅)

事件流是事件在显示对象层间穿行的过程
舞台—主时间轴剪辑—显示对象窗口1—显示对象1(由child-->parent)
var mc=new MovieClip();
mc.graphics….
addChild(mc);
function move(evt:KeyboardEvent)
{
Switch(evt.keyCode)

{

case Keyboard.UP;

mc.y=mc.y-2; break;


}
}
stage.addEventListener(KeyboardEvent.KEY_DOWN,move);
//因为stage对象在显示对象层次结构的根部,是事件流的必经结点,所以总能够正确接收到键盘事件.
注:在调试有键盘控制的Flash程序时,应先禁用快捷键,以免这些快捷键先被Flash开发环境捕获而无法传递到Flash Player

fun1~4定义
addChild(parentMC);
parentMC.addChild(childMC);
addChild(anotherMC);
parentMC.addEventListener(MouseEvent.MOUSE_DOWN,fun1);
childMC.add….fun2);
parentMC.addEventListener(MouseEvent.MOUSE_DOWN,fun3,true);
(*)
stage.add…fun4);
击parentMC和anotherMC, 对应着fun1和fun4

…和fun4
击childMC, (*)中fun3会首先捕获,继而fun2, 然后fun1,fun4
addEventListener中的第三个参数为true时

Flash使用声音
1.
将库中声音文件放置在时间轴上,但它不能在AS中控制播放,缺少灵活性,不适合在游戏中使用
2.
库中声音文件右击,链接,自动创建一个新类
var bgSound=new backgroundSound();
bgSound.play();
3.
import…
var music=new Sound();
var url=new URLRequest();
url.url=”aa.mp3”;
music.load(url);
music.play();
function openFileError(evt:IOErrorEvent)
{trace…}
music.addEventListener(IOErrorEvent.IO_ERROR,openFileError);

位图处理(精确到像素的位图处理机制)
AS3中采用BitmapData对象实现位图处理功能,然后用Bitmap对象显示位图
BipmapData是二维矩阵,每个点阵就是一个像素,每个像素为24位,每8位为一通道,RGB

例子:游戏中常用的制作背景效果(BitmapData对象创建一个随机纹理的无缝连接图,编程实现无缝平移) (原理图略)
A
AA
AAAAAAA
AAAAAAA


AAAAAAA

AA
AAAAAAA
AAAAAAA
AAAAAAA
                                   从窗口看,背景好像是永远向左走
另外一种,无缝连接技术,基于关键帧的.例如角色行走的动作,只要设计一个角色行走的一个周期的动画即可,它由几个关键帧组成,游戏中行走动画周而复始,就好像角色一直在行走一样
bBMData= new BitmapData(300,400);
sBMData= new BitmapData(300,200);
sBMData.perlinNose(…);
//生成有机纹理            小图像生成
bBMData.copyPixels(sBMData,rect,point);
//new Rectangle(0,0,300,200); new Point(0,0);
point.y=200;
//将small复制成二倍大的big
将小图像复制在大图像上(准备素材)
bBMData.copyPixels(sBMData,rect,point);
point.y=0;

var myBitmap=new Bitmap(sBMData);

//一次绑定,不断刷新,sBMData变,即变
addChild(myBitmap);
addEventListener(Event.ENTER_FRAME,scrollBitmap);

//每隔一帧的时间触发一次
function scrollBitmap(event:Event):void{

rect.y=rect.y+2;

if(rect.y>200)
{rect.y=0;}

sBMData.copyPixels(bBMData,rect,point);
//前进中不断复制,最终显示的是小图像
}

例子:完美隐藏位图方框
素材:蝴蝶,风景图,蝴蝶蒙板(灰度图)各一


A


A
分别为Butterfly和ButterflyMask链接
import…
var butterflyShow= new Bitmap(butterflyData);
butterflyShow.x = ….
var bgShow= new Bitmap(new BitmapData(1,1));
var url= new URLRequest(“背景.jpg”);
var loader= new Loader();
loader.load(url);
addChild(loader);
butterflyData.merge(butterfly,butterfly.rect,point,255,255,255,0);
//var butter= new Butterfly(250,240);
butterflyData.copyChannel(butterflyMask,butterflyData.rect,point,BitmapDataChannel.BLUE,..ALPHA);

// var betterflyMask = new ButterflyMask(250,240);
//var butterflyData = new BitmapData(250,240,true);
addChild(butterflyShow);
loader.addError…

XML的操作
var myXML:XML=<订单>

<A>

<B 数量=”3”>什么</B>

</A>
</订单>;
Var newItem:XML=new XML(“….”);
myXML.appendChild(newItem);
//增加新节点
myXML.A.(B==”什么”).@数量=”1”;
//赋值
myXML.toXMLString();
//转化为字符串

可先在Flash设计动画,再在脚本中控制它们
即在Flash中可视化创建各种元件,然后在脚本中实现它的程序逻辑

拖动桌子时,桌子和花瓶一起移动.拖动花瓶是,只有花瓶移动.
做成花瓶影片剪辑和桌子影片剪辑,然后它们再嵌套在一个大的影片剪辑
在库中的相当是类,而在舞台中的是对象(实例)
vase.addEventListener(MouseEvent.MOUSE_DOWN,dragVase);
desk.addEventListener(MouseEvent.MOUSE_DOWN,dragBoth);

被嵌套的剪辑的位置,是相对于其上一级的中心位置而言,即相对坐标
全局坐标,对象相对于舞台的位置


fl类包
从组件面板中拖动至舞台,设置参数,用脚本控制
也可以用import语句导入,创建并使用它
如: 组件选择ComboBox选项,实例名称为teamSelect

teamSelect.addItem(new Object({label:”黄队”,data:”5”}));

teamSelect.addEventListener(Event.CHANGE,showS);

function showS(evt:Event)
{evt.target.selectedItem.label;evt.target.value;}

再如:textArea.setStyle(“textFormat”,(new TextFormat()).size=24);

tf.color

又如,鼠标右键菜单

气球被刺而破       气球是对象,破是函数,刺是事件
如果不是开发复杂的游戏,没必要创建自定义类
自定义类必须放在以类名为文件名的as文件中,大小写要同
package{

public class Vehicle
{
public var name:String;
public function drive()
{

name;

}
}
}
路径放在\zh_cn\Configuration\ActionScript3.0\Classes

Flash可以调用浏览器的javascript.可以读取外部变量或XML数据,可以加载其他SWF文件,图片,视频,也可以与本机的其它Flash通信,可以与网络服务器收发信息,可以将程序数据永久地保存在本机上,可以执行文件的上传和下载,可以使用XMLSocket满足复杂的网络通信需求,可以与FMS交互从而构成一个强大的网络应用

数据:swf文件中的脚本,变量文本,服务器返回的数据,XML等资源
内容:swf动画,图片,音频,视频等资源
用浏览器打开某个网页,该见面中包含flash,它处于远程沙箱中,允许访问所在域的数据和内容以及其它域的内容.本地文件资源和其他域的数据是严格禁止访问
若其加载了其它域中的swf,被加载内容被放在一个独立的沙箱中,这些内容所包含的数据独立运行,不可访问.
双击本地磁盘的swf,它处于本地沙箱中,允许访问本机的所有资源,但是无法访问任何internet资源
同一文件系统可以方便访问,不同则相互排斥,无法直接交换数据
可以修改安全设置,使上述情况不生效

使用跨域策略文件
设置哪些域的swf具有访问本域数据的权限,文件必须放置在域的根目录下,必须命名为crossdomain.xml
<?xml version=”1.0”?>
<cross-domain-policy>

<allow-access-from domain=”*.example.com”>
</cross-domain-policy>

使用超链接
1.
可视化环境下,直接修改属性栏
2.
navigateToURL(new URLRequest(“www.baidu.com”))

加载数据
var loader:URLLoader=new URLLoader();
bt.addEventListener(MouseEvent.MOUSE_DOWN,loadText);
function loadText(MouseEvent){

loader.load(new URLRequest(“….”));
}
loader.addEventListener(Event.COMPLETE,showText);
//add..ERROR
function showText(Event){

loader.data;
}

播放器

加载swf
addChild(new MovieClip((new Loader()).load(new URLRequest(“….”)).content))

加载视频
var nc=new NetConnection();
nc.connect(null);
var ns=new NetStream(nc);
ns.addEventListener(AsyncErrorEvent.ASYNC_ERROR,asyncErrorHandler函数);
ns.play(“video.flv”);
addChild((new Video()).attachNetStream(ns))

麦克风和摄像头参考FMS帮助文件

保存数据于本地ShareObject,相当于浏览器的Cookie
写入:
var so:SharedObject=SharedObject.getLocal(“名字”);
so.data.score=”写入内容”;
so.flush();
读取:
Number(ShareObject.getLocal(“名字”).data.score);


作者: chnzbq   发布时间: 2009-10-07

不懂哦,呵呵

作者: aoyoo   发布时间: 2009-10-07

这是<<Flash游戏编程教程>>肖刚一书的部分笔记...呵呵

作者: chnzbq   发布时间: 2009-10-07

热门下载

更多