标题: [插件] zoomrot的改造体(由loli变成御姐)
karryngai
会员
Rank: 1
大叔



UID 58
精华 0
积分 203
帖子 119
阅读权限 5
注册 2007-2-10
 
发表于 2007-6-18 14:10  资料  短消息  加为好友 
zoomrot的改造体(由loli变成御姐)

此被改造的插件比原来的zoomrot要强许多倍了
加进去的新元素有:
1.原来的插件只能实现等比例放缩,这里实现了非等比例,还可以进行透明度的变换
2.原来的插件只能对一个东西进行zoomrot,这里对进行zoomrot的东西数量没有限制,每一个zoomrot的东西可
看成是一个粒子   不但可以对背景层和前景层进行zoomrot,还可以自己命名一个层进行zoomrot
3.可以储存zoomrot的层并进行读取
4.加入了三种特殊zoomrot的效果,分别是拉伸消失,旋转消失和移动消失,主要是针对对话框

@zr layer=0 storage=char1 cx=300 cy=200 sx=100 sy=100 sr=0 sw=0.5 sh=0.5 dx=200 dy=200 dr=10

dw=1.5 dh=2.0 sp=0 dp=255 accel=2 time=2000
layer                层的名字,可以是base,0,1......
storage                图像的名字,注意此项必须要填,不管你原来的层是否有图片,否则会出错

time                做zoomrot所需要的时间,预设是1000
cx,cy                旋转中心,同时也把图像移动时所看准的点,预设是图像的中点处
sr                开始时的角度,以圈为单位,0.5就是指逆时针旋转半圈,-0.7就是指顺时针旋转半圈,预设

是0
sw,sh                sw是开始做zoomrot前,宽度放大缩小的比,sh就是指高度,预设是1
sx,sy                开始做zoomrot前的坐标,当然是以旋转中心为对象的,预设是背景层的左上角

dr                结束时的角度,同样以圈为单位,预设是0
dw,dh                结束时宽度和高度放大缩小的比例,预设是1
dx,dy                结束时的坐标位置,预设是背景层的右下角

sp,dp                开始时和结束时的透明度,透明度的加速度变化也是由accel控制

accel                加速度,accel>1时速度由慢到快,0<accel<1时速度由快到慢
                accel<-1时速度由快到慢,-1<accel<0时速度由慢到快
                预设是1

用layer=0是针对kag中原有层的,如果用name=newlayer来代替layer=0,就会自动生成一个名叫newlayer的新


这个层是用f.newlayer来记忆的,所以所用名字不要和你用过的变量f.xxxx发生重复


@zr name=newlayer index=2000000 storage=char1 cx=300 cy=200 sx=100 sy=100 sr=0 sw=0.5 sh=0.5

dx=200 dy=200 dr=10 dw=1.5 dh=2.0 sp=0 dp=255 accel=2 time=2000
以上多了一个index,如果使用原有layer层的话,无法通过zr来设置index,当然你可以用layopt来设置


@wzrww layer=0
@wzoomrot layer=newlayer
等待layer=0层和名为newlayer新层的zoomrot完成,注意后面的指定不能缺少,否则会出错


@wallzr
等待前面所有正在进行zoomrot的东西完成


@clzrpic layer=0
@clzrpic layer=newlayer
清除layer=0层和名为newlayer的新层,注意zoomrot完成后必须要记得清除zoomrot的层,清除的同时会消除图


还有,如果某一层进行了zoomrot,不进行清除的话就无法进行下一次的zoomrot,尽清进行zoomrot的是同一幅

图片


@savezr layer=0
@savezr layer=newlayer
储存当前zoomrot的层,注意储存的同时会清除该层,还有只能储存一层,如果再使用savezr的话,就会覆盖前

面的资料

@loadzr layer=0
@loadzr layer=newlayer
读取储存,当然读取的图片和储存的是一样的

以下是针对特殊变换方法
@stretchvanish storage=dial layer=0 x=100 y=100 w=1 h=30 p=12 time=2000
x,y        图像中心的位置,预设是在窗口的下沿
w,h        图像变形结束时的宽度比例和高度比例,预设w=25,h=0.00001
p        图像结束时的透明度,预设是1
time        预设是300

