闪客帝国:教程 闪客帝国教程 zh-cn 叶子 Allan 闪客帝国 闪客帝国 <![CDATA[Flash MX Action Script 针对初级用户的详细基础教程——第一讲]]> 首先说说AS的基础知识-----------------------------------

做过Flash动画的Flash爱好者们都知道,要做好一个Flash动画,AS是必不可少的,即使只是很简单的几句代码也能起到整个Flash画龙点睛的作用。这里我只简单的介绍一下AS的基本常识。

首先我们要了解AS要写在什么地方,什么时候AS会被触发执行。


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...

完整阅读本文...]]> 2005-02-17 <![CDATA[Flash MX Action Script 针对初级用户的详细基础教程——第二讲 MX AS 基础语法篇!]]>

AS 语法篇-----------------------------------

接下来要讲的是AS的语法。

首先要让大家明白的是:AS 语法的大小写是敏感的。

如: gotoAndPlay() 正确 gotoAndplay() 错误 。

关键字的拼写必须和语法一致,要做到很容易,因为在Flash的AS面板里面,关键字会有不一样的颜色显示。

很多Flash小鸟们也许要开始埋怨,记不住咋办?我这里有个办法,就是背。不要流下委屈的泪水,俺们都是这么走过来的。多用两次你就记住了。


这里说一下,我们要从开始就养成编程的好习惯,如在每个语句后面都加上分号,有可能的话,尽量给复杂的语句加上注释。注释的例子




//这个是注释,但是只能有一行

/* 这个也是注释,可以写很多行 */




接下来,介绍几个类型的语法。

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(条件){

//当条件满足时一直执行这里的代码
...

完整阅读本文...]]> 2005-02-17 <![CDATA[Flash MX Action Script 针对初级用户的详细基础教程——第三讲 MX AS对象篇]]>
虽然AS不是真正的面向对象的编程,但是它也有对象的概念。这个概念贯穿整个AS的始终,所以,对对象的理解,比对语法或者其他的理解更为重要。现在开始吧:

首先,我们来了解一下路径,路径分两种:绝对路径和相对路径。做过html的朋友应该知道这个概念。但这里我还是要详细解释一下,我认为对路径的理解要深入,我初学的时候就是磕在路径上。

在讲路径之前,有必要先讲一下 .语法 : 举例说明,这里要表示房间里的桌子上的一本

书,用 .语法这么表示:




房间.桌子.书




如果要再细到书上的页上面的字,很显然


房间.桌子.书.页面.字




看明白了吧?我也不懂得怎么说, .语法就是这样表示对象的,点的前面是其后面的父级。如房间是桌子的父级,桌子的子级就是书。

还是不明白?这样吧,你把 . 里写成“里面的”就可以了,这样就是


房间(里面的)桌子(里面的)书(里面的)页面(里面的)字




这样容易多了吧?

现在我开始说路径了,其中也要夹杂的对象的说明,看:


从例子入手。新建一个Flash文件,然后创建一个MovieClip,MC命名为“MC”,放在主场景里面,然后再创建一个按钮,放在“MC”里面,然后从库里面拖一个出来放在主场景,分别给这两个元素实例命名(Instance
Name , 注意是实例名不是MC的名字):MC->myMC button->myBtn

现在我们假设主场景是房子,MC是桌子,按钮是书,那么分别怎么表达房子,桌子,书呢?如下




_root 房子

_root.myMc 房子.桌子

_root.myMc.myBtn 房子.桌子.书




这里的 _root 是Flash的关键字,表示主场景的 Timeline (时间线)。

很容易理解对不。这里的 房子,桌子,书 都是我们要理解的“对象”。

当你找到这个对象后,才能对对象进行操作,才能给对象施加方法。比如,我现在要打扫房子,打扫是方法,但对象是房子,表达式是这样 :




房子.打扫()




如果你不能正确的表达房子这个对象,你的打扫也就不能正确的实施了。

*说明:这里为什么要在打扫后面加()呢?因为打扫是方法不是对象,为了让Flash知道这是个方法,我们必须加...

完整阅读本文...]]> 2005-02-17 <![CDATA[用AS2解决中文ID3的乱码]]> flash如果MP3的ID3标签使用GB2312编码,那么在FLASH脚本输出时是乱码的

代码1


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));

    }

}


输出结果是:

182

161

207

227

187

168

