CSK.Blog--个人原创Weblog

FlashSite V2++

很久没有更新Blog了。或许让各位觉得我不再维护这个网站,其实不然。

虽然一直没有写Blog,不过我一直在对这个网站做修改,尤其是07年出发布的Flash Site V2。当时因为经历了近2年的开发周期,因此十分急切的想把这个网站发布出来。同时也因为那时想尽快抽出时间忙学习的事情,在开发的后期有点马虎。现在看来当时发布的版本存在许多问题与不足。这些问题随着发布后使用过程中慢慢暴露,直到我也觉得忍无可忍的地步。因此从去年开始我就开始一直计划着对这个网站(确切地说是网站的运行库ReformCore)进行大规模的改善。而本文就是对之前一段时间内我对这个网站所作的修改的总结。当然,那些一直希望了解该网站实现细节或者想得到源代码的朋友也可以关注此文,因为我现在开始计划把ReformCore的部分组件开放:OpenReformCore。

直观起见,先给个目前网站的截图:

网站截图

图:改善后的SiteV2

这次修改后的版本暂称为Site V2++。主要增加了网站整体的执行效率,同时改善了浏览体验。对ReformCore的一些Bug做了修正。本文后续部分将针对部分修改部分介绍。文末将介绍这次增加的一个插件ReformUI Spy以及OpenReformCore的一些设想。

网站部分的改善

07年网站发布时,有不少批评针对当时网站背景声音过于嘈杂,同时也反映动画表现不流畅的。同时当时时间比较紧张,没有对一些细节部分处理好,比如菜单部分那些图标一直在使用着这个网站原形期间临时选取的那些图片。也有人批评说网站过于眩目。

目前改善的版本已经重新设计了首页和菜单的图标部分。同时也更换了背景图片以及背景音效。至少目前在我看来,应该不会给浏览者带来嘈杂感了,同时网站风格上也比较统一。至于批评说网站眩目花哨的,不好意思,目前看来仍旧很花哨。不过我已经将一些不必要的成分去除了,比如整个网站只有一张背景图以及一套背景音乐。

这次新采用的背景音乐已经不是之前很俗套的循环音效,循环的音效无论如何都会给人带来烦躁感。至于新背景音乐的效果还是各位亲感受下吧。网站在设计上从起初就以到背景、音乐等修饰手段不得干扰正常浏览为原则。所以音乐和背景图片与网站的浏览是不同步的,换句话说,在网速缓慢的情况下,访客可以先进行网站内容的浏览,而背景图片和音乐会在后台加载完毕后才得以呈现。因此如果想体验新的音效的话可能需要等待一段时间。

对于网站的执行效率问题,其实就是针对Flash渲染效率的优化问题,这次也有很大的改善。至少目前在我看来比以前整个网站渲染速度提升了30%-40%。同时,以前进入网站是要经历的2次“嘟嘟”声的阶段也被合并在一起。

对于用户体验的提升方面,这次的修改还增加了网站高度会随浏览内容自动修正以及网站浏览的资料将与URL地址同步等功能。URL地址同步其实就是BackButton,具体效果可以尝试如下链接:http://www.csksoft.net/index_mainsite.asp#SubView%3D4%26SubSection%3Dlab%26ViewPos%3D1%26ViewType%3D2%26UID%3Dmainsite.site_data.ID75

其次是修正了网站对Webkit(如Chrome)以及Opera浏览器的兼容性。不过代价是在这2类浏览器下网站将无法使用Backbutton。

剩下的修改部分还有许多,不过基本都是一些小改动。这里还要提一下现在的ReformScript终端窗口可以改变大小了!同时支持脚本导出功能。这点将在后面的ReformCore改善部分介绍。

ReformCore的改善

ReformCore中主要对UI组件进行了大幅修改,其中主要针对XWindow部分,即类似ReformScript终端的这些窗口。

  1. 增加了Resize功能
  2. 改善了窗口层次的管理,增加了窗口聚焦的特征。

还有一些其它的UI修改,这里就不具体介绍了。如果今后ReformCore开源了,这些部分也会包含。

图:增加了动态尺寸改变特性的XWindow,以及其他的UI改动

图:修正了层级管理以及增加了窗口焦点特性

图中可以看出XWindow已经越来越像是个OS的UI了。不过毕竟有点重新发明轮子的味道,但是Flash下还真的没有啥捷径。

另外,对ReformCore的后台代码修改也展了很大的部分,不过这部分因为难以用直观的图像形式表达,就不再具体涉及。不过可以提一下开发的用于Puxos管理的Puxos Explorer。

图:Puxos Explorer

Puxos Explorer属于网站的后台管理部分,同时我目前还没有找到其他人会对此工具感兴趣的理由,因此这个工具就不公开了。Puxos因为采用了XML来保存数据,本身自然就是以树状存储的。所以可以套用文件系统的概念,自然要做UI的管理器的话,就会做成Windows Explorer那样。当然,我做的很简单...

