中国Flash技术中心--技术论坛 » Action Script讨论区 » 本人把全部家当拿出来了


2007-5-19 16:41 LXL
本人把全部家当拿出来了

二.语法相关:

1.首当其冲的还是点语法,他是在编程时用来指明与某个对象的相关的属性和方法,还可用于标识对象的路径。 比如,要获取主场景中的Myball这个影片剪辑的x坐标值语法为_root.Myball._x。这其中还有一个必须引起注意,初学者常常以为这里的Myball是指给库里的对象命名,如图二:

其实这是不对的,在程序中出现的名字,我们习惯上称为实例名,其正确的命名方法是在场景中选定需要命名的对象,然后在其属性面板对其命名,如图三:

当然还有在加载外部的图片,SWF或者直接调用库里的声音,MC,那还可以通过程序本身直接给对象添加实例名,这些技巧以后遇到的时候再给予解释!

点语法的对象名称中有两个特殊的名称:_root和_parent; 其中_root表示主场景,而_parent可以实现读取和设置包容当前物件的父物件的任何属性。我自己不知道是怎么养成的习惯,很少使用_parent,我比较喜欢采用一律从主场景来定位对象的方法。可能有时候这样定位并不如两种定位方法结合来的方便,但是我觉得这样做的最突出的优点是便于差错,因为你的路径一律是从上到下的(从主场景到某个内层的MC或按钮)哪一个层级出了问题很容易看出来,不用在MC和场景间来回切换,查谁是谁的父,谁是谁的子!另外我还有一个习惯,就是即使对象是在主场景中,我也喜欢在控制他的时候加上一个_root 。比如说主场景中的Myball这个MC是个运动的球,要用按钮控制让他停止,下面的语句可以实现:
on(release){
Myball.stop();
}

但是我一般写成:

on(release){
_root.Myball.stop();
}

当然,这只是我的个人习惯,也许大家看了觉得我在自找麻烦。但是,我之所以讲出来,是因为我觉得这是一个习惯,就是保有一种路径的观念在心里。这个应该蛮重要的。

2.关于斜杠语法:
据我所知,斜杠语法是在FLASH 4.0中广泛使用的,也用于指示对象的路径,被用于代替点的作用,当他要指出一个变量是需要在变量前面加上冒号,以表示对变量的引用。由于软件都有一种向下兼容性,所以在MX中仍然可以使用(我没怎么用过2004,估计2004也支持的),但是一般说不推荐使用,一方面,既然被取代了,肯定是因为有缺点,有好的方法了干吗还要抱者旧的不放(你要是怕被人说喜新厌旧,那你就继续用!我是不怕的,挖哈哈......)另一方面,为了和其他人保持一致,大家都用点语法,你一个人用斜杠,总觉得不大好!

3.分号:

编程时,我有在每句话结尾加分号的习惯,其实这个分号是可以省略的,那我为什么要加呢,嘿嘿........那是因为我一开始学习用FLASH编程时,没人告诉我可以不加,我就一直辛辛苦苦的加啊!!!现在改不过来了!挖哈哈..............

4.大小写

FLASH编程时,只有关键字区分大写和小写,何谓关键字,基本上就是你写对了,会变成兰色的那部分程序代码,也就是为本语言专用的一些单词!!比如:setProperty clearInterval getRGB 这些!

5.注释;

添加注释一般是为了方便别人阅读你的程序,添加注释符号//后,其后的内容为灰色;其实他还有一个最大的优点就是,方便你调试程序,比如,编译时发现程序有错,可是程序很长,你不能完全准确的确定错误发生的位置,那么你可以使用// 逐段的屏蔽掉程序段,进而帮助确定错误的位置。



--------------------------------------------------------------------------------

三.关于查错:

往往从有思路到编程实现效果不可能一次完成,也就是说,难免会出现错误,不能通过编译系统(不知道FLASH里怎么称呼,说成编译系统对不对咧,还请各位指教)。那这时候就需要我们查错。

1.充分利用输出窗口给出的提示:

例如:在按钮上加如下代码:
duplicateMovieClip("MC","MC"+j,10+j);
c=random(40);
setProperty("MC"+j,_y,(c+30));
setProperty"MC"+j,_x,random(600));
setProperty("MC"+j,_alpha,(2*c+20));
j++;
if(j>700){
j=1;
}