我们使用计算器转换成16进制就是"B6 A1 CF E3 BB A8";

正好是"丁香花"的GB2312编码,我们还是用FLASH来试试


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));

}


结果是:

%3F%3F%3F%3F%3F%A1%A7

问题的原因我们找到了,只要将GB2312转换成UTF-8编码就能显示正常了,可是如果转换呢,大家注意看代码2,我再测试...

完整阅读本文...]]>
2005-01-26
<![CDATA[FlashMX2004的事件机制:从AsBroadcaster到EventDispatcher(上)]]>   AsBroadcaster(广播)类在MX(flash6)里写做"ASBroadcaster",这是为什么有时会发生以前的程序在2004版里发生异常的原因之一。AsBroadcaster
类具有四个静态的方法:


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:注销监听者方法,也就是消息不再广播给谁听


  如此看来AsBroadcaster类也不怎么复杂嘛,下面看看它的具体使用吧!

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("装甲兵接到司令部来电,加足马力,火速向敌方阵地开进!");

}

...

完整阅读本文...]]> 2005-01-26 <![CDATA[FlashMX2004的事件机制:从AsBroadcaster到EventDispatcher(下)]]> EventDispatcher类有2个静态方法:

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...

完整阅读本文...]]> 2005-01-26 <![CDATA[让Flex像Flash那样传递参数]]>

代码:


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

代码:



完整阅读本文...]]>
      
      2005-01-26
      
    
    
      <![CDATA[游戏开发系列一:游戏中的敌人(7)]]>
      
      
        
          

  这一讲,我们来结束跟踪导弹的学习。


  五、跟踪导弹(续完)


  上次我们已经知道怎样让导弹的旋转看起来像那么回事,紧接着就是让导弹运动起来了。





  导弹的一些属性,我们需要好好定义一下,这是完整的初始化函数:


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...

完整阅读本文...]]> 2005-01-11 <![CDATA[游戏开发系列一:游戏中的敌人(6)]]>   上一讲,大家应该学习了一点基本的角度知识了,下面进行下一步。


  五、跟踪导弹(续)


  前面讲过了如何让导弹朝向玩家,但是真正在应用的时候,不可能这么生硬的体现。大家可能也发现了,导弹的方向一直指向玩家,其实很不真实,那么如何才能更加真实一些呢。常用的方法有几种,我们这里介绍其中一种,其它的大家可能要去参考游戏开发图书了。


  在这里,我们使用的方法是,导弹有一个最大转向角度,也就是说,如果转向达到这个角度,就不能再转了,这样,看起来就会真实一些,导弹也就不回一下子面对玩家,看看下面这个例子,我把导弹的最大转向角度设置为3的情况:





  这个时候,如果导弹再跑起来,就比较像那么回事了。


  我们来看一下,如何判断:



  出于习惯,我喜欢 0~360°之间的计算,所以这次引入了一个小函数,用来将角度表现在 0~360°之间。


refineAngle = function (angle:Number):Number {
return ((angle+360)%360);
};

  我想,哪怕是新手,也应该看得懂了吧?


  为了以后方便,我们还是创建了一个对象: enemy_obj,并且用 enemy_obj.MAXAngle 来定义导弹的最大转角。

...

完整阅读本文...]]>
2004-12-31
<![CDATA[游戏开发系列一:游戏中的敌人(5)]]>   讲过最简单的跟踪,我们来看一下复杂一些的跟踪,这里还是不去讨论障碍,因为那需要额外的数据支持。


  五、跟踪导弹


  看看这个例子,在动画屏幕上按下鼠标,导弹就会跟踪玩家,直到击中玩家:





  对于新手来说,一下子就实现它可能不太容易,我们来一点一点的做。


  (1)导弹的方向


  我们先来实现导弹朝向玩家的功能,就像下面这个:(按下鼠标观看)





  首先,我们注意到,敌人的导弹是要朝向玩家的,这和前面不同。前面的敌人是一个圆头圆脑的家伙,不用分辨它的方向。我们就先来看一下如何让敌人有方向感。


  首先给新手讲解一下基本知识:用鼠标来触发动画。


  我们先设定...

完整阅读本文...]]> 2004-12-24

本页面由 Flash 保存计划 从 Internet Archive 存档还原 · 快照 2005-01-13 · 原址 http://www.flashempire.com/include/rss/rssTutor.php ← Flash 保存计划