ReformUI Spy

这次更新过程中顺便做了一个有用的小工具,ReformUI Spy。这个工具可以在网站的“创意与演示”板块找到。至于其用处,估计用过Microsoft Visual Studio中自带的Spy++的朋友应该可以猜到:用它可以察看当前Flash中任何MovieClip的信息!这个工具并非只能用于我的网站,任何AS2.0的Flash只要能够加载进此工具都可以工作。

 

 图:用ReformUI Spy 观察ReformScript窗口中TxtHolder组件的属性

 

图:鼠标拖动观察游标进行组件选取时的画面

不过因为Flash采用了sandbox的机制,不同域名下swf不能进行脚本级交互。所以想用这个工具做偷窥是不可能的了,不过用于自己作品的辅助调试应该还是大有帮助。另外,要偷窥我网站还是可以的:-)。

另一个好消息是这个工具是开源的,所以实现原理我就不说了,大家看代码。当然我相信肯定有Flash的高手已经知道这点用处。同时,为了将来开放ReformCore的考虑,这个工具的代码也可以作为ReformUI API使用的具体例子。

试用请点击:http://www.csksoft.net/index_mainsite.asp#SubView%3D4%26SubSection%3Dlab%26ViewPos%3D1%26ViewType%3D2%26UID%3Dmainsite.site_data.ID75

代码下载:http://www.csksoft.net/data/fla/reformSpy.rar

OpenReformCore

已经有不少朋友希望我公布网站全部或者部分的代码了。我也觉得有时候还是全部公布代码了比较好。毕竟如果能被其它人使用才是我工作价值的最好体现。不过考虑的下面的几个问题,我一直没有这么做:

  1. 网站自身安全性
  2. 坐享其成的使用或者盗用
  3. 本身的质量问题

对于网站自身安全性考虑应该比较好理解,尤其是后台部分。因为ReformCore还用来管理我个人信息,如果公布了代码可能会造成自身的安全隐患。我承认ReformCore安全性不好。同时,如果只公布前台,可能有些地方的代码就不好理解了。

对于第二个考虑,我想我有时也做的不好。毕竟国内盗版软件大家天天用、平时抄作业、专门有网站公布各类代码给大家直接拿去用于各类用途。大家似乎觉得这些已经没有什么了。我不介意有人用这个网站的代码拿去赚钱。如果真那样,那真是我最大的荣幸。不过我看不惯那种坐享其成式的挪用和盗用。挪用:直接将网站原封不动的用于自己作品,或者仅仅改动文字和图片。盗用:声称是自己的。说起盗用,我还记得有人真的拿我之前做的高手挑战说是自己做的。不过也说明有人认可这个...可能是我心胸狭窄吧,不过我想我们平时习以为常的这些举动真的应该吗?

好了,现在说说OpenReformCore。上面已经说明了我的态度,所以今后要公布代码,一个原则就是公布出去的代码不可能直接编译后就运行。同时后台部分可能会不公布。不过这个主要是我觉的不好意思拿出手。现在外面都采用ASP.net了,我这代码还是ASP 3.0。而根据大部分人的反应,我想他们最感兴趣的应该是ReformUI部分。因此这部分代码会最早的公布。不过既然要公布,也不是说随便打包给出链接那样简单。那样不但对别人不负责,也是对自己不负责。所以还需要作一些额外的事:写注释、例子、帮助。当然,还有版权申明(应该说是分发许可申明)。至于时间安排上,我想说得是尽量。

 

好了,我认为已经把这次改动部分值得介绍的部分写完了。总体来说,这次改动的着重点就是使得Site V2能够搞好的派上用处:发布和展示我作品的平台。希望这次改动能给浏览者带来较好的体验。同时,我又一次注意到自己不但不是学设计出生,也没有这方面天赋。既然ReformCore本质不是Site V2这个Flash网站,那么希望这次修改也能使我停止长达2年+这2个月的Flash制作中。希望今后不要再被人理解成我是专作Flash的了...

这次网站的改善也让我重新对我这个网站(www.csksoft.net)的用途有了新的理解。今后Site V2的主要职责对外将用于我作品的发布和展示,同时借助其RIA的特性,一些新的想法、需要多媒体借助的部分也将使用Site V2。而Blog将发布平时写的一些文章。包括会在各类不大不小论坛灌水的长篇大论或者平时的胡思乱想。有人觉得这2年Blog文章更新满了是啥啥的表现,其实这是不正常的。不过的确不能像以前想说什么说什么了...

闲着无事,添加了些ReformScript的例子

最近情绪低落,一直做不进事情。

所以就修改了下flash网站,主要是增加ReformScript对于事件处理的可能性。效果可以看flash网站的站点日志。

