[AS]基于豆瓣API的六度拓扑

6DTOP源代码版本1.0系列


欢迎各位朋友对六度拓扑的喜爱,六度拓扑应该算是我互联网实验中第一个称得上成熟的作品。
无论从构思,还是到创作的过程,直到最后的产品,我都是很满意的。
当然,最先要感谢还是豆瓣网能放出这个通过ID来查找朋友的API,没有这个API就没有这个作品。
那么大的一个网站,用自己服务器和带宽把API开放出来供大家使用,这种奉献的精神本身就很值得称道,所以,我觉得放出自己的源代码是很应该的事,而且,其中也一定会有很多的好处。
我在大学时代读过Linus Torvalds
自传<乐者为王>,我不敢奢谈自己的编程水平有多高,但我和Linus Torvalds一样,都对编程活动充满热情。对我而言,程序设计最大的乐趣就在于创作,这和歌手写歌,作家写文章从某种程度上是具有一致性,最终的作品是否能得到大家的认可,将是我最大的颀慰。
我喜欢李宗盛大哥的一句话:“一把琴,在它交在一个音乐人手中之前,基本上是个废物,它一定要落在一个做音乐的人手中,它才有了生命。”—–与所有喜欢创作的朋友共勉。
——————————————————————-
好,书归正传,让我们说说代码吧:
1.首先要说的是关于程序编译环境,程序是用flash cs3编译的,虽然里面有一此看上去和flex有关的文件,但那只是我用flex作为编辑器所产生的"副产品",我采用开发方式是flash作为编译器和界面设计工具,而flex作为代码编辑器。
flash cs3 下载地址
至于flash所采用的开发语言——ActionScript 3,如果你学过像JAVA,C++这样的OOP语言,从语法能很轻松的理解。
2.程序之核心
2.1
程序最重要的一个部分就是"轨道",参UIEntity.Orbit

轨道图示
从图中,可以看出,结点是被一个吸引到轨道上去的。
而轨道的吸引是分阶段,第一阶是RANDOM_ATTRACT,第二阶段是ARRANGE。
RANDOM_ATTRACT:由于在二度及以上的朋友中,无法在搜索完成某度的所有朋友前,获知其朋友的数目,因此,为了让头像可以尽可能的均匀排列,需要根据当前已搜索的某度朋友的数目来进行,这个阶段称为RANDOM_ATTRACT。
ARRANGE:这个阶段就很清楚了,某个朋友的某度朋友全部完成时,让其朋友尽可能的均匀排列。
轨道的实现用的是DFA(有限自动机),其实我这里的实现是很简单的,就是在一个可以被反复执行的函数,如foo中,加swith(status)这样的语句,GOT IT?
DFA是我在交互应用中非常喜欢用的东西,我对它喜欢的不得了,他真是个既简单,又有效的思想。
如果我说程序的核心就这点的话,肯定有人要扔蕃茄了,但事实就是这样,这个就是程序之核心,当然,实现这个核心的某些细节还是很值得讨论下的。
2.2Orbit吸引之实现
Orbit自己只负责完成吸引的动作,但由谁负责把结点push进某个orbit呢?这就需要由另一个自动机来做,参看DouBanFriendTopology类(主类)中的
enterFrameFun(evt:Event):void函数的实现
它的基本思想是这样的,将当前中心点的一度用户装入一个队列中,
然后,每隔50ms左右(出于性能考虑),从队列(参AS3STL.EQueue)Q的头部取出一个用户F->
     查看用户F的朋友是否已全部获取(由于豆瓣朋友的XML一次只能请求50个,所以当朋友大于50时,要多次请求)。
     YES
全部获取 : 把用户F用队列Q里取出,查看它的所有朋友结点。
         IF  
朋友结点i未被使用
              加入队列Q的尾部      
         ELSE
直接丢弃此结点,这里为了避免重复结点,
              如a-b是好友,b-c是好友,而c-a又是好友

        
     NO
未全部获取: 等待
这是一个很简单但很有效的算法,不是吗?
因为这里,只要不停止抓取,用户的朋友,朋友的朋友…是会一直获取(抓取的过程参
DouBanFriendTopology类中的ClawMainFun(event:TimerEvent):void)下去的,也就是说,队列是无限延伸(除非把N度朋友全抓完或到某度时所有人都没有朋友了),对于这样一种动态的数据的情况,本来是很麻烦的,但这里用一个"查看用户F的朋友是否已全部获取"就优雅的处理了这一情况,个人对此颇为满意。
3OK,关键的部分就先介绍到这里了,先讲讲程序的组织:
Douban_Fri_Topology.fla 程序主文件,编辑它即可观看6度拓扑。
DouBanFriendTopology.as 程序的主类。
OriginalGraph.fla       程序的原型图所在文件,用于先期设计。
about.swf              点 击About后播放的flash文件,里面用到了我最喜欢的美                       国选秀结目<学徒>的背景音 乐。(第一帧被设为暂停了,要通                        过程序控制播放)
——————————————————————

AS3STL                 
自写的AS3 STL包,目前仅有一个队列(以前有一个较全的
AS2STL,有stack,tree,graph啥的,过一阵改写)。
               
ComuEntity             
通讯实体类,用来请求XML,并返回相应结果,        
Fetch_Friend.as是用来获取朋友数据的。
而Fetch_People.as则是在搜索时用来获取个人信息(ID)的,主要用在如http://www.6dtop.com/search.asp?id=ahbei上。
EventCenter
CEventCenter, 这是一种形之有效的自写消息的机制,当你从一个“深处”,比方说obj1.obj2.obj3.xxx发出一个消息给obj100,通过这样一种直接管理 -派发的机制,有效的解决了这个问题,无论语言是否带什么dispatch之类的自定义消息机制,都可以用这种基于函数实现的消息来做。
CGData
用来存放一些全局数据,UserList是一个全局的异质(就是不会有重复的)用户列表。
Model
用来定义一些仅和数据相关的模型,如这里的UserModel.
UIEffect
效果包,DragEffectVM是我非常颀常的一个自写鼠标拖动管理类,他带来了非常高的便捷性和灵活性。
UIEntity
UI 实体包,其中的Orbit(轨道)和UserNode(用户结点)最为重要,而ToolBar中包括了ScaleToolBar(左侧形变工 具),Upline(上部工具),ButtomLine(下部工具),这里用到了在flash制作的一些元件,在FLEX里由于无法识别,会报错(由于没 有编译成.swc),不用理会,因为这里是用flash进行编译的。
Utils
实用类包,ArrayUtil,数组辅助方法。
WebService
WebService包,SWebService,包含了请求的地址等。
——————————————————————
about_swf文件夹,包含了about flash的源文件。
由于about.swf第一帧被设为了暂停,所以,可以使用loader.swf
——————————————————————
说了大半天,终于来点实惠的了,6DTOP 源码1.0版本,跟大家分享了
http://www.6dtop.com/open/v1.0/6dtop.source.1.0.rar

赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