ctrl+enter测试影片,输出窗口提示:

场景=场景 1, 图层=AS, 帧=2: 第 4 行: Unknown error ID #1033
setProperty"MC"+j,_x,random(600));

就是说第四行有错误,回到编辑状态,一看,原来少了半边括号,就是说输出窗口会给我们提供很多必要的帮助,一定要好好利用!让AS编辑区显示行号的方法,如图四:

点一下红色圈中的按钮,选中显示行号即可!其他按钮还可以实现很多辅助功能,自己去看一看就知道了!

2.上述方法只能排除语法上的错误,也就是说,你程序本身算法或者程序中参数的传递,出现了问题,编译系统是不可能帮你检查出来的,这个只能靠你自己去检查。我这里介绍一点自己的方法,供大家参考:首先,你得自己心里想明白按照自己的这个算法思想能不能实现想要的结果,就是说先在心里把整个算法重新再理一遍,有时候想的不成熟,或者一开始的思路有疏漏,这时候应该可以更正或者修改过来!当你确定自己的程序设计思路没有问题但是依然出不了效果时,你就该考虑是程序实现时出了错误,比如参数传递有问题,路径指示不明确甚至错误等等都是比较常见的(至少我就常常犯这样的错误);

举个例子:

在主场景中有一个输入文本,其实例名为text 变量名为xx,
然后主场景的帧上加:

_root.text.onChanged = function() {
n=Number(xx);
};//当文本框内容改变时就把文本框的值赋给n这个变量;

然后在主场景中一个风车状的MC上加:

onClipEvent(enterFrame){
this._rotation=this._rotation+n;
}//意思是让风车旋转,速度为n;

但是测试影片,就是没有效果,为什么呢,想想看,先把风车上的代码改为:
onClipEvent(enterFrame){
this._rotation=this._rotation+3;
}//指定一个数值作为旋转的速度,测试发现,旋转正常;

这就提醒我们,是不是参数传递出了问题呢,哦!!!对,因为在帧上加的代码,所产生的变量n实际是主场景中的变量,把他传递到MC中时,应该确定起准确的位置。再次修改源代码,MC上的代码改为:
onClipEvent(enterFrame){
this._rotation=this._rotation+_root.n;
}

再次测试,一切正常,旋转速度随着输入数字的变化而变化

3.学会使用trace语句,检测错误!

上面的例子中变量比较少,所以很容易发现问题,如果一个程序中有多个变量,而且比较复杂,那就需要分别对他们进行跟踪查看,方法就是利用trace语句,在某个变量每次发生变化后都用trace将其输出,以便查看其运算结果是否和预期的一致!

同样举个例子:随机抽签效果!

十个MC,透明度均为30;

主场景中的关键帧上加:
a =new Array(0,1,2,3,4,5,6,7,8,9);//定义数组;
mm=0;//点击次数统计;
nn=10;//数组元素个数;

选择按钮上加:

on(press){
i = random(nn);
j = a;
a1=a.slice(0,i);
trace(a1);//输出抽取的部分数所组成的新的数组a1;
a2=a.slice(i+1,nn);
trace(a2);//输出抽取的另外一部分数所组成的新的数组a2;
a=a1.concat(a2);
trace(a);//输出组合后的数组,也就是新的数组a;
setProperty("mc"+j,_alpha,getProperty("mc"+j,_alpha)+30);
mm++;
nn--;
if(mm==10){
text="抽签结束!"
mm="10";
_root.but._visible=false;

}
}

采用以上方法后,每点击一次按钮,窗口都输出三排数字,最后一排中比上一次输出少掉的那个数字就是被抽取的数字;这样一来,每运行一次代码,程序人员都可以方便的查看各个变量的运算情况!

源文地址:
dispbbs.asp?boardID=1&ID=141361
PS:

a1=a.slice(0,i);//截取数组a中从第0个到第i个元素组成新数组返回值赋值给数组a1
a2=a.slice(i+1,nn);//截取数组a中从第i+1个到最后一个元素组成新数组返回值赋值给数组a2
a=a1.concat(a2);//连接 a1和a2
setProperty("mc"+j,_alpha,getProperty("mc"+j,_alpha)+30);//把被选中的对象透明度加30;
_root.but._visible=false;//把按钮隐藏;

2007-5-19 16:42 LXL
2222222222

FLASH隐藏类公布/使用