然后用ReformScript写了一个目前还十分十分简单的函数绘图器,同时也作为一个ReformScript例子,具体代码见flash网站试验区。

这个东西很早就酝酿着要做,网站发布时时间很紧,就没写。现在也太晚了,先放出来,大家有兴趣也可以改改完善下。

这个东西强调概念性,效率问题就不要提了,速度肯定是慢的。看下图吧~当然相信你有兴趣会直接进网站看

 

点下面进入Flash站并转到该内容:

http://www.csksoft.net/index_mainsite.asp#SubView%3D3%26SubSection%3Dlab.script%26ViewPos%3D1%26ViewType%3D2

Yes,It Released!

经过了将近2年的漫长开发,前前后后复工数次,经过一次大规模修改,期间遇到各类事物阻拦。但是,她终究诞生了!

Flash Site V2,与今天正式发布,开始她的职能。

虽然其中还有不少细节要完善,但目前已经满足发布的所有要求。这里先放上截图和一些说明,当然直接去体验下是最好的了。ReformScript的帮助也有了!

很晚了,先通个风,明天具体介绍网站的构架方面信息。

点击www.csksoft.net 访问

加载画面

首页面,实际画面,1440*900,点击看全图

分版面,实际画面,1440*900,点击看全图

各类工具窗口,实际画面,1440*900,点击看全图

幻灯片察看,实际画面,1440*900,点击看全图

管理后台,实际画面,1440*900,点击看全图

6天,一年零四个月,写在发布之前

预计离第二个Flash网站发布还剩下:6天

从该版本网站即后台的支撑系统ReformCore概念提出开始编写至今:一年又4个月(2005.7开工)

网站flash文件以及后台的ReformCore提供的API及各类method:近2000个

随着puXos和本地puXos缓存系统的完成,终于可以进行比较实际的网站开发了。

这个项目自从其开始起步到现在并没有一凡丰顺过。前前后后几乎4次因为学习或工作生活等方面原因停工又复工(可以参见以往的一些文章)。因此一直拖延至今才终于有了明确的完成期限。

在这段时间里面,这个项目一直成为我的一个心病,虽然有过想放弃开发的念头,不过还是坚持下来了...

严格的说,这1年多时间并不是花在做一个flash网站上面,因为按照目前编写的代码量来算,将来这个flash site V2真正展现在浏览者面前以及后台默默执行的部分估计只有30-40%。

主要原因是我从一开始就提过自己在做的是reformCore。他不是一个网站,而是一个属于我自己的平台系统。

目前包括的组件有:

服务端:

基本的安全函数,包括登陆验证,令牌管理,权限管理,反注入检测

基本的运行支持函数,如对各类底层对象的封装类,加密算法,邮件投递函数,动态插件库

环境监测函数,包括ip段识别,客户端授权认证

通讯组件,ReformPost RPC系统,puXos的reformPost前端

数据服务,puXos系统,用于puXos树形结构的uid管理器,以及各自的缓存系统

flash客户端:

ReformUI界面系统,组件包括:

XWindow,UIHost,TxtHolder,ScrollBar,progressBar,FlatButton,dragbar,LinkBtn,

PicSlider,TextTab,BlockView,ListView,tooltip,MessengBox

基本上是实现了一个windows的窗口环境,不过只是存在于flash中而已

ReformCore的客户终端

包括reformPost的事务化抽象管理器,本地令牌管理,puXos客户端以及数据缓存

本地Flash环境监测函数,包括浏览器历史监测,本地数据连接

Flash插件管理器及本地逻辑服务管理

音效管理

ReformScript解析器

基于ReformUI的网站组件,包括:BlockSys,MenuSys,LayoutMgr,ListView,BlockView,FlatView,ViewMgr

目前还在编写的部分是:Flash网站的版面插件以及音效管理器。

以前预计进度的时候是以每完成一个组件为1-2 %计算的

可能有人会问花了那么大力气作这个东西可能没有意义,这样说也对,毕竟这个网站做好了也不可能是盈利的,将来也只是作为我的个人网站,的确有点自娱自乐的目的。

我也曾经质问过自己,不过现在有一点是明确:经历了这个过程,也算是一种修行吧。毕竟那些组建是具有无限的扩充可能的,也为我积累了丰富的代码库。

好了,就当是我自言自语,毕竟这是我一个人做过的最大的项目了,经历了那么久,现在觉得很激动。

祈求上帝能让我安心的度过那最后一周的开发时间,了却这桩心事~

网站发布后我会编写一本函数参考手册,毕竟网站也是个编译器,呵呵,你可以在网站中修改或者增加些功能来

最后附上目前的一张截图:

(我将来的打算开发网站所有源文件,在必要的时刻,不过我不想看到自己的东西非法的遭受侵权)

Click To View Org Size

