AS3的语法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

使用flash.system.Capabilities 中的hasAudio和hasMP3属性确定正在运行flashplayer设备的音频性能。

如果用户的系统具有音频的性能flash.system.Capabilities.hasAudio属性返回true,否者返回false。

为了在多种设备上播放影片这一点极其重要。

如果设备不支持音频,就要强制避免用户下载他们不能听的东西(特别因为音频是非常大的)。

// Load a .swf containing sound only if the Player can play audio
if (flash.system.Capabilities.hasAudio) {
content = "sound.swf";
} else {
content = "silent.swf";
}
// code to load the .swf referenced in content
然而,仅因为系统具有音频性能,也不必然意味着能够播放MP3音乐。

因此,如果要发布MP3内容,应该用flash.system.Capabilities.hasMP3属性测试MP3性能。

如果支持,MP3声音更合适,因为它们比ADCP声音有更高的性能比。

// If the Player can play MP3s, lad an MP3 using a Sound object.
// Otherwise, load a .swf containing ADCP sound into a nested
// sprite.
if (flash.system.Capabilities.hasMP3) {
var url:URLRequest = new URLRequest("sound.mp3");
sound = new Sound(url);
sound.play( );
} else {
// code to load an external .swf containing a ADCP sound
}
重要的是理解hasAudio和hasMP3的属性设置是根据播放器的性能而不是正在运行播放器的系统的性能。

桌面系统的播放器(windows,Mac OS和linux)无论系统是否真正有播放声音的硬件(也就是声卡和扬声器)那两个属性总是返回true。

然而,如果设备不支持音频或MP3特征,其它设备的播放器可能返回false。

不能完全关闭flashplayer的弹出菜单,但是可以通过设置stage.showDefaultContextMenu的属性为false将菜单的选项减少到最少。

默认的,当用户在窗口中单击右键(或在Mac中的控制键)时flashplayer弹出的菜单中出现下列选项:
•Zoom In
•Zoom Out
•Show All
•Quality (Low, Medium, or High)
•Settings
•Print
•Show Redraw Regions (if using a debug player)
•Debugger (if using a debug player)
•About Adobe Flash Player 9
可以用下列代码移去大多数选项,但是Settings和About和debug player选项仍然会保留:
stage.showDefaultContextMenu = false;
遗憾的是flash不提供任何方法完全关闭菜单。

此外,windows的用户习惯于用右键弹出浏览器菜单而在新窗口中打开一个连接。

因此不可避免的flash弹出菜单选项的出现。

用stage.align属性可以改变播放器中影片的对齐方式。

flash影片默认的是在播放器中心显示。

通过设置任何DisplayObject的子类的stage.align 属性控制播放器中影片的对齐方式。

重要的对齐模式作为字符串来执行,就像"T"代表"top","L"代表"left"等等。

然而,为了避免打字错误,它们被当作flash.display.StageAlign类的属性列入下表:
值垂直对齐水平对齐
StageAlign.TOP Top Center
StageAlign.BOTTOM Bottom Center
StageAlign.LEFT Center Left
StageAlign.RIGHT Center Right
StageAlign.TOP_LEFT Top Left
StageAlign.TOP_RIGHT Top Right
StageAlign.BOTTOM_LEFT Bottom Left
StageAlign.BOTTOM_RIGHT Bottom Right
没有"official"值来对齐播放器中垂直和水平都在中间。

当然,如果想要这样,你不用采取任何措施因为这是默认模式。

但是你从其它的模式向要返回到中心对齐模式,其它模式的任何字符串都不匹配场景的中心。

最简单和最安全的是设置成空字符""。

下面的类示范在播放器中缩放模式和对齐影片的效果。

尝试改变stage.scaleMode和stage.align的属性和缩放播放器的尺寸。

package {
import flash.display.Sprite;
import flash.display.StageScaleMode;
import flash.display.StageAlign;
public class ExampleApplication extends Sprite {
public function ExampleApplication( ) {
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_RIGHT;
graphics.beginFill(0xff0000);
graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);
graphics.endFill( );
}
}
}
使用stage.scaleMode属性可以控制影片适应播放器,包括缩放。

当播放器的尺寸变化时,有不同的缩放模式控制影片的缩放。

模式定义成下列字符串:exactFit, noBorder, noScale, 和showAll。

