2007-6-20 12:52
karryngai
多幅图片的动画播放插件
这个世界上有很多懒人,不愿把动画一帧一帧地合并到一幅图里,如果图片特别大的话,更加做不到这点
那么就用这个方法吧,很爽的
@playanime layer=1 storage=anime.png mode=add left=100 top=100 time=5000 interval=60 reverse=true
layer 所在层,在这里无法使用背景层
storage 图片名,这里图片的命名方法是xxx (数字).png(或jpg或bmp),注意xxx和(数字)间有空格
如anime (0).png anime (1).png anime (2).png anime (3).png......
为什么要这样命名呢,理由很简单,当你用软件生成了一堆图后,在windows里用ctrl+a全选,按F2命名,把第一幅图片改成anime.png
下面的图片就自动变成anime (1).png anime (2).png anime (3).png......了
然后把第一幅图片改回anime (0).png就成了,是不是很方便,不用为命名的问题烦恼了
mode 模式,默认是ltAlpha,推荐使用add,加法运算能去除黑色背景
left,top 动画所处的位置,默认是(0,0)
time 动画播放的时间,播放完后会自动停止,而不是消失,这点要注意,如不设定,动画就会自动循环,默认是自动循环
interval 播放一幅图片的间隔,用1000除以它就是每秒的帧数,预设是60
reverse 这是个好东西,设定为true的话,动画就会从第一帧播到最后一帧,然后再从最后一帧返回来,再从第一帧开始播放,如此进行
false的话,播到最后一帧后会自动回到第一帧,默认是false
@playanimepic name=tsukasa index=100000 storage=anime.png mode=add left=100 top=100 time=5000 interval=60 reverse=true
这里最好不要用默认的layer[i]层去进行动画,开始时会闪动一个白色的矩形,这和脚本有关,不能排除的因素
最好用name代替layer,用name的话就会自动生成一个非默认的新层
此时会增加参数index,默认是2000000+1
@stopanimepicpic layer=1 让layer=1层动画停止,停止时动画就在屏幕上不动了
@stopanimepic name=tsukasa 让名为tsukasa层动画停止,停止时动画就在屏幕上不动了
@resumeanimepic layer=1
@resumeanimepic name=tsukasa
让停止的动画继续播放
@clearanimepic layer=1
@clearanimepic name=tsukasa
清除动画,注意每使用一次动画后一定要清除,不能企图用playanimepic进行第二次动画的播放
@waitanimepic layer=ma1
@waitanimepic name=matsukasa
等待layer=1或名为tsukasa的动画层停止为止,注意必须要在前面加上ma,以对应相对的层
这也是为了不和偶所写的御姐体zoomrot还有单幅图动画的播放发生冲突而做的
@waitanyanime
如果嫌上面的方法麻烦,可以用这个,这个可以等待任何的动画层播放完毕
@addpath storage=anime
这个东西很重要,如果图片太多了,需要放到一个新增的文件夹里,如命名为anime就需要用以上的语句
事实上用了以上语句后,你把图片打包成anime.xp3也可以读取了,如果要播放的图有一百二十幅,把它们塞进一个文件夹里打包
外观上就很完美了,不用再瞪着那一百二十幅图看
2007-6-20 12:54
karryngai
@iscript
class MultipleAnimPic{
var window;
var running,direction,storage,storageex,interval;
var targetlayer,newlayer,x,y,reverse,triggername,loop,timer;
var piccount;
var num,time;
var templayer;
var start;
function MultipleAnimPic(window){
this.window=window;
}
function setOption(elm){
if(running) return;
num=1;
start=true;
running=false;
direction=1;
reverse=elm.reverse!==void?elm.reverse:false;
if(elm.storage!==void)
this.storage=elm.storage;
else
throw new Exception("\n请指定动画的图片");
storageex=".png";
storageex=".jpg" if Storages.isExistentStorage(storage+" (0).jpg");
storageex=".bmp" if Storages.isExistentStorage(storage+" (0).bmp");
piccount=0;
for(var i=0;;i++){
if(Storages.isExistentStorage(storage+" ("+i+")"+storageex))
piccount++;
else
break;
}
interval=elm.interval!==void?+elm.interval:60;
newlayer=false;
if(elm.layer!==void){
targetlayer=window.getLayerFromElm(elm);
templayer=new Layer(window,window.primaryLayer);
triggername="ma"+elm.layer;
}
else if(elm.name!==void){
targetlayer=new Layer(window,window.primaryLayer);
newlayer=true;
triggername="ma"+elm.name;
}
else
throw new Exception("\n请指定动画所在的图层");
if(newlayer)
targetlayer.absolute=elm.index!==void?+elm.index:2000000+1;
if(elm.mode!==void){
var newtype=global.imageTagLayerType[elm.mode].type;
if(newtype!==void)
targetlayer.type=newtype;
}
else
targetlayer.type=ltAlpha;
x=elm.left!==void?+elm.left:0;
y=elm.top!==void?+elm.top:0;
targetlayer.visible=false;
targetlayer.setPos(x,y);
loop=true;
if(elm.time!==void) time=+elm.time,loop=false;
}
function startAnim(elm){
setOption(elm);
running=true;
timer=new Timer(showPic,"");
timer.interval=interval;
timer.enabled=true;
}
function showPic(){
if(!reverse){
if(newlayer){
targetlayer.loadImages(storage+" ("+(num-1)+")"+storageex);
targetlayer.setSizeToImageSize();
if(start) targetlayer.visible=true,start=false;
}
else{
templayer.loadImages(storage+" ("+(num-1)+")"+storageex);
targetlayer.copyRect(0,0,templayer,0,0,templayer.imageWidth,templayer.imageHeight);
targetlayer.setSize(templayer.imageWidth,templayer.imageHeight);
if(start) targetlayer.visible=true,start=false;
}
num++;
num=1 if num>piccount;
if(!loop){
time-=interval;
if(time<0){
window.trigger(triggername);
window.trigger("waitanyanime");
stopAnim();
}
}
}
else{
if(direction==1){
if(newlayer){
targetlayer.loadImages(storage+" ("+(num-1)+")"+storageex);
targetlayer.setSizeToImageSize();
if(start) targetlayer.visible=true,start=false;
}
else{
templayer.loadImages(storage+" ("+(num-1)+")"+storageex);
targetlayer.copyRect(0,0,templayer,0,0,templayer.imageWidth,templayer.imageHeight);
targetlayer.setSize(templayer.imageWidth,templayer.imageHeight);
if(start) targetlayer.visible=true,start=false;
}
num++;
if(num>piccount) num=piccount-1,direction=0;
if(!loop){
time-=interval;
if(time<0){
window.trigger(triggername);
window.trigger("waitanyanime");
stopAnim();
}
}
return;
}
if(direction==0){
if(newlayer){
targetlayer.loadImages(storage+" ("+(num-1)+")"+storageex);
targetlayer.setSizeToImageSize();
}
else{
templayer.loadImages(storage+" ("+(num-1)+")"+storageex);
targetlayer.copyRect(0,0,templayer,0,0,templayer.imageWidth,templayer.imageHeight);
targetlayer.setSize(templayer.imageWidth,templayer.imageHeight);
}
num--;
if(num<1) num=2,direction=1;
if(!loop){
time-=interval;
if(time<0){
window.trigger(triggername);
window.trigger("waitanyanime");
stopAnim();
}
}
return;
}
}
}
function stopAnim(){
timer.enabled=false;
if(newlayer)
targetlayer.loadImages(storage+" ("+(num-1)+")"+storageex);
else{
targetlayer.copyRect(0,0,templayer,0,0,templayer.imageWidth,templayer.imageHeight);
targetlayer.setSize(templayer.imageWidth,templayer.imageHeight);
}
}
function playStopAnim(){
timer.enabled=true;
}
function clearAnim(){
running=false;
if(!newlayer)
targetlayer.fillRect(0,0,templayer.imageWidth,templayer.imageHeight,0);
if(newlayer)
invalidate targetlayer if targetlayer!==void;
invalidate templayer if templayer!==void;
invalidate timer if timer!==void;
targetlayer=templayer=timer=void;
delete f[triggername] if f[triggername]!==void;
}
}
@endscript
@macro name=addpath
@eval exp="Storages.addAutoPath(mp.storage+'/')"
@if exp="Storages.isExistentStorage(mp.storage+'.xp3')"
@eval exp="Storages.addAutoPath(mp.storage+'.xp3>')"
@endif
@if exp="Storages.isExistentStorage(System.exePath+mp.storage+'.xp3')"
@eval exp="Storages.addAutoPath(System.exePath+mp.storage+'.xp3>')"
@endif
@endmacro
@macro name=playanimepic
@if exp="mp.layer!==void"
@eval exp="f['ma'+mp.layer]=new MultipleAnimPic(kag)"
@eval exp="f['ma'+mp.layer].startAnim(mp)"
@elsif exp="mp.name!==void"
@eval exp="f['ma'+mp.name]=new MultipleAnimPic(kag)"
@eval exp="f['ma'+mp.name].startAnim(mp)"
@endif
@endmacro
@macro name=stopanimepic
@if exp="mp.layer!==void"
@eval exp="f['ma'+mp.layer].stopAnim()"
@elsif exp="mp.name!==void"
@eval exp="f['ma'+mp.name].stopAnim()"
@endif
@endmacro
@macro name=resumeanimepic
@if exp="mp.layer!==void"
@eval exp="f['ma'+mp.layer].playStopAnim()"
@elsif exp="mp.name!==void"
@eval exp="f['ma'+mp.name].playStopAnim()"
@endif
@endmacro
@macro name=clearanimepic
@if exp="mp.layer!==void"
@eval exp="f['ma'+mp.layer].clearAnim()"
@elsif exp="mp.name!==void"
@eval exp="f['ma'+mp.name].clearAnim()"
@endif
@endmacro
@macro name=waitanimepic
@if exp="mp.layer!==void"
@waittrig name=%layer
@elsif exp="mp.name!==void"
@waittrig name=%name
@endif
@endmacro
@macro name=waitanyanime
@waittrig name=waitanyanime
@endmacro
@return