1、帧:
写在关键帧上面的AS,当时间轴上的指针走到这个关键帧的时候,就写在这个帧上面的AS就被触发执行了。常见的例子有在影片结尾的帧写上 stop() 等。操作方法就是点选关键帧,然后打开AS面板。
2、按钮:
不同于帧上面的AS,按钮上面的AS是要有触发条件的。要把AS写在按钮上,操作方法是点选目标按钮,然后打开AS面板。举个例子能说的更明白。
假设有一个动画,要让它在播放完同时停止,那么,你要做的就是在这个动画的最后一帧写AS
stop();
再假设有个按钮,效果是按下按钮后停止播放,那么步骤如下。
做一个按钮,放到主场景,点选按钮,然后打开AS面板。现在如果也在按钮上写
stop();
那么,输出的时候就会提示错误。正确的应该这样写
on(release){
stop();
}
这里要比帧的动画多这些代码: on(release){} , 整个代码翻译过来就是:
当(松开){
停止
}
红色的代码表示鼠标的触发事件事件之一,这里用的是 release 松开,按钮的常用事件:
release 松开
releaseOutside 在按钮外面松开
press 按下
rollOver 鼠标进入按钮的感应区
rollOut 鼠标离开按钮的感应区
现在很明确了:写在按钮上面的AS一定就是这种格式的:
on(事件){要执行的代码}
3、MC(电影剪辑)
如果你看懂了上面的内容,那么写在MC上面的AS和写在按钮上的大同小异。操作方法就是点选MC,然后打开AS面板。看个例子
onClipEvent(load){
stop();
}
同样,MC需要一个事件来触发AS的执行。翻译这段代码就是
当剪辑(载入){
停止
}
红色代码同样表示一个事件。MC的事件有下面这些:
l...
完整阅读本文...]]>
这里说一下,我们要从开始就养成编程的好习惯,如在每个语句后面都加上分号,有可能的话,尽量给复杂的语句加上注释。注释的例子
//这个是注释,但是只能有一行
/* 这个也是注释,可以写很多行 */
接下来,介绍几个类型的语法。
1、几个常用的控制场景的方法,如
play(); //让时间轴的指针播放
stop(); //停止时间轴的指针在程序触发时候的那个帧
gotoAndPlay(); //让指针跳转到某个帧,然后继续播放
gotoAndStop(); //让指针跳转到某个帧,停止在那个帧
nextFrame(); //往下走一帧
prevFrame(); //往前走一帧
上面的都是方法。
方法?解:打个比方,我们管吃饭叫作一种方法,用来解决肚子饿这个问题。我们管stop()叫做一种方法,用来解决时间轴指针停下来的问题。我们管上面的几个东西叫方法,用来解决时间轴指针运动的问题。
2、控制属性的语法。有很多,我列几个
_x
_y
_alpha
_width
_name
.....等等属性
上面的都是属性
属性?解:打个比方。我们管你的身高叫做属性,用来标识你的高度。我们管你的体重叫属性,用来标识你的质量。我们管 _x 叫属性,用来标识目标的X轴坐标。我们管_alpha叫属性,用来标识目标的透明度.......我真罗嗦啊,唉。
3、控制语句流程的语法,如
if (条件){
//条件满足执行这里的代码
}else{
//条件不满足执行这里的代码
}
for(i=0;i<N;i++){
//执行这里的代码N次
}
while(条件){
//当条件满足时一直执行这里的代码
...
完整阅读本文...]]>
在讲路径之前,有必要先讲一下 .语法 : 举例说明,这里要表示房间里的桌子上的一本
书,用 .语法这么表示:
房间.桌子.书
如果要再细到书上的页上面的字,很显然
房间.桌子.书.页面.字
看明白了吧?我也不懂得怎么说, .语法就是这样表示对象的,点的前面是其后面的父级。如房间是桌子的父级,桌子的子级就是书。
还是不明白?这样吧,你把 . 里写成“里面的”就可以了,这样就是
房间(里面的)桌子(里面的)书(里面的)页面(里面的)字
这样容易多了吧?
现在我开始说路径了,其中也要夹杂的对象的说明,看:
从例子入手。新建一个Flash文件,然后创建一个MovieClip,MC命名为“MC”,放在主场景里面,然后再创建一个按钮,放在“MC”里面,然后从库里面拖一个出来放在主场景,分别给这两个元素实例命名(Instance
Name , 注意是实例名不是MC的名字):MC->myMC button->myBtn
现在我们假设主场景是房子,MC是桌子,按钮是书,那么分别怎么表达房子,桌子,书呢?如下
_root 房子
_root.myMc 房子.桌子
_root.myMc.myBtn 房子.桌子.书
这里的 _root 是Flash的关键字,表示主场景的 Timeline (时间线)。
很容易理解对不。这里的 房子,桌子,书 都是我们要理解的“对象”。
当你找到这个对象后,才能对对象进行操作,才能给对象施加方法。比如,我现在要打扫房子,打扫是方法,但对象是房子,表达式是这样 :
房子.打扫()
如果你不能正确的表达房子这个对象,你的打扫也就不能正确的实施了。
*说明:这里为什么要在打扫后面加()呢?因为打扫是方法不是对象,为了让Flash知道这是个方法,我们必须加...
完整阅读本文...]]>
var s:Sound=new Sound(this);
s.loadSound("dxh.mp3",false);
s.onID3=function(){
trace(this.id3.songname);
}
输出结果是:
¶¡Ïã»
dxh.mp3的ID3v1的标签正确应该是songname="丁香花",看来FLASH在转码上出现了问题。我们来看看songname这个字符串中倒底是什么?
代码2:
var s:Sound=new Sound(this);
s.loadSound("dxh.mp3",false);
s.onID3=function(){
var songname:String=this.id3.songname;
for(var i=0;i<songname.length;i++){
trace(songname.charCodeAt(i));
}
}
System.useCodepage=true;
trace(unescape("%B6%A1%CF%E3%BB%A8"));
那么为什么代码1出现乱码现象,是因为FLASH将GB2312当作了UTF-8来解释,我们再来测试一下:
代码3:
var s:Sound=new Sound(this);
s.loadSound("dxh.mp3",false);
s.onID3=function(){
var songname:String=this.id3.songname;
trace(escape(songname));
}
static function initialize(o:Object);
//o:对象
//initialize:初始化方法,为对象o附加上作为事件源的各项功能。那么事件源都有什么功能呢?
static function broadcastMessage(msg:String);
//msg:消息
//broadcastMessage:广播方法,事件源的一个主要功能就是向外界广播一条消息,告知听广播的人"某一事件发生啦!"
static function addListener(o:Object);
//o:对象
//addListener:注册监听者方法,也就是决定广播消息给谁听的意思
static function removeListener(o:Object);
//o:对象
//removeListener:注销监听者方法,也就是消息不再广播给谁听
var 司令部=new Object();
//啊,司令部是个发布指挥消息的地方,用它做事件源是个不错的选择
AsBroadcaster.initialize(司令部);
//这里直接用AsBroadcaster来引用AsBroadcaster类,原因如上述
//调用AsBroadcaster类的静态方法initialize,为司令部附加上作为事件源的各项功能
var 步兵=new Object();
//生成步兵对象
步兵.on进攻=function(){
//on进攻: 这里之所以用'on'做前缀,是为了表明这个方法是响应一定事件的方法
trace("步兵接到司令部来电,轻装上阵,火速向敌方阵地前进!");
// 接到'on进攻'消息后采取的措施
}
步兵.on驻守=function(){
//同上
trace("步兵接到司令部来电,就地待命,多设岗哨,严防来犯之敌!");
}
司令部.addListener(步兵);
//将步兵添加为司令部的监听者,从现在起他将听从司令部的指令行事
//以下雷同的地方,恕不赘述
var 装甲兵=new Object();
装甲兵.on进攻=function(){
trace("装甲兵接到司令部来电,加足马力,火速向敌方阵地开进!");
}
...
完整阅读本文...]]>
static function initialize(object:Object):Void
//object:对象
//initialize:初始化方法,为对象object附加上作为事件源(在这里可以理解为派遣中心吧)的各项功能。
static function _removeEventListener(queue:Object, event:String, handler):Void
//一个内部方法,注销监听事件源相关事件的监听者,removeEventListener方法会调用它.
EventDispatcher类有4个公共方法:
function dispatchEvent(eventObj:Object):Void
/*事件派遣方法,向外界广播一个消息,并附有关于消息的相关描述(请与broadcastMessage(msg:String)方法比较)
eventObj:事件对象,它至少应含有2个属性,假设司令部为一个事件派遣中心,一般定义如下:
var eventObj=new Object();
eventObj.target=司令部;//定义广播消息的对象
eventObj.type="on进攻";//定义消息的具体类型
其中target属性也可以不定义,dispatchEvent方法会将它设为默认的广播消息的对象。
*/
function dispatchQueue(queueObj:Object, eventObj:Object):Void
/*这个方法的中文意思,我根据它的功能将它称为"事件传达"。
queueObj:一个事件派遣中心对象
eventObj:事件对象,注意:与 dispatchEvent不同,它的target并无默认值,需要你手工设定.
为什么将这个方法称为事件传达呢?因为它可以让当前的事件派遣中心指示另一个事件派遣中心
(方法的第一个参数)向外界广播消息。其实在dispatchEvent方法的内部就调用了dispatchQueue,只
是将参数queueObj设为当前的事件派遣中心罢了。
*/
function addEventListener(event:String, handler):Void
/*注册某个事件的监听者
event:监听的事件名称
handler:监听事件的对象
这个方法与AsBroadcaster类的addListener方法相比,多出了参数event,
明确了所监听的具体事件。
*/
function removeEventListener(event:String, handler)
/*注销某个事件的监听者
event:事件名称
handler:要注销的监听事件的对象
这个方法与AsBroadcaste...
完整阅读本文...]]>
代码:
var myloadvars:LoadVars = new LoadVars();
myloadvars.load("test3.jsp");
myloadvars.onLoad = function(success){
if (success){
var a:String = this.myVars;
trace(a);
}
}
在Flex中比较常见的都是用WEBService,HTTPServive等来和后台进行数据通信的,通常是用XML做为通讯介质的,但有时候,在数据量不大,对结构化要求不高是,我们依然希望采用在Flash中比较熟悉的LoadVars,下面介绍如何让Flex像Flash那样传递参数:
首先,我们要有个输出参数的Jsp
test3.jsp:
代码:
<%@ page contentType="text/html;charset=utf-8"%>
<%
out.println("&myVars=ai829");
%>
其次,在mxml里有两种方式实现像Flash那样通讯
第一种方法就是用LoadVars:
LoadVars.mxml:
代码:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.macromedia.com/2003/mxml"
initialize="initApp();">
<mx:Script>
<![CDATA[
import mx.utils.*;
function initApp(){
var myloadvars:LoadVars = new LoadVars();
myloadvars.load("test3.jsp");
myloadvars.onLoad = function(success){
if (success){
var a:String = this.myVars;
alert(a);
}
}
}
]]>
</mx:Script>
</mx:Application>
以上是老方法,就不多说了,况且很不安全.
第二种方法就是用HTTPService,一般在用HTTPService时resultFormat默认是XML,现在我们要把它改成flashvars.
这样我们就像Flash那样传递参数,又可以用Flex的whitelist来保证安全,一举两得!
flashvars.mxml
代码:
完整阅读本文...]]>
这一讲,我们来结束跟踪导弹的学习。
五、跟踪导弹(续完)
上次我们已经知道怎样让导弹的旋转看起来像那么回事,紧接着就是让导弹运动起来了。
导弹的一些属性,我们需要好好定义一下,这是完整的初始化函数:
init = function () {
enemy._x = 40;
enemy._y = 350;
enemy._rotation = 0;
enemy_obj.MAXAngle = 6;
enemy_obj.MAXSpeed = 4;
enemy_obj.speedX = enemy_obj.speedY=0;
clickable = true;
};我们有了一个新的属性:enemy_obj.MAXSpeed,这个属性代表这导弹的速度,不管导弹的朝向如何,速度总是有一个值的,我们在这里设置它。在导弹运动的时候,就按照上一讲里面已经计算出来的方向和速度来前进。下面我们来看,怎样确定 x 和 y 方向的速度:

从上面的图片,我们可以根据三角计算得到导弹在 x 和 y 方向的速度,而速度之和正好是等于导弹的 MAXSpeed。
于是我们很容易的得到下面的代码:
dir = (refineAngle(enemy._rotation)>180) ? -1 : 1;
tempTan = Math.tan((90-enemy._rotation)*Math.PI/180);
enemy_obj.speedX = enemy_obj.MAXSpeed/Math.sqrt(1+Math.pow(tempTan, 2))*dir;
enem...
完整阅读本文...]]>
五、跟踪导弹(续)
前面讲过了如何让导弹朝向玩家,但是真正在应用的时候,不可能这么生硬的体现。大家可能也发现了,导弹的方向一直指向玩家,其实很不真实,那么如何才能更加真实一些呢。常用的方法有几种,我们这里介绍其中一种,其它的大家可能要去参考游戏开发图书了。
在这里,我们使用的方法是,导弹有一个最大转向角度,也就是说,如果转向达到这个角度,就不能再转了,这样,看起来就会真实一些,导弹也就不回一下子面对玩家,看看下面这个例子,我把导弹的最大转向角度设置为3的情况:
这个时候,如果导弹再跑起来,就比较像那么回事了。
我们来看一下,如何判断:

出于习惯,我喜欢 0~360°之间的计算,所以这次引入了一个小函数,用来将角度表现在 0~360°之间。
refineAngle = function (angle:Number):Number {
return ((angle+360)%360);
};我想,哪怕是新手,也应该看得懂了吧?
为了以后方便,我们还是创建了一个对象: enemy_obj,并且用 enemy_obj.MAXAngle 来定义导弹的最大转角。
...五、跟踪导弹
看看这个例子,在动画屏幕上按下鼠标,导弹就会跟踪玩家,直到击中玩家:
对于新手来说,一下子就实现它可能不太容易,我们来一点一点的做。
(1)导弹的方向
我们先来实现导弹朝向玩家的功能,就像下面这个:(按下鼠标观看)
首先,我们注意到,敌人的导弹是要朝向玩家的,这和前面不同。前面的敌人是一个圆头圆脑的家伙,不用分辨它的方向。我们就先来看一下如何让敌人有方向感。
首先给新手讲解一下基本知识:用鼠标来触发动画。
我们先设定...
完整阅读本文...]]>