@stretchvanish storage=dial name=dialvanish index=2000000 x=100 y=100 w=1 h=30 p=12 time=2000
使用name的话,可以选填index

@rotatevanish storage=dial layer=0 x=100 y=100 r=25 s=0.001 p=12 accel=2 time=2000
x,y        图像中心的位置,预设是在窗口的下沿
r        旋转的次数,预设是15
s        变换结束时的比例,这里用的是等比例,预设是0.0001
p        变换结束时的透明度,预设是1
accel        加速度,预设是3
time        预设是700

@rotatevanish storage=dial name=dialvanish x=100 y=100 r=25 s=0.001 p=12 accel=2 time=2000
和上面一样,用name时,可填index

@movevanish storage=dial layer=0 x=100 y=100 p=20 accel=2 time=2000 direction=east
x,y        图像中心的位置,预设是在窗口的下沿
p        变换结束时的透明度,预设是1
accel        加速度,预设是3
time        预设是300
direction 有四个方向可以选,east,south,west,north对应屏幕的四个方向,指的是消失的移动方向,都是平

行性移动的





我的女朋友今年十五歲——就這樣在一起就好了~~~ 就這樣在一起~~~ 忘卻一切世俗的眼光~~~
顶部
karryngai
会员
Rank: 1
大叔



UID 58
精华 0
积分 203
帖子 119
阅读权限 5
注册 2007-2-10
 
发表于 2007-6-18 14:11  资料  短消息  加为好友 


@iscript

class ZoomRotGrain{
        var window,name,triggername;
        var isbase,islayer,isnew;
        var cx,cy;
        var sx,sy,sr,sw,sh;
        var dx,dy,dr,dw,dh;
        var sp,dp;
        var accel;
        var time;       
        var templayer;
        var targetlayer;
        var storage;
        var a00,a01,a10,a11,ax,ay;
        var starttick;
        var moving;
        var newlayer;

        function ZoomRotGrain(window){
                this.window=window;
        }

