打有‘Flash/AS3’标签的日志

一个逼真的AS3水波效果 (2009-1-12)

这个并非原创,在AS2时代有位高人写过一个很牛的水波效果,后来大家都用那个。前阵子弄个游戏想用用这个水波的效果,不过AS2的不能直接用,所以花了点时间翻译了一下,算法还是跟那位前辈一样的。另外再提一下,这个算法其实蛮耗资源的,如果图片尺寸比较大的话,会很卡,也是因此我的游戏最终没有用到这个效果。 阅读全文 »

AS3的深度管理及排序 (2009-1-7)

说到深度管理,不由得想起了那万恶的AS2年代-_-! 至少本人觉得在AS2中的深度管理很是混乱,不仅有断层还会有冲突……总之麻烦多多。而在AS3中,一切都是这么的清晰与明朗,深度值断层不见了、有冲突的时候会自动调整,而我们只是记住以下几个语句的用法而已。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
numChildren : int
//返回此对象的子项数目。
getChildAt(index:int):DisplayObject
//返回位于指定索引处的子显示对象实例。
getChildIndex(child:DisplayObject):int
//返回 DisplayObject 的 child 实例的索引位置。
setChildIndex(child:DisplayObject, index:int):void
//更改现有子项在显示对象容器中的位置。
swapChildren(child1:DisplayObject, child2:DisplayObject):void
//交换两个指定子对象的 Z 轴顺序(从前到后顺序)。
swapChildrenAt(index1:int, index2:int):void
//在子级列表中两个指定的索引位置,交换子对象的 Z 轴顺序(前后顺序)。
removeChildAt(index:int):DisplayObject
//从 DisplayObjectContainer 的子列表中指定的 index 位置删除子 DisplayObject。

那么接下来我们来看一个简单的小例子吧,这里我就不罗列代码了,只把主要的写一下,关键是思路跟思想嘛,源码附在后面。有四个圆,可以点击与拖动,实现每点击其中一个圆,就把它调到最上面来。

这个其实很简单,要调整到最上层的话,只要用setChildIndex把鼠标点击对象的深度值设为(容器.numChildren-1)就可以啦。setChildIndex常用有以下几种:

1
2
3
4
5
6
7
8
置顶:
容器.setChildIndex(对象A,容器.numChildren-1);
置底:
容器.setChildIndex(对象A,0);
插入对象B的前面:
容器.setChildIndex(对象A,容器.getChildIndex(对象B));
插入对象B的后面:
容器.setChildIndex(对象A,容器.getChildIndex(对象B)-1);

是不是太简单点了呢?那我们再加深一点点吧,我们把上例中的圆换成立方块,再点击拖动下看看……

在这里我们想要达到一种空间立体的效果的话,就要对这些方块进行深度的排序,也就是说要让我们视觉上看起来靠前的物体挡住后面的物体。解决方法应该是多种多样的,在这里本民工只说说自己的解决方案了。简单说来,物体的前后顺序可以通过Y轴坐标的大小来区分,Y轴坐标值大的深度值就越大,在拖动后用一个数据记录下每个对象以及该对象的Y值,再把该数组以Y值的大小排序,最后setChildIndex一遍就可以了。

1
2
3
4
5
6
7
8
9
10
11
12
//以下代码是放在MOUSE_UP的事件里。
var obj_box:Array=new Array;//新建立数组。
for (var i=0; i<block_box.numChildren; i++) {
var aa:Object={objs:block_box.getChildAt(i),depth_y:block_box.getChildAt(i).y};
obj_box.push(aa);
//这里可以说是一个简单的JSON应用,把对象以及Y值添加到数组里。
}
*****************************************************************************
for (i=0; i<block_box.numChildren; i++) {
block_box.setChildIndex(obj_box.sortOn("depth_y",Array.NUMERIC)[i].objs,i);
//重新排序后再指定索引位置。其中sortOn是按指定的属性来排序。
}

最后再加个吸附功能吧,看看效果咯。

源码是临时写的,比较简单,都写在时间轴上咯。

点击下载源文件:depth.rar

AS3获取当前URL地址以及防盗链 (2009-1-2)

前阵子弄了个小游戏,然后想着像以前那样加个防盗链的功能(其实到最后也都没加,小破游戏会有谁来链啊),不过在这里可以讲讲实现的方法。