MM未公布的Tween/Easing类原教程译文及演示

FlashMX 2004 未公布的Tween/Easing 类

作者:Devon Wolfgang


正文

I. Tween类

Flash现在支持一个很特别的新类"Tween"类,利用它可以使得很多MC运动效果变得简单.它的使用方法如下:
someTweenID = new mx.transitions.Tween(object, property, function, begin, end, duration, useSeconds)
参数解释如下:
object:一个您想要增加Tween动作的MC的实例名.
property:该MC的一个属性,即为将要添加Tween动作的属性.
function:easing类的一个方法(下面会提到).
begin:属性开始时的数值.
end:属性结束时的数值.
duration:动作持续的帧数/时间.
useSeconds:一个布尔值,决定是使用帧数计时(为false)还是秒数计时(为true).默认为false.

就这些了,下面我们来看看有哪些easing类中的方法可供使用.

II. Easing类

MX 2004支持16种不同的easing类方法(应该是19种,但是有4种是相同的).泛泛而谈,Easing类中有五大类方法,每一类又

分为3种,最后还有第六类(只提供一个方法,就是什么easing也没有).

具体地说,有以下六类:

Strong
Back
Elastic
Regular
Bounce
None

每类各有四种方法:

easeIn
easeOut
easeInOut
easeNone

None和easeNone是相同的,所以我忽略掉它们. 关于该方法的完整调用应该如下:

mx.transitions.easing.Bounce.easeOut

现在您需要用以上字符串代替"function"占位符.

III.把两者结合起来

好了,现在我们掌握了所有的基本元素,接下来我们做一个完整的动画出来.设想一下我们现在制作了一个实例名为"

ball_mc"的小球,想到从x坐标为20的在方移动到x坐标为380的地方,用时0.5秒,并在最后弹两下.那么我们需要这样写:

ballTween = new mx.transitions.Tween(ball_mc, "_x", mx.transitions.easing.Bounce.easeOut, 20, 380, .5, true);

这串代码真难看! 我们最好把它写成一个函数:

function tweenBall() {
easeType = mx.transitions.easing.Bounce.easeOut;
var begin = 20;
var end = 380;
var time = .5;
var mc = ball_mc;
ballTween = new mx.transitions.Tween(mc, "_x", easeType, begin, end, time, true);
}

这下看起来好多了.当然,我们还需要调用这个函数.下面我们做一个实例名为"myButton_btn"的按钮.然后在帧上加上如下的

代码:
myButton_btn.onRelease = function() {
tweenBall();//调用Tween
};
function tweenBall() {
easeType = mx.transitions.easing.Bounce.easeOut;
var begin = 20;
var end = 380;
var time = .5;
var mc = ball_mc;
ballTween = new mx.transitions.Tween(mc, "_x", easeType, begin, end, time, true);
}

还不错,不过我们还可以改进一下,把easing类方法设为入口参数,这样我们就可以自定义所执行的运动方式了:
myButton_btn.onRelease = function() {
tweenBall(mx.transitions.easing.Bounce.easeOut);//注意入口的easing方法参数
};
function tweenBall(easeType) {//加了一个参数.
var begin = 20;
var end = 380;
var time = 20;
var mc = ball_mc;
ballTween = new mx.transitions.Tween(mc, "_x", easeType, begin, end, time);
}

注意一点,time变量为20,我们把帧率调成25,然后去掉了最后一个boolean参数"useSeconds".这样运动就以帧为标准了.好了,

现在我们的代码看起来和先前的差不多,但是我们还要加15个差不多的按钮,用来向函数传递不同的参数.

所有按钮只是调用了一个函数,这下就有用多了.

IV.进一步研究

事实上,MM还为该类提供了几个事件和方法.我所找到的最有用的事件就是"onMotionFinished"事件,方法呢?有yoyo()和

rewind().
举个例子,我们想让小球循环对称地运动,只需要这样稍微改一下:

myButton_btn.onRelease = function() {
tweenBall(mx.transitions.easing.Bounce.easeOut);
};
function tweenBall(easeType) {
var begin = 20;
var end = 380;
var time = 20;
var mc = ball_mc;
ballTween = new mx.transitions.Tween(mc, "_x", easeType, begin, end, time);
ballTween.onMotionFinished = function() {
this.yoyo();
};//多了一个事件和方法
}
rewind()方法把增加了Tween运动的MC重置到初始(未增加Tween前)状态.