        function setOption(elm){
                moving=false;
                newlayer=false;       
                isbase=islayer=isnew=false;

                storage=elm.storage if elm.storage!==void;
                templayer=new Layer(window,window.primaryLayer);
                templayer.loadImages(storage);
               
                if(elm.cx!==void)       
                        cx=+elm.cx;
                else
                        cx=templayer.imageWidth/2;
                if(elm.cy!==void)
                        cy=+elm.cy;
                else
                        cy=templayer.imageHeight/2;
               

                if(elm.sx!==void)
                        sx=+elm.sx;
                else
                        sx=0;
                if(elm.sy!==void)
                        sy=+elm.sy;
                else
                        sy=0;
                if(elm.sr!==void)
                        sr=+elm.sr;
                else
                        sr=0;
                if(elm.sw!==void)
                        sw=+elm.sw;
                else
                        sw=1;
                if(elm.sh!==void)
                        sh=+elm.sh;
                else
                        sh=1;
                if(elm.sp!==void)
                        sp=+elm.sp;
                else
                        sp=255;

                if(elm.dx!==void)
                        dx=+elm.dx;
                else
                        dx=window.primaryLayer.width;
                if(elm.dy!==void)
                        dy=+elm.dy;
                else
                        dy=window.primaryLayer.height;
                if(elm.dr!==void)
                        dr=+elm.dr;
                else
                        dr=0;

                if(elm.dw!==void)
                        dw=+elm.dw;
                else
                        dw=1;
                if(elm.dh!==void)
                        dh=+elm.dh;
                else
                        dh=1;

                if(elm.dp!==void)
                        dp=+elm.dp;
                else
                        dp=255;

                if(elm.accel!==void)
                        accel=+elm.accel;
                else
                        accel=1;

                if(elm.time!==void)
                        time=+elm.time;
                else
                        time=1000;


                if(elm.stretch){
                        if(elm.sx==void)
                                sx=window.primaryLayer.width/2;
                        if(elm.sy==void)
                                sy=window.primaryLayer.height-templayer.imageHeight/2;
                        dx=sx;
                        dy=sy;
                        if(elm.dw==void)
                                dw=25;
                        if(elm.dh==void)
                                dh=0.00001;
                        if(elm.dp==void)
                                dp=1;
                        if(elm.time==void)
                                time=300;
                }

                if(elm.rotate){
                        if(elm.sx==void)
                                sx=window.primaryLayer.width/2;
                        if(elm.sy==void)
                                sy=window.primaryLayer.height-templayer.imageHeight/2;
                        dx=sx;
                        dy=sy;
                        if(elm.dr==void)
                                dr=15;
                        if(elm.dw==void)
                                dw=0.0001;
                        dh=dw;
                        if(elm.dp==void)
                                dp=1;
                        if(elm.accel==void)
                                accel=3;
                        if(elm.time==void)
                                time=700;
                }

                if(elm.move){
                        if(elm.sx==void)
                                sx=window.primaryLayer.width/2;
                        if(elm.sy==void)
                                sy=window.primaryLayer.height-templayer.imageHeight/2;
                        if(elm.dp==void)
                                dp=1;
                        switch(elm.direction){
                                case "east":
                                        dx=window.primaryLayer.width+cx;
                                        dy=sy;
                                        break;
                                case "west":
                                        dx=-cx;
                                        dy=sy;
                                        break;
                                case "south":
                                        dx=sx;
                                        dy=window.primaryLayer.height+cy;
                                        break;
                                case "north":
                                        dx=sx;
                                        dy=-cy;
                                        break;
                                default:
                                        dx=window.primaryLayer.width+cx;
                                        dy=sy;
                                        break;
                        }
                        if(elm.accel==void)
                                accel=3;
                        if(elm.time==void)
                                time=300;
                }

                if(elm.layer=="base"){
                        targetlayer=window.fore.base;
                        name=triggername="base";
                        isbase=true;
                }
                else if(elm.layer!==void){
                        targetlayer=window.fore.layers[+elm.layer];
                        name="layer"+elm.layer;
                        triggername=""+elm.layer;
                        islayer=true;
                }
                else{
                        name=triggername=elm.name;
                        targetlayer=new Layer(window,window.primaryLayer);
                        targetlayer.absolute=2000000-2;
                        newlayer=true;
                        isnew=true;
                }
               
                if(elm.index!==void || newlayer)
                        targetlayer.absolute=elm.index;
                else
                        targetlayer.absolute=2000000-1;

                targetlayer.setPos(0,0,window.primaryLayer.width,window.primaryLayer.height);
                targetlayer.face = dfAlpha;
                targetlayer.type = ltAlpha;
        }

        function startZoomRot(elm){
                setOption(elm);
               
                targetlayer.visible=true;       
                moving=true;
                starttick=System.getTickCount();
               
                System.addContinuousHandler(loopevent);
        }

        function setPosition(scale){
                var x=sx+(dx-sx)*scale;
                var y=sy+(dy-sy)*scale;
                var r=sr+Math.PI*2*(dr-sr)*scale;

                var w=sw+(dw-sw)*scale;
                var h=sh+(dh-sw)*scale;

                a00=w*Math.cos(r);
                a01=w*Math.sin(r);
                a10=-h*Math.sin(r);
                a11=h*Math.cos(r);

                ax=a00*-cx+a01*-cy+x;
                ay=a10*-cx+a11*-cy+y;
               
                targetlayer.fillRect(0,0,targetlayer.imageWidth,targetlayer.imageHeight,0);
                targetlayer.affineCopy(templayer,0,0,templayer.imageWidth,templayer.imageHeight,true,a00,a10,a01,a11,ax,ay,stNearest);
        }

        function setOpacity(scale){
                var p=sp+(dp-sp)*scale;
                targetlayer.opacity=p;
        }

        function loopevent(tick){
                var scale=(tick-starttick)/time;

                if(scale>=1){
                        stopLoop();
                }
                else{
                        if(accel<0){
                                scale=1.0-scale;
                                scale=Math.pow(scale,-accel);
                                scale=1.0-scale;
                        }
                        if(accel>0)
                                scale=Math.pow(scale,accel);
                       
                        setPosition(scale);
                        setOpacity(scale);
                }
        }