然而,为了避免打字的错误,这些字符串当作静态属性:EXACT_FIT, NO_BORDER, NO_SCALE, 和SHOW_ALL定义在flash.display.StageScaleMode类中。

flash播放器默认的缩放showAll模式。

这种模式下,flash影片会在影片的初始比例缩放以适应播放器的尺寸。

如果播放器的外观比例和影片的外观比例不一致会使影片出现边框。

在主要的程序中设置影片为showAll模式格式如下(不要忘记置入flash.display.StageScaleMode类)
stage.scaleMode = StageScaleMode.SHOW_ALL;
注意stage不是一个全局对象,而是任何一个可视化对象的一个属性,因此这个语句仅仅适用于sprite或可视化类的扩展类。

noBorder模式缩放影片适应播放器会保持原来的外观比例;当然,它会强制播放器显示没有边框的场景。

如果播放器的外观比例和影片比例不一致,在边缘的影片的一部分会被切割掉。

设置影片为noBorder模式:
stage.scaleMode = StageScaleMode.NO_BORDER;
exactFit模式缩放影片适应播放器,它会改变影片的外观比例,如果必须,会匹配播放器。

结果是影片总是恰好充满播放器,但是影片的元素可能会变形:
stage.scaleMode = StageScaleMode.EXACT_FIT;
在noScale模式中影片不能缩放,它会保持原来的尺寸和外观比例而不管场景的尺寸。

使用noScale模式不要忘记设置影片的对齐排列。

stage.scaleMode = StageScaleMode.NO_SCALE;
scaleMode属性的值不会阻止用户通过右键菜单缩放影片。

然而,你可以关闭菜单中的那些选项。

用system.capabilities对象的screenResolutionX和screenResolutionY 属性可以得知影片运行的显示设置。

你可以利用flash.system.Capabilities对象确定正在运行影片的设备的显示设置。

screenResolutionX 和screenResolutionY 属性返回显示的像素。

// Example output:
// 1024
// 768
trace(flash.system.Capabilities.screenResolutionX);
trace(flash.system.Capabilities.screenResolutionY);
利用这些值决定如何显示一个影片,或载入哪一个影片。

这些判定对于许多支持flashplayer的手持设备日益重要。

比如,手机的荧屏尺寸和电脑的桌面显示是不同的,因此需要根据播放设备载入不同的内容。

var resX:int = flash.system.Capabilities.screenResolutionX;
var resY:int = flash.system.Capabilities.screenResolutionY;
// If the resolution is 240 x 320 or less, then load the PocketPC
// movie version. Otherwise, assume the device is a desktop computer
// and load the regular content.
if ( (resX <= 240) && (resY <= 320) ) {
var url:String = "main_pocketPC.swf";
}
else {
var url:String = "main_desktop.swf";
}
loader.load(new URLRequest(url));
也可以利用荧屏的分辨率中心弹出一个浏览器窗口。