最近ReformCore的进展:PUXOS

曾经反思过为什么一个简单的新网站要花1年多的时间?可能是当初概念提的太泛了。如果仅仅是要实现预想的“网站”的要求,恐怕一周就能完成。

之所以现在一直称得东西叫做ReformCore。是因为我希望这将来是一个基础的核心系统,也就是说今后可以基于他做应用,特别是AI方面的。网站也只是一个应用,所以1年多的时间很大部分都是花在做这个Core上面了。

不论大家是不是有兴趣听,我就说下目前这个Core的一些部件。至少今后我就靠它了。

 

ReformCore.PUXOS

PUXOS是希腊语,box的意思,当然我选择这样的名字一方面是因为pu前缀可以看成"put","os"后缀提示是一个系统。当然这样的理由...

另一方面是他的存储模式很像一个个盒子...

这是在做ReformCore早期就想到的一个东西,不过也是最泛的一个东西,它类似一个简单的数据库管理系统,或者说是文件管理系统。

他由目录层次管理、数据记录管理、数据类型自适应及存储几个功能组成。当初设计的理念是由他完全管理网站及其他应用产生的数据的存放和具体格式,高级应用无需关心这个文件是存储在web服务器还是其他地方,以及具体的路径。数据完全按照该有的逻辑方式分布。而且具体的格式由puxos自己决定

比如:

今后得主flash网站在第一次加载时需要向服务器请求网站的配置信息,这个信息的具体格式和url flash无需知道。他只需用ReformPost的GetUIDContent RPC

请求mainsite.siteconfig这个UID即可获取想要的信息。同样也可以往puxos里面保存新信息,具体的格式和存储位置由系统自行决定。

当然这个系统的最终应用我希望是AI方面,反正目前只是一个个人试验的东西,所以也没考虑太多

就说这么多了,编译考好了,继续做网站,好完成一桩心愿。当然我已不在乎这个网站自身的意义了

Timeline

有很多事情要交待~

首先是推荐老弟的新作:Angel Fall (Original Mix)。本Blog的周二进站音乐便是这首。不错的

明天就要真正意义上结束这个暑假开学了,其实对我来说只是休息了1周又重新上课...CS本学期在8.5号就开学了...回想一周前还是满脑子飞的EZ-UML、答辩、头脑秀逗得老师、GeneralLinkableXXXXX(为了保护小组各成员不至于再度发疯,部分字符已用XXX表示),这学期真的算不了什么。

下面是我最想说的

Flash Website v2

项目开工:2005.7.10

起因:我对我自己Flash网站v1的强烈不满

过程:想出了个ReformCore概念,设计了新的logo,弄来了嵌入式编译器

目的:制作更漂亮、更人性化、更加符合我审美的新Flash网站(后期加上的目标:符合web2.1)

结果:由于当时暑假考驾照,网站把ReformUI的雏形完毕即告流产

复工:2006.1.x

原因:放寒假了,没事可做

过程:完善ReformUI

结果:由于每天要赶早去徐汇上GRE,同时PRP项目在身,项目搁浅

复工x2:2006.7

原因:实在看不下这个难产的项目了+原先的设计不符合当前审美

过程:重新设计界面+开始写主要构架

结果:主要构架完成,但明天要开学了...

项目截至今天已经超过一年的建设时间了...天哪~

为了逼自己去完成这个项目,现把一些内部代码资料公布...

我不做解释,大家看情况理解吧~

mainsite.obj_main.AddBlock("test");

CreateWindow("GraphWin",40,50,true,Script_win);
GraphWin.SetClientSize(300,300);
GraphWin.SetWindowText("DoModal测试");

CreateUIHost(this,"obj",33);
obj.SetHostSize(1440,1000);
obj.StretchPic(false);
obj.CompleteLook(false);
obj.ShowBorder(false);
obj.LoadObject("http://www.csksoft.net/data/dawnofReform.jpg");

CreateWindow("OldSiteWin");
OldSiteWin.SetWindowText("以前的Flash网站-CSKSOFT WEBSITE v1 All right reserved");
OldSiteWin.SetWindowSize(753,580);
OldSiteWin.Attach("/fla/main.swf",true);


CreateWindow("win2");
win2.SetWindowText("PicWindow");
win2.SetWindowSize(500,350);
win2.Attach("http://www.csksoft.net/data/dawnofReform.jpg",true);
win2.container.objhost.SetLinkURL("http://www.csksoft.net/data/dawnofReform.jpg");

CreateWindow("rwin");
rwin.SetWindowText("外部组件调用");
rwin.SetClientSize(250,150);
rwin.Attach("fla/load_test.swf",true);

CreateUIHost(this,"obj",33);
obj.SetHostSize(250,150);
obj.LoadObject("fla/load_tedst.swf");