结论

好了,我知道我还有一些东西没有介绍.因为有些我发现没什么用,有些我根本还不知道怎么用!当然我很清楚了解清楚以

上几点就能够正确地使用Tween/Easing类了.

一点实际例子:

在收到不少Email后,我决定再多给几个例子.毕竟没有人只会想到移动小球.下面的例子会使您看到其用处的.

下面是代码:
navText_array = new Array("Home", "About", "Work", "Play", "Contact");
setUpButtons();
stop();
function setUpButtons() {
var btnCnt = navText_array.length;
for (i=0; i<btnCnt; i++) {
var temp = this["tab"+i+"_mc"];
temp.navText.text = navText_array;
temp.begin = temp._y;
temp.end = temp._y-100;
temp.time = 8;//为temp添加了三个属性
temp.onRollOver = function() {
easeUp(this);
};
temp.onRollOut = function() {
easeDown(this);
};
}
}
function easeUp(what) {
var tabUp = new mx.transitions.Tween(what, "_y", mx.transitions.easing.Bounce.easeOut, what.begin,

what.end, what.time);/*这里的what是为类型为MC的参数,调用what.begin等属性.从这里可以看出作者用的是AS1.0语法(如

他自己所说).*/
}
function easeDown(what) {
var begin = what._y;
var tabDown = new mx.transitions.Tween(what, "_y", mx.transitions.easing.Strong.easeIn, begin, what.

begin, what.time);
}

译者按:要实现上面的效果,还要创建btnCnt个实例名为("tab"+i+"_mc")的菜单项.

2007-5-19 16:42 LXL
333333333333333333

AS创建文本框

_root.createTextField("mytext", 1, 50, 50, 100,20);
mytext.multilance=false;//设置单行;
mytext.text="这是文本框"//文本赋值
然后是删除这个创建的文本框:
mytext.removeTextField();//删除!

如果大家要创建一个换行的文本框,就需要加上:
mytext.wordWrap =true //指示文本字段自动换行
mytext.autoSize=true //指定文本字段的自动对齐和大小调整


TextField 类的方法摘要

TextField.addListener() 注册一个对象,以便在调用 onChanged 和 onScroller 事件处理函数时接收通知。

TextField.getFontList() 返回播放器的主机系统上字体名称的数组。

TextField.getDepth() 返回文本字段的深度。

TextField.getNewTextFormat() 获取分配给新插入文本的默认文本格式。

TextField.getTextFormat() 返回包含文本字段中一些或全部文本的格式信息的 TextFormat
对象。

TextField.removeListener() 删除侦听器对象。

TextField.removeTextField() 删除使用 MovieClip.createTextField() 创建的文本字段。

TextField.replaceSel() 替换当前的所选内容。

TextField.setNewTextFormat() 为由用户或方法插入的文本设置 TextFormat 对象。

TextField.setTextFormat() 为文本字段中指定范围内的文本设置一个 TextFormat 对象。


TextField 类的属性摘要

TextField._alpha 文本字段实例的透明度值。

TextField.autoSize 控制文本字段的自动对齐和大小调整。

TextField.background 指示文本字段是否具有背景填充。

TextField.backgroundColor 指示背景填充的颜色。

TextField.border 指示文本字段是否具有边框。

TextField.borderColor 指示边框的颜色。

TextField.bottomScroll 文本字段中最下面的可见行。只读。

TextField.embedFonts 指示文本字段是使用嵌入字体轮廓还是使用设备字体。

TextField._height 文本字段实例的高度,以像素为单位。它只影响文本字段的边框,不影响边框的粗细和文本字体大小。

TextField._highquality 指示 SWF 文件的呈现品质。

TextField.hscroll 指示文本字段的水平滚动值。

TextField.html 指示文本字段的当前最大滚动位置。

TextField.htmlText 包含文本字段内容的 HTML 表示形式。

TextField.length 文本字段中的字符数。只读。

TextField.maxChars 文本字段最多可容纳的字符数。

TextField.maxhscroll TextField.hscroll 的最大值。只读。

TextField.maxscroll TextField.scroll 的最大值。只读。

TextField.menu 将 ContextMenu 对象与文本字段关联。

TextField.mouseWheelEnabled 指示当鼠标指针停在文本字段上且用户滚动鼠标滚轮时,Flash Player 是否应自动滚动多行文本字段。