        function stopLoop(){
                if(moving){
                        setPosition(1.0);                       

                        invalidate templayer if templayer!==void;       
                        window.trigger("zoomrot");
                        window.trigger(triggername);
                        System.removeContinuousHandler(loopevent);

                        templayer=void;
                        moving=false;
                }
               
        }

        function clearPic(){
                if(moving){
                        System.removeContinuousHandler(loopevent);
                }
                targetlayer.fillRect(0,0,targetlayer.imageWidth,targetlayer.imageHeight,0);

                if(newlayer)
                        invalidate targetlayer if targetlayer!==void;
                invalidate templayer if templayer!==void;

                templayer=void;
                targetlayer=void;
                moving=false;
                delete f[name];
        }

        function finalize(){
                invalidate templayer if templayer!==void;
                invalidate targetlayer if targetlayer!==void;
                templayer=void;
                targetlayer=void;
        }

        function onStore(f,elm){
                f.zoomrotpic=%[];
                f.zoomrotpic.cx=cx;
                f.zoomrotpic.cy=cy;
                f.zoomrotpic.sx=sx;
                f.zoomrotpic.sy=sy;
                f.zoomrotpic.sr=sr;
                f.zoomrotpic.sw=sw;
                f.zoomrotpic.sh=sh;
                f.zoomrotpic.sp=sp;
                f.zoomrotpic.dx=dx;
                f.zoomrotpic.dy=dy;
                f.zoomrotpic.dr=dr;
                f.zoomrotpic.dw=dw;
                f.zoomrotpic.dh=dh;
                f.zoomrotpic.dp=dp;
                f.zoomrotpic.accel=accel;
                f.zoomrotpic.time=time;
                f.zoomrotpic.storage=storage;
                if(isbase)
                        f.zoomrotpic.layer="base";
                if(islayer)
                        f.zoomrotpic.layer=triggername;
                if(isnew)
                        f.zoomrotpic.name=name;
                clearPic();
        }

        function onRestore(f,clear,elm){
                startZoomRot(f.zoomrotpic);
                delete f.zoomrotpic;
        }
                                               
}
@endscript

@macro name=zr
@if exp="mp.layer=='base'"
@eval exp="f['base']=new ZoomRotGrain(kag)"
@eval exp="f['base'].startZoomRot(mp)"

@elsif exp="mp.layer!==void"
@eval exp="f['layer'+mp.layer]=new ZoomRotGrain(kag)"
@eval exp="f['layer'+mp.layer].startZoomRot(mp)"

@elsif exp="mp.name!==void"
@eval exp="f[mp.name]=new ZoomRotGrain(kag)"
@eval exp="f[mp.name].startZoomRot(mp)"

@endif
@endmacro


@macro name=wzr
@if exp="mp.layer=='base'"
@waittrig name=base
@elsif exp="mp.layer!==void"
@waittrig name=%layer
@elsif exp="mp.name!==void"
@waittrig name=%name
@endif
@endmacro


@macro name=wallzr
@waittrig name=zoomrot
@endmacro


@macro name=clzrpic
@if exp="mp.layer=='base'"
@eval exp="f['base'].clearPic()"
@elsif exp="mp.layer!==void"
@eval exp="f['layer'+mp.layer].clearPic()"
@elsif exp="mp.name!==void"
@eval exp="f[mp.name].clearPic()"
@endif
@endmacro


@macro name=savezr
@if exp="mp.layer=='base'"
@eval exp="f['base'].onStore(f,'save')"
@elsif exp="mp.layer!==void"
@eval exp="f['layer'+mp.layer].onStore(f,'save')"
@elsif exp="mp.name!==void"
@eval exp="f[mp.name].onStore(f,'save')"
@endif
@endmacro


