DelphiSwfSdk近一年没更新,作者消失无踪,留下bug一堆。最近在完善DelphiSwfSdk的过程中,对swf文件格式有了系统的了解,同时就自己比较感兴趣的as加密,也进行了一下研究。研究发现,as1,as2时代的加密,其实大部分都只能称之为“混淆”,利用混淆达到迷惑反编译器甚至卡死反编译器的目的。
就其原理,本质上只在于 反编译器 与 播放器 在处理swf文件时的细节上的差异。详述如下:
1. swf反编译器在反编译过程中,是按照swf的文件规范,将swf依次拆分为很多tag,然后如果tag中含有脚本,例如doaction或doinitaction等tag,则对这个tag中的bytecode,按照最紧凑原则进行依次读取解析,直至解析完整个swf文件。
阅读全文…
swf文件格式是基于tag的,每个tag之间独立,只有引用与被引用的关系。软件在处理swf文件时,遇见不认识的tag,可以跳过处理。
截止swf 10为止,tag共有以下种类,其中有些tag已经被废弃不用。已经标出。
tagEnd = 0;
tagShowFrame = 1;
tagDefineShape = 2;
tagFreeCharacter =3;
tagPlaceObject = 4;
tagRemoveObject = 5;
tagDefineBits = 6;
tagDefineButton = 7;
tagJPEGTables = 8;
tagSetBackgroundColor = 9;
tagDefineFont = 10;
tagDefineText = 11;
tagDoAction = 12;
tagDefineFontInfo = 13;
tagDefineSound = 14;
tagStartSound = 15;
tagStopSound =16;
tagDefineButtonSound = 17;
tagSoundStreamHead = 18;
tagSoundStreamBlock = 19;
tagDefineBitsLossless = 20;
tagDefineBitsJPEG2 = 21; 阅读全文…
篇首语:这篇文章老早就想写了,但是本人懒散,兴趣爱好多变,因此本文一直流产至今,知道最近受CGFinal的CGArt杂志的as3翻页核心刺激,重新研究as3杂志时,才有了写这篇唠叨之词的兴致。
另:本文中仅唠叨思想,而无完整实现给出,因此想不自己动手的可以关掉此页面了,对你们的乘兴而来,败兴而归,本人深感抱歉!
电子杂志从初出茅庐,到兴起,乃至今天的回归平淡,依稀走过了6,7年的时光。
zinemaker的诞生,是推动当时电子杂志行业发展的一大举措,也是她将电子杂志这个原来遥不可及的东西摆到了普通业余爱好者的面前,之后,业余杂志数不胜数。
即使2010年的今天,zinemaker沉寂多年后的今天,zinemaker在电子杂志爱好者的手中,依然发挥着她的余光预热。
但是,不得不说,zinemaker的杂志表现形式太单调,翻页效果不够完善。令人失望的是,网上见得比比皆是的都是基于原杂志核心就行的改进,诸如:1、尺寸改进后的模板,2:按钮美化后的模板,3:添加个别功能,诸如打开密码后的模板,4:搜索,放大缩小,自动缩略图等等。 但 这些并不涉及zinemaker的翻页核心:pageflip.swf,而只是其外在的部分表现形式的更改及优化。zinemaker杂志的翻页依旧是那么死板,那么别扭,那么令人感到难受。 阅读全文…
RT
完成鼠标吸附,自动翻页,页面透明穿透,多页连翻机制优化
待完成:翻页静帧(翻页静帧这个东西比较麻烦,尤其在as3中,as3中的显示对象卸载后并不会马上清除,因此无法保证外面载入的swf里面不再执行。stop并不是一直有效的。这点上甚至不如as2)。