var resX:int = flash.system.Capabilities.screenResolutionX;
var resY:int = flash.system.Capabilities.screenResolutionY;
// Set variables for the width and height of the new browser window.
var winW:int = 200;
var winH:int = 200;
// Determine the X and Y values to center the window.
var winX:int = (resX / 2) - (winW / 2);
var winY:int = (resY / 2) - (winH / 2);
// Create the code that, when passed to URLLoader.load( )
// opens the new browser window.
var jsCode:String = "javascript:void(
newWin=window.open('/'," +
"'newWindow', 'width=" + winW +
", height=" + winH + "," +
"left=" + winX + ",top=" + winY + "'));";
// Call the JavaScript function using a URLLoader object
urlLoader.load(new URLRequest(jsCode));
另外,也可以考虑根据荧屏的分辨率大小是否缩放影片。

例如,当用户分辨率设置较高,像1600×1200,有些字体会显示的太小。

用nguage 属性和flash.system.IME 类可以知道显示影片的电脑使用的语言和用户将要输入的文本。

使用nguage属性可以测定电脑系统的语言。

该属性返回一个两个字母的ISO-639-1的语言代码(如"fr"代表法语)。

有的地方可能需要附加两个区域字母并用“-”号分开(例如,“zh-CN”代表“中文简体”而“zh-TW”代表中文繁体)。

对于语言代码一览表可以看/standards/iso639-2/englangn.html 和/iso/en/prods-services/iso3166ma/02iso-3166-code-lists/list-en1.html
利用这一属性可以动态的载入适合语言的内容:
// Create an associative array with language codes for the keys
// and greetings for the values.
var greetings:Array = new Array( );
greetings["en"] = "Hello";
greetings["es"] = "Hola";
greetings["fr"] = "Bonjour";
// Extract the first two characters from the language code.
var lang:String = nguage.substr(0, 2);
// Use a default language if the language is not in the list
if (greetings[lang] == undefined) {
lang = "en";
}
// Display the greeting in the appropriate language.
trace(greetings[lang]);
当要在影片中提供多种语言时,可以选择不同的方法。

第一种方法,像前面的代码那样为所有影片中出现的文本创建相关的数组。

另一种方法是在多个影片中创建固定的内容(每种语言创建一种)并且根据语言代码载入影片。

利用这种技术,每个swf文件名应包含语言代码,例如myMovie_en.swf, myMovie_es.swf, myMovie_fr.swf等等。

// Get the language from the capabilities object.
var lang:String = nguage.substr(0, 2);
// Create an array of the languages you are supporting (i.e.,
// the languages for which you have created movies).
var supportedLanguages:Array = ["en", "es", "fr"];
// Set a default language in case you don't support the user's
// language.
var useLang:String = "en";
// Loop through the supported languages to find a match to the
// user's language. If you find one, set useLang to that value
// and then exit the for statement.
for (var i:int = 0; i < supportedLanguages.length; i++) {
if (supportedLanguages[i] == lang) {
useLang = lang;
break;
}
}
// Load the corresponding movie.
var movieURL:String = "myMovie_" + useLang + ".swf");
了解用户根据自己系统怎样输入文本常常也很重要。

语言可能有数以千计的情况,如汉语,日语,韩语。

为了通过键盘输入这些字符,必须有一个叫做Input Method Editor(IME)的特殊程序。

这通常是特殊语言操作系统的一部分。

如果发现用户的系统中有IME,检测flash.system.Capabilities.hosIME的值会返回true 或false。

然后用flash.system.IME类获得更多资讯和互动。

flash.system.IME能够告诉你是否用户正在使用IME或直接从键盘输入文本。

这个属性是可写的,因此可以利用它打开IME。

在某些平台和操作系统,可以发送一个字符串到IME转换成正确的字符,而且可以接受IME 输出返回到一个文本域。

因为它不能使用在所有系统,所以最好先检测操作系统。

扩展flash.events.EventDispatcher和叫做dispatchEvent()的方法,你就可以派遣事件。

事件是对象间通讯的重要方式。

这也是创建灵活系统所必需的。

Flash Player 9有内置的事件派遣机制在flash.events.EventDispatcher类中。

所有的派遣事件类有继承至EventDispatcher(NetStream和Sprite等等)。

如果要定义一个派遣事件的类,你需要扩展EventDispatcher,就像下列:
package {
import flash.events.EventDispatcher;
public class Example extends EventDispatcher {
}
}
EventDispatcher类有两个公开的方法addEventListener()和removeEventListener(),你可以从任何一些EventDispatcher子类的实例注册事件监听。

EventDispactcher也定义了一个受保护的方法dispatchEvent(),你可以从子类中执行它来派遣一个事件。

作为一个flash.events.Event 对象或一个事件的子类dispatchEvent( )方法至少需要一个参数。

你可以定义一个常量
声明常量如同声明属性,仅仅用const关键词代替了var。

顾名思义,常量的值不能更改。

当你想要一个简单的标识符引用复杂的数据或者想要利用编译定时(complex-time)检测数据的错误时,常量是很有用。

Math.PI就是一个常量的例子,它包含一个复杂的数值(pi或者3.1415926)。

MouseEvent.MOUSE_UP包含值mouseUp,这是个一允许常量错误检测的例子。

当对鼠标弹起事件加入事件监听时,你可以用字符mouseUp。

然而,如果偶尔一个打字错误,一个不易察觉的错误,那么你的代码不会预期的执行:
// This is valid code, but because of the typo (mousUp instead of mouseUp) the
// code won't work as expected.
addEventListener("mousUp", onMouseUp);
用一个常量能够帮助你。