一般来说FLASH防盗链的手法都是获取当前的URL地址,然后跟事先指定的一个URL进行比对。获取当前URL的方法非常简单,有下面这句就可以了
loaderInfo.url
获取到了当前的URL那就好办事啦,一般说来一个域名都有带WWW或不带,所以一般需要预设两个URL地址。

1
2
3
4
5
6
7
8
var url:String = "http://www.moondyzone.com";
var url2:String = "http://moondyzone.com";
//substring(0, 25)就是取前25个字符进行比较;
if ((loaderInfo.url.substring(0, 25)==url) || (loaderInfo.url.substring(0, 21)==url2)) {
//随便你写什么了。
} else {
//也是随便你写什么了。
}

JSON简析以及AS3中JSON类的应用 (2008-12-31)

以往在做FLASH数据交互的时候,大多用的是XML,或者直接通过html传递参数来交互。前不久接触了一下JSON,研究了一下,觉得还是值得写点东西的。

json是JavaScript Object Notation的简写,是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它是基于JavaScript(Standard ECMA-262 3rd Edition – December 1999)的一个子集,也就是说他是来自于javascript的东西。因为现在ajax的流行,大部分网站会采用ajax的模式和构架,那么json会是一个数据传输的首选(文本方式太简单,要是大数据量的时候无法理解,xml的方式数据量大,在解析的时候会增加服务器负担),那么要是一个网站从ajax构架的基础上出一个flex/flash版的界面的时候使用json会最少地减少服务器端的程序改动。

JSON的结构写法很容易理解,它原本就是以数据量小和清晰的数据格式而著称的。但是在AS中使用json其实并不是一个必须或是很好的选择,很多时候我们还是会用XML,因为AS对XML的解析已经很好了。但是多了解一种数据交互形式,特别是如此简单的JSON,当然是有益无害的咯。

在这里想说些题外话,很多人喜欢拿XML跟JSON的可读性以及解析来做比较,其实一个写法优秀的XML也不会比JSON差,举个例子来说吧,现假设有一个用户数据包括:用户名、密码、所在部门、性别、年龄。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
用XML表示如下:
<?xml version="1.0" encoding="utf-8"?>
  <user>
  <name>张三 </name>
  <password>123456</password>
  <department>技术部</department>
  <sex></sex>
  <age>30</age>
  </user>
对于这样一个XML来说,如果数据量大了的确让人头昏眼花,也不好处理,但是如果我们转化成下面这种形式的话:
<?xml version="1.0" encoding="utf-8"?>
  <user>
            <people name="张三" password="123456" depattment="技术部" sex="男" age="30" />
  </user>
再跟相应该的JSON来比较:
{"name":"张三","password":"123456","department":"技术部","sex":"男","age":"30"}
也不会相差太多咯。

下面再说说adobe的官方的JSON类的用法吧。

1、服务器端来的json
语法:JSON.decode(String)
从服务器端获得的应该是一个字符串,把它存入一个变量,然后通过JSON.decode(String)方法后,就可以通过点语法来访问这些值。下面是一个网络上找来的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
var serverJSON:String = '{ "programmers":{ "firstName": "Brett", "lastName":
"McLaughlin", "email": "brett@newInstance.com" }, "firstName": "Jason", 
"lastName":"Hunter", "email": "jason@servlets.com" },  "firstName": 
"Elliotte", "lastName":"Harold", "email": "elharo@macfaq.com" }],
"authors": "firstName": "Isaac", "lastName": "Asimov", "genre": 
"science fiction" }, "firstName": "Tad", "lastName": "Williams", "genre": 
"fantasy" }, "firstName": "Frank", "lastName": "Peretti", "genre": 
"christian fiction" }],"musicians":  "firstName": "Eric", "lastName": 
"Clapton", "instrument": "guitar" },{ "firstName": "Sergei", "lastName": 
"Rachmaninoff", "instrument": "piano" }]}'
var s:Object = JSON.decode(serverJSON);
//开始使用
trace(s.programmers[0].firstName);//输出:Brett

2、本地对象做成JSON
语法:JSON.encode(Object)
其实也就是跟读取相反,创建一个对象然后输出而已了。你可以直接拼写JSON的字符串,也可以通过对象来创建了。