RT,完全基于as3实现
内存管理方面有待继续优化,翻页静帧功能暂未实现。
测试页面的内容随便找来的~~~版权归原作者所有
测试方法:鼠标点击页面边缘或页脚,可连续点击实现连翻
as3相比于as1和as2,引入了新的深度管理方法。从而抛弃了as1,as2时期的swapdepth和getnexthigherdepth的深度管理方法。
代替他们的是addChildAt,addChild,removeChild,removeChildAt,swapChildAt等。
广大as3爱好者无不拍手称快。
新的深度管理的方式,将深度管理的工作交给flash自身进行,提供给用户的child索引实际上是连续的,避免的as1,2时期深度不连续的问题。同时深度管理也更加直观。
但是,从我而言,这种新式的深度管理同样也带来了弊端。
以上一篇博文中提到的多页连翻中的深度管理为例,我们可以发现,在多页连翻的过程中实际上是需要不停的去创建页面,并指定z序,同时还需要不停的交换不同页面的z序。这在as3时期的新的深度管理方法下面,简直是噩梦。
此时,你就不得不单独先一个类,去实现类似于as2时期的深度管理方案。这也就要求被管理的对象必须给其重新附加一个depth属性。
以下为depthmanager类源代码。
package org.kingse.CFlipPage.Utilities {
import flash.display.*;
public class DepthManger {
public function DepthManger(){
throw (new Error("静态类,不能实例化。", 9999));
}
public static function getNextHighestDepth(container:DisplayObjectContainer):Number{
throw (new Error("未实现!"));
}
public static function remove(container:DisplayObjectContainer, displayobj:DisplayObject):void{
container.removeChild(displayobj);
}
public static function addAt(container:DisplayObjectContainer, displayobj:DisplayObject, depth:int):void{
var i:int;
var childrencount:int = container.numChildren;
if (childrencount == 0){
container.addChild(displayobj);
displayobj["depth"] = depth;
return;
}
if (container.getChildAt(childrencount-1)["depth"]<depth){
container.addChildAt(displayobj,childrencount);
displayobj["depth"]=depth;
return;
}
i = childrencount-1;
var depth1:int;
var depth2:int;
while (i >=0) {
depth1=container.getChildAt(i)["depth"];
if (i-1>=0){
depth2=container.getChildAt(i-1)["depth"];
}else{
depth2=-1;
}
if (depth==depth1){
container.removeChildAt(i);
container.addChildAt(displayobj,i);
displayobj["depth"]=depth;
return;
}
if ((depth<depth1)&&(depth>depth2)){
container.addChildAt(displayobj,i);
displayobj["depth"]=depth;
return;
}
i--;
}
}
public static function swapDepths(container:DisplayObjectContainer, displayobj:DisplayObject, depth:Number):void{
var tempdepth:int;
if ((container == null) || (displayobj == null)){
return;
}
var nowindex:int;
var nowdepth:int;
var aimdepth:int=int(depth);
try{
nowindex = container.getChildIndex(displayobj);
nowdepth = displayobj["depth"];
if (nowdepth == aimdepth){
return;
}
}catch(err:Error){
return;
}
var childrencount:int = container.numChildren;
var depth1:int;
var depth2:int;
var i:int=childrencount-1;
if (container.getChildAt(i)["depth"] < aimdepth){
container.removeChild(displayobj);
container.addChild(displayobj);
displayobj["depth"]=aimdepth;
}
while (i>=0){
depth1=container.getChildAt(i)["depth"];
if (i-1>=0){
depth2=container.getChildAt(i-1)["depth"];
}else{
depth2=-1;
}
if (aimdepth==depth1){
container.swapChildrenAt(i,nowindex);
displayobj["depth"]=aimdepth;
container.getChildAt(nowindex)["depth"]=nowdepth;
return;
}
if ((aimdepth<depth1)&&(aimdepth>depth2)){
container.removeChild(displayobj);
if (nowindex>=i){
container.addChildAt(displayobj,i);
}else{
container.addChildAt(displayobj,((i-1<0) ? 0 : (i-1)));
}
displayobj["depth"]=aimdepth;
return;
}
i--;
}
}
}
}
电子杂志之风盛行于几年前,从最初的fflippage,pageflip,margpark等组件,到zinemaker,iebook等软件。相关应用层出不群。
但是就效果来说,大部分都基于国外开源的pageflip组件或者原理类似。
其中比较独特的是自在幻想(fictiony)的fflippage组件,该组件实现了多页连翻效果,在真实性上更加完善。
本文以简图探讨多页连翻型与单翻型究竟在架构上有什么不同。
先看下面的图

上图表面的是典型的电子杂志组件的层次安排图。
其中this为整个电子杂志组件,最下面两层为shadow和shadowmask,这两层在整个组件上创造出翻页是的书下面的光影效果。
再上一层是page,page就是页面内容的容器。在往上就是pagemask了,pagemask控制page容器整体的显示范围。
page这个容器里面包含最底层content,也就是内容,例如图片等,shade,中间缝隙的阴影等,contentmask是控制翻页过程中content能够够显示出来的部分。
那么这个体系结构中,page实际上是可以多个累加,进行深度管理的。每个page都有其自己的坐标,以及shade,和contentmask,这样每个就构成了多页连翻的显示结构,至于多页连翻的程序实现,就不在本文探讨范围之内了
最新评论