如果你偶然拼错这个常量,编译器会给出错误:
// This causes a compile error.
addEventListener(MouseEvent.MOUS_UP, onMouseUp);
声明一个常量的语法与声明一个标准属性类似。

唯一的不同是不用var关键词而应用const关键词。

虽然没有要求,但多数常量要用public和static一起修饰。

如果想要常量被public和static修饰,你必须正确使用这些特性。

而且,你必须在声明时给常量附值:static public const EXAMPLE:String = "example";
按惯例,常量的名字都应大写。

这样能够容易识别和区分属性中的常量。

创建一个方法,每当你需要运行那些动作时call它的名子。

而function就是这类的成员,它就是用来call一个方法。

如何创建一个这样的方法:
accessModifier function functionName ( ):ReturnDataType {
// Statements go here.
}
为了call(也就是运行)这个命名的方法,需要提起名字,就像:
functionName( );
这组语句的内允许你定义你喜欢多次运行的方法。

这样的好处是没有必要把相同的动作多次复制在不同的地方。

集中在方法里的代码会更容易理解(因为你写一次,而以后的使用中不再理会其中的细节)和更容易维护(因为你只需要在一个地方更改)。

象类变量,方法能够用访问修饰语声明。

这就决定了其它的哪些类能够call这个方法。

可用的访问修饰语是:
private:仅仅在类内部访问。

protected:可以被该类和任何子类访问,这是以实例为基础的。

换句话说,一个类的实例能访问自身被保护的成员或者父类的。

但是它不能访问其它同类实例中被保护的成员。

internal:能够被在同一个包中的类或其它类访问。

public:能够被任何类访问。

private的定义根ActionScrit2.0不同,那里是能够被子类访问的。

如果你没有明确的访问修饰语,将会被定义成internal。

下面的类定义了一个drawLine的方法并运行了10次。

package {
import flash.display.Sprite;
public class ExampleApplication extends Sprite
{
public function ExampleApplication( ) {
for(var i:int=0;i<10;i++) {
drawLine( );
}
}
private function drawLine( ):void {
graphics.lineStyle(1, Math.random( ) * 0xffffff, 1);
graphics.moveTo(Math.random( ) * 400, Math.random( ) * 400);
graphics.lineTo(Math.random( ) * 400, Math.random( ) * 400);
}
}
}
另外一个重要的方法类型是静态方法。

静态方法不允许从类中实例化,但是可以直接由类自己运行。

例如,有一个ExampleApplication类,你可以定义一个静态方法。

public static function showMessage( ):void {
trace("Hello world");
}
你可以用这种方法运行:
ExampleApplication.showMessage( );
有些类除了静态方法什么也没有。

Math类就是一个例子。

你可以直接使用如:Math.random(),Math.round()等等。

像方法一样创建属性的行为
用隐性的getters和setters。

所有的属性应当声明为private或protected。

public属性因封装的原不是一个好方式。

应该力求良好的封装。

这意味着,一个类不能暴露它内在的容易被破坏的属性;public属性能被开发者轻易的破坏一个类或类的实例。

看看下面使用public属性的简单事例:package {
public class Counter {
public var count:uint;
public function Counter( ) {
count = 0;
}
}
}
你可以构造一个Counter实例,并且改变count属性的值。

var counter:Counter = new Counter( );
counter.count++;
然而,如果这个程序规定的商业规则要求一个Cound不能超过100呢?你可以看到含有public count属性的Counter类很容易破坏这个规则。

一种方法是用显式的getters和setters,看下面的例子:
package {
public class Counter {
private var _count:uint;
public function Counter( ) {
_count = 0;
}
public function getCount( ):uint {
return _count;
}
public function setCount(value:uint):void {
if(value < 100) {
_count = value;
}
else {
throw Error( );
}
}
}
}
另一种方法是用隐式的getters和setters。

隐式的getters和setters像方法一样定义,但是看起来像属性。