i=100;
t = setInterval(script, 10,
 "if (i<=0) {clearInterval(t); t = undefined;}msgout(i);i--;",
 this);

dwColor =  0x1a67f4;
CreateWindow("GraphWin",50,50);
GraphWin.SetClientSize(50,50);
GraphWin.container.beginFill(dwColor,0xFF);
GraphWin.container.moveTo(10, 10);
GraphWin.container.lineTo(10, 40);
GraphWin.container.lineTo(40, 40);
GraphWin.container.lineTo(40, 10);
GraphWin.container.lineTo(10, 10);
GraphWin.container.endFill();

CreateWindow("GraphWin",40,50);
GraphWin.SetClientSize(300,300);
GraphWin.SetWindowText("绘图窗口");


GraphWin.container.createEmptyMovieClip("graph",2);
with (GraphWin.container.graph) {
    lineStyle (0, 0xFF0000, 100);
    for (x = -5; x<5; x+=0.2) {
         y= Math.sin(x)*30;
         if (x==-5)
         {
           moveTo(x*30+150,150-y);
         }
         else
         {
           lineTo (x*30+150,150-y);
         }
    }
}

 

t = setInterval(script, 500,
 "today_date = new Date();msgcls();msgout(today_date.toString());",
 this);

CreateTween(Script_win,"_x","elastic.easein",10,400,50,100);

var sXML;

sXML=XML_CreateRPCRequest("GetBlogConfig",Array("bIsMiniMode","strToken"),Array("false",GLOBAL_strTokenID));

sXML.send("/sitecmd.asp","_blank");


var myObj;
myObj = new Object();
myObj.item1 = "aaa";
myObj.attributes=new Object();
myObj.attributes.id=3;
myObj.value = "ddd";
myObj.node = new Object();
myObj.node.value="ccc";
var myxml;
myxml = new XML("");
ConstructXmlSubTree(myxml,"ss",myObj,myxml);
msgout(myxml);

//XWindow   //ReformUI.XWindow
  SetWindowSize(nWidth:Number, nHeight:Number);
  SetClientSize(nWidth:Number, nHeight:Number);
  SetWindowText(sTitle:String);
  GetWindowText():String;
  SetWindowFocus();
  GetListID():Number;
  Attach(strObjID:String, bIsFromURL:Boolean):Boolean;
  OnClose(); //CallBack
  Destroy():Boolean; //return false if refused by OnClose();
  ExpendWindow(bExpend:Boolean);
  GetWindowState(nStateID:Number);  
        //nStateID=1 :IsTransAble
 //nStateID=0 :IsExpend
  AlphaBlendWindow(bAlpha:Boolean);
  //---------------------------------------------------members
    TitleBar //ReformUI.XWindow.TilteBar
    container //ReformUI.XWindow.Container
                 var bIsObjFromURL:Boolean;
                 var bIsContained:Boolean;
                 generalObj,objhost
                 SetObj(strObjID:String,bIsFromURL:Boolean):Boolean
                 DestroyAll();
                
    BottomBarA //ReformUI.XWindow.BottomBar
    var nWindowID:Number;
    var strHostID:String;
    var nWindowHeight:Number;
    var nWindowWidth:Number;
    var bIsWindowExpend:Boolean;
    var fInterval;
  //----------------------------------------------------ReleatedAPI
    GetTopLevelWindowID():Number;
    GetWindowTopLevel():Number;
    CloseAllWindow();
    CreateWindow(strWindowID:String, nX:Number, nY:Number , bIsDoModal:Boolean , objParent);
    XWindowList:Array;
    var nXWinBoundWidth:Number,nXWinBoundHeight:Number;
    GetXWinBoundBox():Array;
    SetXWinBoundBox(nWidth:Number,nHeight:Number);

//UIHost    //RefromUI.UIhost
   LoadObject(sURL:String,bIsRes:Boolean);
   IsObjLoaded():Boolean;
   LoadPrecent():Number;
   GetObjSize():Number;
   StretchPic(bIsStretch:Boolean);
   GetObjVersion():Number;
   CustomFunction(FuncName:String, Arg1, Arg2);  //var CustomResult
   SetHostSize(nWidth:Number, nHeight:Number);
   SetHostIDTitle(strTitle:String);
   SetLinkURL(sURL:String);
   ShowBorder(bIsShow:Boolean);
   ShowDataInfo(bIsShow:Boolean);
   CompleteLook(bIsShow:Boolean);
   EnableClick(bEnable:Boolean);
   Destroy();
  //Events
   OnClick(); return false when cancel
   OnLoadComplete();
  //---------------------------------------------------members
    var HostWidth:Number, HostHeight:Number;
    var IsContendObj:Boolean;
    var ObjURL:String;
    var HostIDName:String;
    var ObjVersion:Number;
    var LinkURL:String;
    var IsShowBorder:Boolean;
    var bIsSretchPic:Boolean;
    var CustomArg1, CustomArg2, CustomResult;
    objcontainer
  //----------------------------------------------------ReleatedAPI
    CreateUIHost(strParentID:String, strHostID:String, nLevel:Number, nX:Number, nY:Number)