TextField.multiline 指示文本字段是否包含多行。

TextField._name 文本字段实例的实例名称。

TextField._parent 对此实例的父级实例的引用;其类型为 Button 或 MovieClip。

TextField.password 指示文本字段是否隐藏输入字符。

TextField._quality 指示 SWF 文件的呈现品质。

TextField.restrict 用户可输入文本字段的字符集。

TextField._rotation 文本字段实例的旋转度数。

TextField.scroll 指示文本字段的当前滚动位置。

TextField.selectable 指示文本字段是否可选。

TextField._soundbuftime 在声音进入流之前,必须预先缓冲的声音的时间量。

TextField.tabEnabled 指示影片剪辑是否包括在 Tab 键的自动排序中。

TextField.tabIndex 指示对象的 Tab 键顺序。

TextField._target 指定文本字段实例的目标路径。只读。

TextField.text 文本字段中的当前文本。

TextField.textColor 文本字段中当前文本的颜色。

TextField.textHeight 文本字段边框的高度。

TextField.textWidth 文本字段边框的宽度。

TextField.type 指示文本字段是输入文本字段还是动态文本字段。

TextField._url 创建文本字段实例的 SWF 文件的 URL。只读。

TextField.variable 与文本字段关联的变量名。

TextField._visible 确定文本字段实例是隐藏还是可见的布尔值。

TextField._width 文本字段实例的宽度,以像素为单位。它只影响文本字段的边框,不影响边框的粗细和文本字体大小。

TextField.wordWrap 指示文本字段是否自动换行。

TextField._x 文本字段实例的 x 坐标

TextField._xmouse 指针相对于文本字段实例的 x 坐标。只读。

TextField._xscale 指定水平缩放文本字段实例的百分比的值。

TextField._y 文本字段实例的 y 坐标。

TextField._ymouse 指针相对于文本字段实例的 y 坐标。只读。

TextField._yscale 指定垂直缩放文本字段实例的百分比的值。



TextField 类的事件处理函数摘要
事件处理函数

TextField.onChanged
在文本字段更改时调用。

TextField.onKillFocus
在文本字段失去焦点时调用。

TextField.onScroller
在文本字段滚动属性之一发生更改时调用。

TextField.onSetFocus
在文本字段接收焦点时调用。

TextField 类的侦听器摘要

TextField.onChanged
在文本字段更改时获得通知。

TextField.onScroller
在文本字段的 scroll 或 maxscroll 属性更改时获得通知。


--------------------------------------------------------------------------------

attachSound的部分常用语句

aa=new Sound();//创建一个新音乐
aa.attachSound("jgw");//将库中标识符为jgw的音乐导出播放(标识符在库中链接菜单中命名)
aa.start(0,10000);//音乐播放秒偏移量为0,播放10000次
aa.stop();//停止播放aa这个声音

如果你不想看到Flash的About和设置菜单,把下面的代码放到第一帧就行了:
_root.createTextField("danger", 999, 0, 0, Stage.width, Stage.height);
好了,现在换了一个新菜单.
注:这个适合用在没有交互的动画上,如果你需要使用按钮就去掉.
(这个好像是转载自Dengjie的Blog)

限制flash只能在服务器上观看
在第一帧中加入如下代码:
fscommand ("allowscale", "0");
url = "http://goday.gtma.cn";;//'" target=&quo ... [url]http://goday.gtma.cn[/url]"; //这个换成你的域名
if (_url.substring(0, 20)<>url) { //那个0(h),20(n)就是指从第一个字符开始向后数到第20个字符(包括“://”和“.”符号),这个请自行根据上面的url=后面的[url]http://goday.gtma.cn[/url]来更改
gotoAndPlay (2);
} else {
gotoAndPlay (3);
}
第二帧加入:
stop ();
第三帧加入:
stop ();
然后把正式内容放在第三帧就好了,第二帧放入出错内容
当然有人说用播放就可以跳过,这里是给出一个思路,你可以用loadmove等等等等等等等等的方法来加载于否正式影片

用ShareObject在本地保存数据(下面文章将较详细讲解)


