主题:  desktoprectlist源码分析报告

南山东篱摄螂

职务:普通成员
等级:4
金币:10.0
发贴:1840
#12001/6/23 21:51:47
jerrowolf 的分析

desktoprectlist源码分析。

(一)

整个源程序比较简单,主要应用了3个常用的lingo属性。

1,the desktoprectlist
这是一个线形表,它由一系列rect组成。每一个rect针对用户的一个显示器,比如:

[rect(0,0,1024,768),rect(0,0,800,600)]

这个表显示的内容是:用户有两个显示器,第一个显示器的分辨率是1024×768,第二个显示器 的分辨率是800×600。
而一般情况下,用户只有一个显示器,那么当在messege窗口中put the desktoprectlist时,结 果如下:

put the desktoprectlist
-- [rect(0,0,1024,768)]

2,rect
rect是(Rectangle)矩形的简称。它包含4个数字,分别代表矩形区域的左端,顶端,右端和底 端。这四个数字可以表达两种含义:一,矩形区域的大小,二,矩形区域的位置。比如:rect(10,20,400,300),这个rect的含义就是,该矩形区域左上角的坐标是(10,20),该矩形区域的大小是(400-10)×(300-20)=390×280。

3,drawrect
这也是一种rect,它是窗口特有的属性,表示窗口中舞台的显示区域,通过修改它的值可以很方便的将stage上的精灵进行缩放。这里指的缩放是指视觉上的缩放,实际精灵的大小不会改变。就好像我们放大去看一张图,我们看到的是一个放大的图片,而实际上我们没有放大它的实际尺寸。


(二)
下面对score上的结构进行分析,
其实结构很简单,首先在帧脚本上分析。共有2个帧脚本,第一个是初始化一个field对象,该对象体现程序运行的结果。第二个帧脚本就是停留在该帧上。

然后分析通道上的精灵,通过运行该程序,可以知道,只有两个按钮上有响应事件,那么我们分别看一下两个按钮上的behavior。

首先,按钮expand上的behavior是myDrawRectFullScreen。其内容就是通过表the desktoprectlist获得用户显示器的分辨率,然后通过设置the stage的rect属性,将窗口的大小设成和该分辨率相同大小。然后将the stage中精灵的显示区域也设成相同大小,这样就达到了使movie缩放达到全屏的效果。
具体程序如下:

on mouseUp
(the stage).rect = the desktopRectList[1]
--获得用户显示器的分辨率并且将舞台的大小设成相同大小。
(the stage).drawRect=the desktopRectList[1]
-- 将舞台上的显示区域也设成相同大小,完成对精灵的缩放。
end

按钮Original上的behavior是resetting to original size,其内容和 myDrawRectFullScreen 类似。它所作的就是将the stage全部还原,包括窗口的大小和位置。包括舞台的显示区域。
具体程序如下:

on mouseup

(the stage).drawRect = rect(0, 0, 400, 300)
-- 重设将舞台的显示区域
(the stage).rect = rect(200, 200, 600, 500)
--重设舞台窗口的位置和大小

end


至此全部分析结束。



zwjn

职务:普通成员
等级:1
金币:0.0
发贴:110
#22001/6/25 13:01:23
东影默兄,我就不发给你了,直接跟帖把,这两天好懒,不想动任何事,再加上我一看源程序就好失望好象我是见过的,所以一直没有写,今天想想不行,既然自己答应要做的,还是先把它的写出来才是
这个程序主要是表现如何建立连接,用户创建与删除,创建应用实例,获取信息等方法,
当创建一个Multiuser Xtra实例之后的第一件事是要定义一个或若干个负责处理接受到的消息的回调函数,调用setNetMessageHandler(#handlerName,handlerObject,{subject,{sender}}{,integerPassMessage})来定义回调函数, integerPassMessage为正数时,消息作为参数传递给回调函数,默认是0不传递,subject与sender的使用可以让你定义不同的函数来处理不同的发送人,以及他们发送的不同类型的消息
原程序使用的是
gConnect.setNetMessageHandler(#DefaultMessageHandler, script 1)
他的回调函数是DefaultMessageHandler,此函数是在第一个script中,接受到的消息并没有作为参数传递到DefaultMessageHandler函数,而是在该函数里调用gConnect.getNetMessage()来获取受到的消息,并且所有消息都用函数DefaultMessageHandler来处理

第二建立连接,用connectToNetServer(userName,password,serverID,portNumber,movieID{,mode}{,encryptionKey})
程序里用的是
gConnect.connectToNetServer(whichName, whichPass, whichServer, 1626, "test")
几个参数都是由文本框得到的,1626端口是Shockwave MultiUser Server默认的端口,并且登记本movie的ID为test,如果你想在本机上测试的话,把serverID写上你机器的IP就可以了,当然你还要在你机器上运行MultiuserServer
到这里与服务端的连接就建立起来了,剩下的就是创建用户,创建应用了
对于服务端来说,只有userLever等级达到80以上才可以执行server端程序,所以如果你只是简单的运行这个例子的话,执行DBAdmin Objects只能得到Not permitted with this user lever!的错误,因为在服务端根本不存在这个属于admin级别的user,但是如果你是在本机上运行的话,可以先把MultiUser Server同一目录下的MultiUser.cfg文件中“# DefaultUserLevel = 20”的20改为80以上,并把#去掉存盘后再运行MultiUser Server,这样默认的登录者就是admin,这样就可以运行system.DBAdmin类型的命令了
通常服务端无非就是要保存用户、程序环境变量等信息,并且当用户发出查询请求是给以反馈,这在MultiUser Server上的体现就是创建用户,创建应用实例,对该应用实例添加属性,属性值,对用户的查询返回以及对保存在服务端的数据的清除。原程序里分别对上面所说的举出了例子
创建用户: errCode = gConnect.sendNetMessage("System.DBAdmin.CreateUser", "CreateUser", [#userID: whichUserID, #password: whichPass, #userlevel: whichLevel] )

第一个参数是创建用户的命令System.DBAdmin.CreateUser
第二个参数无所谓,除非在服务端有相应Subject的回调函数,否则它是被ignore的
第三个参数就跟的是对于命令System.DBAdmin.CreateUser()所需要的参数了
服务端的返回值被放置在变量errCode里,返回值的格式为
[#errorCode:theCode,#recipients:[userName],#senderID:”system.DBAdmin.createUser”,#subject:”anySubject”,#content:[#userID:”theUserAdded”],#timeStamp:theTime]
#errorCode:误代码
#recipients:返回消息接收对象的名字
#senderID:发送者名字
#subject:由程式开发者自定义的一个字符串,还记得前面说的setNetMessageHandler吗?这里的subject就跟前面的subject相互对应了,可以根据该字符串可以对不同的消息调用不同的回调函数
#content:服务器对于你的请求所返回的具体值了
#timeStamp:该操作所用时间
对于我们估计要注意的就是#errorCode的值如果不为0那就表示有错误,通过调用gConnect.getNetErrorString(errCode)可以得到错误值所代表的字符意思;以及content里面的内容了。

程序往下的处理方式都与上面创建用户的方法相同,就是往服务器端发送相应命令,并把返回值傅给一变量,通过对该变量进行处理,至于该返回值的格式我找到了一个MultiUser Server的帮助文件,放在http://go.163.com/zwjn/mu_server_2.1.pdf.zip,
感兴趣的自己去下把,我就不再写分析了
至此
:cool:

编辑历史:[这消息被东影默编辑过(编辑时间2001-06-25 23:13:55)]