//TxtHolder     //ReformUI.TxtHolder
   SetSize(nWidth:Number, nHeight:Number);
   GetSize():Array;
   EnableScrollBar(bEnabled:Boolean);
   EnableEditable(bEnabled:Boolean);
   UpdateLayout();
   EnableWordWrap(bEnabled:Boolean);
/////////////////////////////////
//Not complete yet!
   LoadTxt(strURL:String, bIsHtml:Boolean, nPostMethod:Number);
//////////////////////////////////
   SetText(strT:String, bIsHtml:Boolean);
   GetText(bNeedSrc:Boolean):String;
   UpdateScrollBar();
   ClearText();
   Destroy();
  //---------------------------------------------------members
     var nSelfHeight:Number, nSelfWidth:Number;
     var bIsEnableScrollBar:Boolean;
     var bIsEnableWordwrap:Boolean;
     hbar,scrollbar;
  //----------------------------------------------------ReleatedAPI
     CreateTxtHolder(strParentID:String, strHolderID:String, nLevel:Number, nX:Number, nY:Number);

//ScrollBar   //ReformUI.ScrollBar
   UpdateBar();
   SetStepLength(nStep:Number);
   GetStepLength():Number;
   SetBarLength(nHeight:Number);  //def=100;
   GetBarLength():Number;
   SetRange(nMaxPos:Number); //startup with 100
   GetRange():Number;
   OnPosChange(nPos); //CallBack,return false for undo
   SetPos(nPos:Number);
   GetPos():Number;
   Destroy();
  //---------------------------------------------------members
     var nCurrentPos:Number;
     var nStepLength:Number;
     var nMax:Number;
     var nSelfHeight:Number, nDragLength:Number;
     var fInterval;
     var bIsStartDrag:Boolean;
  //----------------------------------------------------ReleatedAPI
    CreateScrollBar(strParentID:String, strBarID:String, nLevel:Number, nX:Number, nY:Number);

//progressBar    //ReformUI.progressBar
   SetPos(Pos:Number);
   GetPos():Number;
   Destroy();
  //---------------------------------------------------members
     var nPos:Number = 0;
  //----------------------------------------------------ReleatedAPI
     CreateProgressBar(strParentID:String, strBarID:String, nLevel:Number, nX:Number, nY:Number);

//LoadUI.MainLogo  //reformUI.LoadUI.MainLogo
   OnCancel=function() //CallBack
   OnRetry=function() //CallBack
   SetLoadCnt(ObjCnt);
   SetTitle(StrTxt:String);
   ShowCancelBtn(bShow:Boolean);
   SetFailedFlag(bShow:Boolean);
   Destroy();
  //-----------------------------------------------------ReleatedAPI
      CreateLoadUI(strParentID:String, strLogoID:String, nLevel:Number, nX:Number, nY:Number,nType:Number);
          //nType:0 for MainLogo

FlatButton   //ReformUI.Button
   SetLabel(strNewLabel:String):String;
   GetLabel():String;
   SetBtnSize(nWidth:Number, nHeight:Number);
   Destroy();
   EnableBtn(bEnable:Boolean):Boolean;
   SetLabelColor(newColor:Color);
   //Event
   OnRollOver;OnRollOut;OnMouseDown;OnMouseUp;OnClick
  //-----------------------------------------------------ReleatedAPI
      CreateButton(strParentID:String, strBtnID:String, nLevel:Number, nX:Number, nY:Number);
dragbar //ReformUI.dragbar
   SetWidth(nWidth:Number):Number;
   UpdateUI();
   SetPos(Pos:Number):Number;
   GetPos():Number;
   SetRange(nMin:Number,nMax:Number):Boolean;
   GetMin():Number;
   GetMax():Number;
   //----var
   Width:Number;
   nPos,nMin,nMax:Number;
   //----events
   UpdateUI,onChange,onDrag(x,total) //use addListener
  //-----------------------------------------------------ReleatedAPI
 CreateDragBar(strParentID:String, strID:String, nLevel:Number, nX:Number, nY:Number);

/*
url tip define:
 SubView=3&subdir...&UUID=

*/

//SiteObjs
obj:mainsite
 addProxyAlignObj(objRef:Object, strAlignType:String):Boolean //strAlignType "l","r","m"
 RemoveProxyAlignObj(objRef:Object):Boolean
 SetWidth(nWidth:Number):Number
 ParseUrlCmd(strCmd:String):Boolean
  events:
 broadcast:OnWidthChg(x:int);