例(本地保存数据,要想远程保存数据,也可以,跟下边的例子差不多,只不过要安装 flashcom 需要$ 蛮贵的)
function test(){
this.userinfo_so=SharedObject.getLocal("test/userinfo","/");
if(this.userinfo_so.data.info == null){
this.userinfo_so.data.info=new Object();
this.userinfo_so.data.info.username=new Array();
this.userinfo_so.data.info.email=new Array();
}
this.setUserinfo=setUserinfo;
this.getUserinfo=getUserinfo;
this.delUserinfo=delUserinfo;
}
function setUserinfo (username,email)
{
with(this.userinfo_so.data){
uLength=info.username.length;
eLength=info.email.length;
info.username[uLength]=username;
info.email[eLength]=email;
}
var status=this.userinfo_so.flush();
}
function delUserinfo(){
this.userinfo_so.data.info=null;
this.userinfo_so.flush();
}
function getUserinfo (){
for(var i=0;i<this.userinfo_so.data.info.username.length;i++){
trace(i+":"+this.userinfo_so.data.info.username);
}
}
var gg_so=new test();
gg_so.setUserinfo("glghcool","glghcool@etang.com");
gg_so.getUserinfo();

外部载入文本
动态文本框必须放在MC里面
system.useCodepage = true;
loadVariables ("1.txt",mc)
文本里的最前面是:动态文本框的变量名=你的内容易

判断用户名和密码是否正确,以及根据不同用户名进入不同帧数
用户名的文本框为myname,密码框为mypass
on (release) {
if (myname == "用户名1" && mypass == "密码1") {
gotoAndPlay (85);
} else if (myname == "用户名2" && mypass != "密码2") {
gotoAndPlay (82);
} else if (myname != "用户名3" && mypass == "密码3") {
gotoAndPlay (83);
} else if (myname != "用户名4" && mypass != "密码4") {
gotoAndPlay (84);
}
}

2007-5-19 22:28 suzaku
[quote]你买的股票升值,获利 [color=Red]17[/color] 论坛币!

   机遇随时出现下次继续努力哦!……[/quote]不错啊,LXL真的都是家当啊,我全部收藏了!

2007-5-20 09:52 leanlee
[quote]今天发放了上月的奖金 [color=Red]13[/color] 论坛币!

   机遇随时出现下次继续努力哦!……[/quote]顶!顶!顶!顶!顶!顶!

2007-5-20 12:18 煮鹤
感谢分享

2007-5-23 15:04 LXL
所有教程打了个包

[quote]去洗桑拿,花了 [color=Red]5[/color] 论坛币!

   机遇随时出现下次继续努力哦!……[/quote]所有教程打了个包,

2007-5-23 19:43 liuzhiyong81
感谢分享!顶!

感谢分享!顶!我全部收藏了!

2007-5-26 11:42 PPP
好地方

顶!!!!!!!!!!!!!!!!!!不错,继续发!!!!

2007-5-30 09:41 auto2008
[quote]你参与中国Flash技术中心--技术论坛的广告设计得到 [color=Red]4[/color] 论坛币的佣金!

   机遇随时出现下次继续努力哦!……[/quote]又有好东西下了 版主劳苦功高。

2007-5-30 14:17 yangfan619
看不懂  怒``!!!

2007-6-1 16:41 水天一线
[quote]你在街头拐角捡到 [color=Red]6[/color] 论坛币,收入了你的口袋,魅力值减 [color=Red]2[/color] !

   机遇随时出现下次继续努力哦!……[/quote]好贴,楼主辛苦了,学习了

2007-6-1 17:02 lcy66
支持一下!版主辛苦了/:sualai

2007-8-5 11:09 波客
[quote]在古玩市场上淘得一件宝贝,价值 [color=Red]7[/color] 论坛币!

   机遇随时出现下次继续努力哦!……[/quote]/:xiexie /:xiexie /:xiexie

2007-10-11 09:26 天堂小二
谢谢楼主,遗憾的是没积分啊

2007-10-16 10:14 我是一只猪
支持一下!/:what

2007-11-5 13:17 zone0356224
好好学习,天天向上。
这个教程对flash cs3 有用么。

2007-11-5 16:44 suhang2008
好久没来了,路过顶一个!!/:tw

2007-11-7 13:14 lyhydfp
/:xiexie 不胜感激

2007-11-10 18:04 lv_ww00
感谢分享!
虽然现在还看不懂。。。
呵呵,研究了。

页: [1] 2 3


Powered by Discuz! Archiver 5.5.0  © 2001-2006 Comsenz Inc.