下面是一个getter的语法:
public function get name( ):Datatype {
}
一个setter的语法:
public function set name(value:Datatype):void {
}
下面用隐式getter和setter方法声明count:
package {
public class Counter {
private var _count:uint;
public function Counter( ) {
_count = 0;
}
public function get count( ):uint {
return _count;
}
public function set count(value:uint):void {
if(value < 100) {
_count = value;
}
else {
throw Error( );
}
}
}
}
然后你可以像个public属性那样处理count:
counter.count = 5;
trace(counter.count);
moock大师的新书o’reilly’s essential actionscript 3.0 (eas3)现在已经开始预定了,如果你现在有美元的话,可以从这里(2 hits)预定大师的新书.目前知道的全球比较知名的Actionscript 3书,一本是ActionScript 3 cookbook.一本是Advanced ActionScript 3 with Design Patterns.在就是moock大师的essential actionscript 3.0
下面是moock大师书中的全部范例代码:
In-progress code example
多人互动聊天教程基于Flash Communication Server构建
发布时间: 2007-2-02 00:43 作者: foxet 来源:
字体: 小中大| 上一篇下一篇| 打印
作者: Foxet
开发时间: 3.11.2003
开发工具: Flash MX,文本编辑工具
调试环境: Flash Communication Server 1.0或以上
开发知识: 有MX as 和FCS基础(本文对命令的‘用法’不作分析)
对象:想了解“FCS如何结合FLASH进行开发应用”的人
一、前言
说到网络上的文字、视频、音频等涉及通讯应用的开发,大多会想到用java(C++也可以),没错,java在这方面的确很强大的,但门槛高,需要有好的编程基础,就算会写,也得花不少时间,更不必说设计者开发这样的应用时要遇到多大的困难了......
但大多数的网络设计者对FLASH却是十分熟悉(就算不熟悉,总会了解一点吧),而且Flash的播放器受到广泛支持,MM看到了这些,它们发行的Flash Communication Server 使设计者们可以通过Flash的脚本语言来控制复杂的网络交流,从而大大节省了开发时间......
我们这里就用FCS跟FLASH脚本编程结合起来,开发一个多人互动的应用,建议大家先看一下文件,知道有什么,接着看一遍本文,知道怎么回事,最后再结合文件,融会贯通。

二、构思
先来构思一下内容:
首先,我们会有一个场境,上面有一些物件(例如树,屋之类的)。

然后,当客人上我们的SWF,我们让他选择一个角色,填上自己的名字。

接着,角色出现在场景。

再接着,有另外一些客人在地球不同地方也连上了,登陆后,他们也会有自己的角色,我在场景中可以看到他们,他们也可以看到我。

然后再接着,象RPG网络游戏一样,我们会有走动,也可以看到对方的走动,并且我们之间会有文字的对话,如果喜欢,也可以只按一键就可以用语音对话(视频就先免了吧,我们已经有角色来代替我们的样子的出现了,但不排除以后再加进去)。

好了,我们心中已经有辐图像浮现出来了。

三、材料准备
选材:
本例子的素材选择很重要,决定我们的程序怎样写。

一开始,我们先要决定材料的大小,视角,这个对我们的程序有很大的影响,大小比例要一
致,这就决定我们需要的是一套完整的图片,视角也要一致(除了角色本身),这就决定我们还必须从这套完整的图片中挑选,因为我们看一个场景时只能看到一个方向,要么全是45,要么全是60度,如果你把一些不同角度的图片摆在一起,除了不协调外,程序上处理层次(层次指:每种物件因为位置不同都会有不同深度,一个物件会遮住另一物件)也会变得无所适从(注意:如果不是用数组地图可能没有的这个问题),只要视角能统一,无论是30度,45度还是n度,处理过程都基本一致,是没有难度的差别,(这里初学者可能会听得一头雾水,可以先往下看,在实践中思考)在这里我选了几张不太好的位图(找很辛苦),可以把这些图片归成两类
角色;这里我们要用几个不同的角色,每个角色几个方向的图片都要准备,可以是4面,8面,甚至是16面,处理差别不大(由于材料的限制,我只用了四面的),而每个方向至少要有两张图,来模拟该方向的动态效果
物件:静态图就可以了,需要的时候也可以用动态图
接着,我们Firework或其他图形编辑软件将图片空白处转成透明,这样就得到素材了。