obj:mainsite.obj_main
 SetBlockWidth(size:Number):Boolean
 GetBlockSize(strName:String, nID:Number):MovieClip
 RemoveBlockByID(nID:Number):Boolean
 RemoveBlock(objBlock:Object):Boolean
 OnItemSizeChg(objBlock:Object)
 GetBlockID(objBlock:Object):Number
 Display(strCmd:String):Boolean //cmd:show;hide;distroy
  events:
 broadcast:OnHolderSizeChg(size:int);

 


//End of SiteObjs
var GLOBAL_nDownloadingSpeed:Number; //kb per sec
var GLOBAL_strMainSwfURL:String;
var GLOBAL_strTokenID:String;
//BAISC
     parseBoolean(string:String) :Boolean
//API
   //Site Config Var:
     var strSiteInfo_Title:String, strSiteInfo_Version:String, strSiteInfo_LastUpdate:Date;
     var bSiteConfig_UI_EnableShadow:Boolean;
     var nSiteConfig_ScriptWinX:Number, nSiteConfig_ScriptWinY:Number, strSiteConfig_ScriptWinCnt:String,bSiteConfig_ScriptWinShow:Boolean;
     var bSiteConfig_SndEnabled:Boolean, strSiteConfig_SndSrc:String;
     var strSiteConfig_ExecScript:String;
     var nSiteCnt_DefView:Number;
     var nSiteCnt_ViewNum:Number;
     var lstSiteView_ImgURL:Array;
     var lstSiteView_ConfigURL:Array;
     var lstSiteView_IsExpend:Array;
     var lstSiteView_Title:Array;
     var lstSiteView_TitleEn:Array;
     var lstSiteView_Description:Array;
     var lstSiteLink_LnkIcon:Array;
     var lstSiteLink_LnkDest:Array;
     var lstSiteLink_LnkType:Array;
     var lstSiteLink_LnkTitle:Array;
   //
   _split(str);
   GetRandomToken:String
   CreateTween(objDestObj:Object,strEffectProperty:String,strTweenType:String,StartVal,EndVal,nDuration:Number,nFPS:Number);
   GetMajorFlaVer();
   GetQueryString(strURL:String,strStringName:String):String;
   GetSiteInfo(strInfoType:String);
 //SiteWidth;SiteHeight;SiteTitle;SiteVersion;DefSrciptTxt;LastUpdate;UI_EnableShadow
 //ScriptWinIniPosX;ScriptWinIniPosY;ShowScriptWinAuto;Snd_EnableAuto;Snd_SrcURL;
 //AutoExecScript;DefViewID;SiteViewTotal;lstViewIconURL;lstViewConfigURL;lstViewExpend;
 //lstViewTitle;lstViewTitleEn;lstViewDescription;lstSiteLnkIcon;lstSiteLnkDest;lstSiteLnkType
 //lstSiteLnkTitle
   ReadSiteConfig(ConfigXML:XML);
   CreateXMLPost(PostType:String);
   VerifyCmdResponse(SrcXml:XML);
   XML_CreateDataRequest(strDataName:String, lstInfoArg:String):XML
   SolveRPCResponseXML(xmlRawDest:XML):Object
   SolveRPCResponse(xmlRawDest:XML):Object
   XML_CreateRPCRequest2(strRPCName:String, objArgList:Object):XML
   XML_CreateRPCRequest(strRPCName:String, lstArgNameLst:Array, lstArgValLst:Array):XML
   CreateXMLPost2(PostType:String):XML
   CreateScriptWindow();
   msgout(strMsg:String);
   msgcls();
   ShowScriptWindow(bShow:Boolean);
   SetScriptTxt(strScriptTxt:String);
   XOR_Encode(strSrc:String,strPWD:String):String;
   IsScriptWindowVisible();
   CallRPC(strRPCName:String, objArg:Object, funcOnResponse:Function):Boolean;
   UpdateBrowseState(strBrowStr:String);
  
   objBrowseState.strAction
   objBrowseState.addListener
 @Event.OnBrowCmd

//Component
  ScriptWindow_core     //mov_main.ScriptWindow.Cont
-------------------------------
      SetScriptBuf(strNewVal:String)
      ClsTxt(nClsType:Number)
               // -2 clear current
               // -1 clear all
               //0 \ 1
      PostPrint(strPrintStr:String);
      SetEditorVal(strNewVal:String);
      GetEditorVal():String;
      GetBufVal(nBufType:Number):String;
      SetPostBuf(strNewVal:String);
      UpdateBuf(nBufType:Number, bSetBuf:Boolean);
      Execute(strScriptStr:String);
      SetView(nState:Number);

以上只是一些函数的原形定义,我不是要开源的,不过只要你足够敏锐,这些信息就够你做很多有趣的事了~

请不要用于非法用途和任何我不愿看到的行为


 

对Flash网站做了些更新