@macro name=loadzr
@if exp="mp.layer=='base'"
@eval exp="f['base']=new ZoomRotGrain(kag)"
@eval exp="f['base'].onRestore(f,false,'load')"
@elsif exp="mp.layer!==void"
@eval exp="f['layer'+mp.layer]=new ZoomRotGrain(kag)"
@eval exp="f['layer'+mp.layer].onRestore(f,false,'load')"
@elsif exp="mp.name!==void"
@eval exp="f[mp.name]=new ZoomRotGrain(kag)"
@eval exp="f[mp.name].onRestore(f,false,'load')"
@endif
@endmacro


@macro name=stretchvanish
@zr storage=%storage layer=%layer name=%name sx=%x sy=%y dw=%w dh=%h dp=%p time=%time stretch=true index=%index
@endmacro


@macro name=rotatevanish
@zr storage=%storage layer=%layer name=%name sx=%x sy=%y dw=%s dr=%r dp=%p accel=%accel time=%time rotate=true index=%index
@endmacro


@macro name=movevanish
@zr storage=%storage layer=%layer name=%name sx=%x sy=%y dp=%p accel=%accel time=%time direction=%direction move=true index=%index
@endmacro



@return

[ 本帖最后由 karryngai 于 2007-6-21 11:00 编辑 ]





我的女朋友今年十五歲——就這樣在一起就好了~~~ 就這樣在一起~~~ 忘卻一切世俗的眼光~~~
顶部
karryngai
会员
Rank: 1
大叔



UID 58
精华 0
积分 203
帖子 119
阅读权限 5
注册 2007-2-10
 
发表于 2007-6-18 14:13  资料  短消息  加为好友 
用action也能做到上面的效果,但是必须要多个模块一起使用,还有它的算法上增添了一些不必要的东西,几个图层一起执行的话显然会比这个要慢
用@zr @wzr @clzrpic和@wait可以做出各种各样变化图片的集合,但是由于引擎缺乏补间的功能不完善,做出的质量并不太理想
但是如果考虑低层次的移动方面,这东西已经够用了,偶对自己这个写出来的东西是非常满意的,因为基本上集合了所有的变形方法
用affineCopy其实还可以写出一些有趣的变形,各种扭曲等,目前正在考虑坐标轴倾斜的问题,算法已想好,还没写





我的女朋友今年十五歲——就這樣在一起就好了~~~ 就這樣在一起~~~ 忘卻一切世俗的眼光~~~
顶部
sarah707
亲友
Rank: 2


UID 15
精华 3
积分 825
帖子 366
阅读权限 50
注册 2006-12-20
 
发表于 2007-6-18 17:04  资料  短消息  加为好友 


QUOTE:
原帖由 karryngai 于 2007-6-18 14:10 发表
2.原来的插件只能对一个东西进行zoomrot,这里对进行zoomrot的东西数量没有限制,每一个zoomrot的东西可
看成是一个粒子   不但可以对背景层和前景层进行zoomrot,还可以自己命名一个层进行zoomrot

这条太有爱了~当初用的时候本来打算自己改的……后来发现自己太小白改不了……OTZ就把那个效果放弃了……现在有楼主的伟大工作真是好啊真是好啊……T-T






KX3游戏制作组
顶部
karryngai
会员
Rank: 1
大叔



UID 58
精华 0
积分 203
帖子 119
阅读权限 5
注册 2007-2-10
 
发表于 2007-6-18 19:15  资料  短消息  加为好友 
文字层的变化。。。偶也在想。。。目前还未看完MessageLayer,不敢轻举妄动地去写。。。





我的女朋友今年十五歲——就這樣在一起就好了~~~ 就這樣在一起~~~ 忘卻一切世俗的眼光~~~
顶部
 



清除 Cookies - 联系我们 - [Key Fans Club] the Council of Doujin-game Development and Promotion - Archiver - WAP
Powered by Discuz! 5.5.0 © 2001-2006 Comsenz Inc.
Processed in 0.023760 second(s), 10 queries , Gzip enabled
粤ICP备05060595号
[ 当前模板 - 天高云淡 v 设计制作 - 七星论坛 v 请使用1024*768或以上分辨率浏览本模板 ]
请勿删除或修改此处版权图示