理材:
将素材导入FLASH后,我们把不同物件的作成不同的MC,对于数,屋,椅,我们处理如下(具体操作省)
种类名称Linkage Name M C Name
房子room2 room2
小树tree1tree1
大树tree2tree2
椅子sit1 sit1
邮筒email email
垃圾箱rul rul
对于人物的处理,先建立一个mc:c1(所有的角色按照C1,C2,C3...),
c1内有4桢,每桢有一个表示方向的MC,MC名都是DIR,
mc的分别代表四个方向:上下左右方向
mc:c1up,c1down,c1left,c1right
如果有多个方向图片,就多做个方向mc
每一个方向mc有3桢,是该方向的动作
好了,我们已经准备好材料了,接下来我们开始写程序.
四、编写程序:
写的程序必须跟素材挂钩,但同时也要有自己的独立性,也就是写的程序必须适应你收集的素材,例如前面说到的视角,具有自己的独立性是指,写完这个应用后,如果要换素材,或者要扩展,程序不需要作出大举动的修改,所以我们写程序的时候要
留有一着,说不定一段日子后我们要写一只网络RPG游戏,或者是写一个社区,我们把代码拿出来,可以容易地在远来基础上来改.
好,现在来看看素材跟程序对应的关系:
可视对象:程序:
地图---------数组地图(Map)
物件(树之类的)---------标记(Key)
角色---------互动
需要通过FCS交换数据的部分
角色踩点
角色方向动作
音频
文字
从地图开始着手,建立二维数组地图
为什么要建立数组地图?这是小型RPG游戏的基础,它可以方便建立从简单到复杂的数学模型,适于扩展,例如一些地形,绕障,过场等,可以同过对数组的删减,二次变换等来实现,这部分很有趣,但本文在不作做详细的介绍。

现在先把我们flash的视图模式改为显示格子,view->grid->show grid并把他的间隔设置为10×10,我觉得这种大小看起来比较舒服。

我们假定在场景一区域作为地图,把这段区域X轴方向分为rxn格,每格是大小是rx,Y轴方向分为ryn格,每格大小是ry,如果把整个场景也看为由rx,ry构成的小格,但数组地图的rx,ry不设为10,而是更小的5,那么我们可以1:2跟视图的格子联系上,startnx,startny 分别表示地图起始的格数,现在我们把地图MC拖放到从第(startnx,startny)开始的位置。