虽然最近十分忙,因为赶项目进度嘛 不过今天还是抽空把Flash网站更新了下,这是自上次发布Demo版的V2版Flash站以来最大的改动。首先从直观上能看到的是加入了进站音乐,当然我不希望和blog一样,所以是短短的一段intro罢了。不过旋律是我比较喜欢的那种,来自dj_feel_-_live_in_trancemission中第一首:Ilyia Maluev - Welcome To Heaven(嘿嘿,是俄罗斯的DJ做的)。 同时直观的改动估计就只是其衬托背景图片作了些修改,其他就是没那么起眼但十分重要的代码级和构架级的修改。 首先是增加进我曾发表的自动XML分析器组件作为ReformPost的处理函数内核,修正了一些bug,同时最大的变化就是增加了BackButton支持。 也只能说自己孤陋寡闻了,以前我曾提过用在页面后加上#cmd=ddd之类的后缀作为ajax页面对于无法有url定位资源的一种补充。其实对于flash网站,这个技术是由专门名词的,就叫做BackButton。不过思路和我不略有不同: 我的出发点是用URL来定位资源,比如我浏览flash里面的某一个内容,别人只要知道了我现在带有#后缀的url也能获得基本上和我一致的flash页面的状态:比如某个按钮已经按下,显示和加载了其他的movieClip。 而BackButton的出发点是flash里面点了某个连接后,使得内容发生变化,但和html不同,它不会刷新页面,自然无法用后退按钮来回到前一状态,用这个BackButton就能解决这个问题,当然他也解决了我要处理的问题。 所以干脆就把2者都结合起来使用。我现在也感觉到推迟网站发布也有一定好处,就像M$推迟Vista,这样随着理念的成熟,可以不断地把新技术融入到我的网站,以便精益求精。 呵呵,好了,就写这么多,不过我不希望看到私自反编译我网站的现象出现,虽然我无法知道,但至少不能公布于众……

已实现CSK.blog与MSN Space同步更新

呵呵,这里要庆祝一下了。 其实很早就有这个想法,MSN space是目前比较红的,而且可以很方便的将自己space的更新提示给其他朋友。这点是非常不错的。但问题就是他不自由,而且我也有了自己的blog。所以以前就像能够让ReformCore自己去同步我的space就好了,否则也浪费他了 呵呵,现在搞定了,多亏space有个邮件添加日志的功能,但也有一定问题:我用Jmail组件发信总是乱码!只好用MS的CDO(难道又是阴谋?) 呵呵,不管了,今后写好的日志也能在msn space上同步了,就是只能发送过去略文,但问题也不大。 顺便说下我的space(你应该不为去哪吧,呵呵):http://spaces.msn.com/greatcsk/

用令牌信息来验证Flash提交信息的合法性

(详情请点击文章标题) 今天GRE学好回来的比较早,那就说一下昨天提到的问题: 搞过动态网页脚本比如ASP的朋友都知道,有一个HTTP_REFER的系统变量可以获得本次请求是又那个页面提交的。换句话说,可以用这个东西来知道用户是通过那个页面或其他网站上页面的连入本网站的。 ..... 那Flash和HTTP_REFER有什么关系呢?这里就不是单纯的盗链问题。我认为一般下面几种情况是需要判断HTTP_REFER的。 比如我在网站上写了一个Flash游戏,游戏结束后允许玩家上传自己的姓名和得分。这就会出现安全问题: 做过Flash交互的人都知道,Flash和后台网页脚本的交互手段目前一般是用MovieClip.LoadVarible();和XML.sendAndLoad()方法。这没什么问题,但服务器是不会判断提交数据的真实性的,只要我协议和语法格式一致,任何人在任何地方都能提交一个伪造的“得分”到服务器。而如果那个游戏时对高分进行奖励的,那损失可不小。 那么是不是也能用HTTP_REFER来解决呢?理论上似乎可以,但试过人会发现,那该死的FlashPlayer是不会发送Refer数据的(可能为了安全性)。这样HTTP_REFER就完全失效了。 ...... 但现在Flash完全是透明的东西。外面各种反编译软件可以很轻松的把swf高保真的还原到fla格式。这个密码也自然形同虚设……而且上面的登陆办法也有问题:如果玩家本人提交伪造数据呢? ..... 呵呵,想起来了吗?Flash8开始有了个新特性,可以利用ExternalInterface类随意访问外部JavaScript函数,也可以从外部JavaScript调用Flash中的用户函数。 ..... 首先调用外面的GetToken函数,然后GetToken调用了flash中注册的OnGetToken,并把Token作为参数传递回来。
分页:[«]1[2][»]

日历

<< 2015-6 >>

Sun

Mon

Tue

Wed

Thu

Fri

Sat

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

Copyright Shikai Chen 2000-2012. Powered By Z-Blog(CSK Modified)