1
2
3
4
5
6
7
import json.*;
var myObject:Object = new Object();
myObject.ab = "adfsdf";
myObject.cd = Math.random();
trace(JSON.encode( myObject ));
//输出:{"ab":"adfsdf","cd":0.0599129400216043}
这样就可以给服务器了。

本民工接触JSON也不久,一些个人看法,如有不对欢迎指正。

AS3一些不太常见的代码写法(二) (2008-12-30)

好了,接上一篇,把代码的详细解释发出来吧,大都是一些代码的简写方式:

1、把:
//mc跳转到10以内的随机帧
mc.gotoAndPlay(Math.floor(Math.random()*10));
写成:
mc.gotoAndPlay(Math.random()*10>>0);
//大多数人都会用Math.floor()来取整,>>是位移符号,>>0就是去除小数点之后的数,用此方法来取整真是即方便又强悍。
2、把:
if(i%2==1){}//判断如果i是奇数,执行大括号中的语句
写成:
if(i&1){}
//i&1就是判断i是否是奇数,而思想就是以i的二进制最后一位与1相与,为真就是奇数、假就是偶数。跟传统的用模除来判断奇偶的思想相比,也很强悍。

3、把:
//给一个数组压入10以内的整数
var a:Array=[];
for (var i:int=0; i<10; i++) {
a.push(i);
}
写成:
//这是一种简化的写法,for语句后如果有一行代码要执行,可以省去大括号,这里只用分号相当于执行空语句
for (var i:int=0; i<10; a.push(i++));

4、把:
//计算鼠标移动的水平速度
var temp:Number=mouseX;
stage.addEventListener(MouseEvent.MOUSE_MOVE,moveHandler);
function moveHandler(e:MouseEvent):void {
var d:Number=mouseX-temp;
temp=mouseX;
}
写成:
var temp:Number=mouseX;
stage.addEventListener(MouseEvent.MOUSE_MOVE,moveHandler);
function moveHandler(e:MouseEvent):void {
var d:Number=(-temp+(temp=mouseX));
}
//这样的简写方式虽然很强悍,但本民工觉得降低了可读性,不需强求。

5、把:
//随机运行几个函数中的一个
function fn1 () {
trace(“1″);
}
function fn2 () {
trace(“2″);
}
var a:Array=[fn1,fn2];
var b:int=Math.random()*2>>0;
a[b]();
写成:
function fn1 () {
trace(“1″);
}
function fn2 () {
trace(“2″);
}
([fn1,fn2][Math.random()*2>>0])();
//高手就是喜欢省,没有超强的逻辑思绪还真搞不定呢。

6、把:
//多重条件语句
var a:int=6;
if (a>0) {
trace(“a is positive number”);
if (a&1) {
trace(“a is positive odd number”);
}
}
可以写成:
var a:int=3;
if (a>0&&(trace(“a is positive number”),a&1))
trace(“a is positive odd number”);
//这个我想应该很多人都会写,多重IF的简写,&&左边的语句返回true时才执行右边的。

7、把:
var a:int=13;
var b:int=-12;
if (!((a^b)>0)) {
b*=-1;
}
if ((a^b)>0||a>10) {
trace(b);
}
写成:
var a:int=13;
var b:int=-12;
if((a^b)>0||(b*=-1,a>10))
trace(b);
//跟上一例一样,||的左边语句要返回false时才执行右边的语句,另外,逗号表达式的返回值是最后一个逗号右边语句的返回值。

AS3一些不太常见的代码写法(一) (2008-12-30)

今天收集来了一些高手们的代码写法,可以看成是某些语法的简写,但除此之外,还包含了高手们强悍的思想。我先把代码帖出来,稍后再把代码的解释发出来。

1、
mc.gotoAndPlay(Math.random()*10>>0);

2、
if(i&1){}

3、
for (var i:int=0; i<10; a.push(i++));

4、
var temp:Number=mouseX;
stage.addEventListener(MouseEvent.MOUSE_MOVE,moveHandler);
function moveHandler(e:MouseEvent):void {
var d:Number=(-temp+(temp=mouseX));
}

5、
function fn1 () {
trace(“1″);
}
function fn2 () {
trace(“2″);
}
([fn1,fn2][Math.random()*2>>0])();

6、
var a:int=3;
if (a>0&&(trace(“a is positive number”),a&1))
  trace(“a is positive odd  number”);

7、
var a:int=13;
var b:int=-12;
if((a^b)>0||(b*=-1,a>10))
trace(b);