接下来要把数组建立起来,有的人喜欢会直接给出数组,但因为我们设地形为平坦,同时为了容易修改,我们用function建立,
mapadd(startnx, startny, rxn, ryn, rx, ry)
现在从库中拖出地图的图片放在场景适当的位置中,我们可以很容易读出视图格子起始(6,5),转化成数组map时要乘2,
角色行走基础:
本来介绍完地图,顺理成章应该介绍上面的物件才对,但有些东西为了让大家好理解,先提上来说.
我们这里用的角色控制是经典的键盘控制行走,先简单介绍一下
(有游戏基础的可以略过这里)
我们用以下这两条命令进行方向键捕获:
X轴方向的,左右两值相减,求出步行左右方向,步长为一
var rl = (Key.isDown(Key.RIGHT)-Key.isDown(Key.LEFT));
Y轴方向的,左右两值相减,求出步行前后方向,步长为一
var ud = (Key.isDown(Key.DOWN)-Key.isDown(Key.UP));
接下来我们是要让人物在地图行走,
随便拖一个角色进入场景,就拿c1吧,变量为_root.cha,
让其在数组地图有对应的坐标
_root.xpos,root.ypos
并让其通过数组地图取了实际坐标
map[_root.xpos][root.ypos]
请看下面的代码
现在角色可以在地图上行走,而不会超出地图.但不能进行网络上的互动
要进行网络上的互动就要通过FCS....,我们从登陆开始入手
服务端与客户端的对话
例子中我做了一个登陆平台(lib:LoginP)
当某一用户填了名字,选了角色,并按LOGIN,我们就可以得到两个变量,
并调用doConnect function
人物建立与人物的间文字交流
现在把加入人物的addcha function拿上来看看;从图中我们可以看到一个人物应该包括几部分,
一是角色本身的MC,二是人物对话框,三是登录名的标签
这时候当用户发送文字"倒,你很傻",用chat_so.sent("showmsg",_root.chaname,"倒,你很傻") 就可以各客户端包括自己调用showmsg."倒,你很傻"字样出现在对话框和又边的文字记录框
再回到地图的行走
现在大家可以启动FCS来调试一下,如果发现有不正常的工作,要注意的是,有些机械化的操作(例如建立一个MC,设变量),我这里省略了过程,大家可能以参考看我的文件
创建环境(添加物件)
添加物件前,先把物件分类,再设置属性
例如以树为一类物件,不同linageID表示其属于不同的类,这里是"tree",想象一下,当树在场景中(同样要把它理解为在数组地图上的某个坐标),人物是不能穿过它的,也就是有些位置必须进行标识(管它叫该物件的占位点),标识其实就要是把在数组地图中对应坐标的KEY设为0,让人物行走时侦测到这一坐标不可以行走而停留.
好,再来看这树MC本身,它到底有那几个位置是不能穿过呢?(如果目测不太准确,可以先把MC放到场景在VIEW GRID 编辑方式下看,或者干脆CTRL+ENTER,用控制小人来确定,一般目测就可以了),我们看出这树的占位点大概有四点(看白色格子),而且都在同一Y轴的坐标上,这里要注意的是:树冠所占的坐标是可以行走的,只不过这时人物被树所遮,所以不能行走的只是树根的部分.由于TREE的坐标原点位于在左下角,那么这四个点为[0,0],[1,0],[2,0],[3,0]
我们表示为:
clip_ocu.tree = [[0, 4]];
clip_ocu是收集各种类型占位属性的对象
可以看到clip_ocu.tree是一个二维数组,第一维表示Y轴,第二维表示X轴
这里的意思是在Y=0的位置,X的跨度范围从0到4的这些点都是占位点
再拿另一种类"tree2"来看看:
这样的占位点我们应该怎样表示呢?
我们可以这样写
clip_ocu.tree = [[0, 4],[0.4]];
表示在Y=0的位置,X的跨度范围从0到4,
在Y=1的位置,X的跨度范围从0到4,
这些点都是占位点
由此可见,我们可以通过增加数组的长度来表示不同Y轴上连续的X坐标点,第二维数组所表示的跨度并不一定相等,也不一定要从0开始,例如:
clip_ocu.room2 = [[0, 11], [2, 15], [4, 19], [6, 22]]也是可以的,文件中的房屋就是这样的一个例子.
可能有人会问,为什么要搞这几个表啊,直接把物件拖到场景不是更好?
其实这样做是为了能够方便修改和扩展,使我们只需对表操作就可以达到目的,同时为数学模型的建立提供良好的数据形式,例如我现在要多加个场景,我只需要调用相应的座位表,再addclips就可以完成操作了,再如,我要建立随机地图,那么可以先随机算出“网络”,再建表。

当然如果你只是想把这个应用做完就算了,不打算修改,扩展的话,那么你可以直接把物件拖到场景就ok了。

五、总结
这篇文章到这里算是完了,但这个APP还有很多想象的空间,例如可以添加一些花巧的东西,验证,等级,踢人,动作之类的;也可以运用一些数学模型,如cameral,但要注意的是flash本身的功能限制,不要一味加入大量运算而使应用的可用性或可玩性降低,我比较倾向于把一些简单的运算给Flash,把一些复杂的留给数据库来做(如提供智能的数据),或者这时候大家已经想到前面我提到的网络RPG,社区之类的....
还有的就是在这篇文章没提到的细节,大家可以参考一下我的源文件,如果有时间我也会以教程的方式作一点作补充。

希望这篇文章对大家有点用,同时预祝大家开发出出色的互动程序。

FMS 客户端聊天代码(组件版)
By flash0733 发表于2007-1-13 11:50:00
//与FMS服务器连接
var my_nc:NetConnection = new NetConnection();
my_nc.connect("rtmp://192.168.1.49/flash");
out.text = "正在尝试连接,请稍后……";
//连接判断
my_nc.onStatus = function(info) {
if (info.code == "NetConnection.Connect.Success") {
out.text = "已经与服务器连接成功,您可以聊天了。

";
//建立远程共享
talk_so = SharedObject.getRemote("myFSO", this.uri, true);
//共享触发事件
talk_so.onSync = function() {
//清空聊天记录列表
list.text = "";
//重新加载聊天记录列表
var t = talk_so.data.listTxt;
for (var i = 0; i<t.length; i++) {
list.text += t[i]+newline;
list.vPosition = list.maxVPosition;
}
};
//共享连接服务器
talk_so.connect(this);
} else {
out.text = "与服务器连接失败,请与管理员联系。

";
}
};
//发送
function post() {。

相关文档
最新文档