标题: [插件] 下雨下雪插件的改造版
karryngai
会员
Rank: 1
大叔



UID 58
精华 0
积分 203
帖子 119
阅读权限 5
注册 2007-2-10
 
发表于 2007-6-12 11:14  资料  短消息  加为好友 
下雨下雪插件的改造版

说是改造,其实是重写了一次,除了方法相似外,已经被写得面目全非了
加入了速度,纵向偏移度几个概念,还有雨或雪从疏到密或从密到疏所经历的时间,使得原插件中雨粒或雪粒的消失变得自然一点
其实可以写得更好的,但是从疏到密的过程涉及一道很冗长的概率公式,还要积分的说,懒得去想怎样去用函数逼近它了,直接取个认为还过得去的函数轻松搞掂= =
直考虑在其中加入风的概念,风会让雨或雪摆动起来,有空的话再作改造





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



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


;by karryngai 2007.6.8

@if exp="typeof(global.rain_object)=='undefined'"
@iscript

class RainGrain{
        var window,owner;
        var back,fore;
        var x,y;
        var xvelo,yvelo;               
        var appear;
        var constant1,constant2;

        function RainGrain(window,owner,percent){
                this.window=window;
                this.owner=owner;               
       
                var piccount=0;
                for(var i=0;;i++){
                        if(Storages.isExistentStorage("rain_"+i+".png"))
                                piccount++;
                        else
                                break;
                }
                       
                back=new Layer(window,window.primaryLayer);
                fore=new Layer(window,window.primaryLayer);
                fore.absolute=back.absolute=2000000-1;
               
                back.loadImages("rain_"+intrandom(0,piccount-1));
                fore.assignImages(back);
                       
                back.setSizeToImageSize();
                fore.setSizeToImageSize();
                var h=int(back.height*percent);
                fore.height=back.height=h;
                fore.imageTop=back.imageTop=h-back.height;
                       
                fore.hitType=back.hitType=htMask;
                fore.hitThreshold=back.hitThreshold=256;
                       
                x=int(window.primaryLayer.width*Math.random());
                y=-back.height;
                back.setPos(x,y);
                fore.setPos(x,y);

                back.opacity=155+int(100*Math.random());
                fore.opacity=155+int(100*Math.random());
                       
                xvelo=0;
                yvelo=int(back.height/5+owner.excursion*2*Math.random());

                appear=false;

                constant1=1.0/(owner.starttime/owner.interval)/4.0;
                constant2=1.0/(owner.stoptime/owner.interval)*8.0;
        }

        function setAppear(){
                appear=true;
                back.visible=owner.backVisible;
                fore.visible=owner.foreVisible;
        }

        function setDisappear(){
                appear=false;
                back.visible=false;
                fore.visible=false;
        }

        function setVisible(){
                if(appear){
                        back.visible=owner.backVisible;
                        fore.visible=owner.foreVisible;
                }
                else{
                        back.visible=false;
                        fore.visible=false;
                }
        }

        function setPosition(){
                if(owner.start){
                        if(!appear)
                                setAppear() if Math.random()<constant1;
                        else{
                                x+=xvelo;
                                y+=yvelo;
                                if(y>=window.primaryLayer.height){
                                        x=int(window.primaryLayer.width*Math.random());       
                                        y=-int(back.height*Math.random());
                                }
                                back.setPos(x,y);
                                fore.setPos(x,y);
                        }
                }
                else{
                        if(appear)
                                setDisappear() if Math.random()<constant2;
                        if(appear){                       
                                x+=xvelo;
                                y+=yvelo;
                                if(y>=window.primaryLayer.height){
                                        x=int(window.primaryLayer.width*Math.random());       
                                        y=-int(back.height*Math.random());
                                }
                                back.setPos(x,y);
                                fore.setPos(x,y);
                        }
                }               
        }

        function exchangeForeBack(){
                var temp;
                temp=back;
                back=fore;
                fore=temp;
        }

        function finalize(){
                invalidate back;
                invalidate fore;
        }

}

class RainPlugin extends KAGPlugin{
        var window;
        var count;
        var backVisible,foreVisible;
        var excursion;
        var raingrain=[];
        var timer,interval,speed;
        var start;
        var starttime,stoptime;

        function RainPlugin(win){
                super.KAGPlugin(...);
                window=win;
        }

        function startRain(elm){
                if(timer!==void) return;
               
                count=300;
                foreVisible=backVisible=true;
                excursion=25;
                interval=50;
                speed=50;
                starttime=10000;
                stoptime=1000;
                setOption(elm);       

                for(var i=0;i<count;i++){
                        var percent=intrandom(50,100)/100.0;
                        raingrain[i]=new RainGrain(window,this,percent);
                }

                start=true;
                timer=new Timer(timeevent,"");
                timer.enabled=true;
                timer.interval=interval;
        }

        function timeevent(){
                for(var i=0;i<count;i++)
                        raingrain[i].setPosition();
                if(!start){
                        stoptime-=interval;
                        if(stoptime<0)
                                invalidateRain();
                }
       
        }               

        function setOption(elm){
                count=elm.count if elm.count!==void;
                backVisible=elm.backvisible if elm.backvisible!==void;
                foreVisible=elm.forevisible if elm.forevisible!==void;
                if(elm.excursion!==void){
                        if(elm.excursion>200)
                                excursion=200;
                        else if(elm.excursion<0)
                                excursion=0;
                        else
                                excursion=elm.excursion;
                }
                if(elm.speed!==void){
                        speed=elm.speed;
                        if(speed<0)
                                speed=0;
                        if(elm.speed>=100)
                                speed=99;
                        interval=100-speed;
                }
                if(elm.starttime!==void){
                        if(elm.starttime<100)
                                starttime=100;
                        else
                                starttime=elm.starttime;
                }
                if(elm.stoptime!==void){
                        if(elm.stoptime<100)
                                stoptime=100;
                        else
                                stoptime=elm.stoptime;
                }
        }       
       
        function stopRain(elm){
                if(timer===void) return;
                if(elm.stoptime!==void){
                        if(elm.stoptime<100)
                                stoptime=100;
                        else
                                stoptime=elm.stoptime;
                }
                start=false;
        }

        function invalidateRain(){
                for(var i=0;i<raingrain.count;i++)
                        invalidate raingrain[i];
                raingrain.count=0;
                invalidate timer;
                timer=void;
        }

        function finalize(){
                super.finalize();
                for(var i=0;i<raingrain.count;i++)
                        invalidate raingrain[i];
                invalidate raingrain;
                invalidate timer if timer!==void;
        }

        function onStore(f,elm){
                super.onStore(...);
                f.rain=%[];
                f.rain.israining=(timer!==void);
                f.rain.backvisible=backVisible;
                f.rain.forevisible=foreVisible;
                f.rain.excursion=excursion;
                f.rain.count=count;
                f.rain.speed=speed;
                f.rain.starttime=starttime;
                f.rain.stoptime=stoptime;
                stopRain(f.rain) if timer!=void;
        }

        function onRestore(f,clear,elm){
                super.onRestore(...);
                f.rain.starttime/=3;
                if(f.rain.israining)
                        startRain(f.rain);
                delete f.rain;

        }

        function onCopyLayer(toback){
                super.onCopyLayer(...);
                if(toback)
                        backVisible=foreVisible;
                else
                        foreVisible=backVisible;
               
                for(var i=0;i<raingrain.count;i++)
                        rainggrain[i].setVisible();
        }

        function onExchangeForeBack(){
                super.onExchangeForeBack();
                for(var i=0;i<raingrain.count;i++)
                        raingrain[i].exchangeForeBack();               
        }                               

}
kag.addPlugin(global.rain_object=new RainPlugin(kag));

@endscript
@endif

@macro name=startrain
@eval exp="global.rain_object.startRain(mp)"
@endmacro

@macro name=stoprain
@eval exp="global.rain_object.stopRain(mp)"
@endmacro

@macro name=saverain
@eval exp="global.rain_object.onStore(f,'tempsave')"
@endmacro

@macro name=loadrain
@eval exp="global.rain_object.onRestore(f,false,'tempload')"
@endmacro

@return

@startrain  backvisible=true forevisible=true count=100 excursion=50 starttime=2000 stoptime=1000 speed=50
backvisible         雨粒里层的可视性
forevisible         雨粒表层的可视性
count                雨粒的数目,数目越大,所需内存空间越大
excursion        雨粒纵向移动的偏离位置,可填0到100
starttime        雨粒从疏到密所经历的时间,单位是毫秒(只是一个估计的值)
stoptime        雨粒停止时从密到疏所经历的时间,单位是毫秒(只是一个估计的值)
speed                雨粒的速度,可填0到100

@stoprain stoptime=4000
stoptime        雨粒停止时从密到疏所经历的时间,单位是毫秒(只是一个估计的值),在startrain中设定了,在这里可以不用设定

@saverain        如果使用右键菜单时,需对现在的下雨状态进行保存,保存的同时也会让雨停止,停止所需的时间来源于startrain的stoptime

@loadrain        读取保存的雨状态,让雨粒重现

在使用这个插件时,请把确认雨粒图像的命名方式,必须是rain_X.png,X是0以上的整数,可自行放入任意张雨粒图像,但X必须是从0开始的连续数字
如rain_0.png,rain_1.png,rain_2.png,rain_3.png......





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



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


;by karryngai 2007.6.10

@if exp="typeof(global.snow_object)=='undefined'""
@iscript

class SnowGrain{
        var window,owner;
        var back,fore;
        var x,y;
        var xvelo,yvelo;
        var xaccel;
        var appear;
        var constant1,constant2;

        function SnowGrain(window,owner){
                this.window=window;       
                this.owner=owner;               
       
                var piccount=0;
                for(var i=0;;i++){
                        if(Storages.isExistentStorage("snow_"+i+".png"))
                                piccount++;
                        else
                                break;
                }

                back=new Layer(window,window.primaryLayer);
                fore=new Layer(window,window.primaryLayer);
                fore.absolute=back.absolute=2000000-1;

                back.loadImages("snow_"+intrandom(0,piccount-1));
                fore.assignImages(back);

                back.setSizeToImageSize();
                fore.setSizeToImageSize();
       
                x=int(window.primaryLayer.width*Math.random());
                y=-back.height;
                back.setPos(x,y);
                fore.setPos(x,y);

                back.opacity=int(155+100*Math.random());
                fore.opacity=int(155+100*Math.random());

                xvelo=0;
                yvelo=(back.height-6)/4+2+Math.random()*owner.excursion/5;
                xaccel=Math.random()*owner.accel/10;

                appear=false;

                constant1=1.0/(owner.starttime/owner.interval)/4.0;
                constant2=1.0/(owner.stoptime/owner.interval)*8.0;                               
        }

        function setAppear(){
                appear=true;
                back.visible=owner.backVisible;
                fore.visible=owner.foreVisible;
        }

        function setDisappear(){
                appear=false;
                back.visible=false;
                fore.visible=false;
        }

        function setVisible(){
                if(appear){
                        back.visible=owner.backVisible;
                        fore.visible=owner.foreVisible;       
                }
                else{
                        back.visible=false;
                        fore.visible=false;
                }
        }

        function setPosition(){
                if(owner.start){
                        if(!appear)
                                setAppear() if Math.random()<constant1;
                        else{
                                x+=xvelo;
                                y+=yvelo;
                               
                                var ceil=0.15*owner.accel;
                                xvelo+=xaccel;
                                if(xvelo>ceil)
                                        xvelo=ceil;
                                if(xvelo<-ceil)
                                        xvelo=-ceil;

                                var ceil=0.02*owner.accel;
                                xaccel+=(Math.random()-0.5)*owner.accel*0.03;
                                if(xaccel>ceil)
                                        xaccel=ceil;
                                if(xaccel<-ceil)
                                        xaccel=-ceil;
                               
                                if(y>window.primaryLayer.height){
                                        x=int(window.primaryLayer.width*Math.random());
                                        y=-back.height;
                                }

                                back.setPos(x,y);
                                fore.setPos(x,y);
                        }
                }
                else{
                        if(appear)
                                setDisappear() if Math.random()<constant2;
                        if(appear){
                                x+=xvelo;
                                y+=yvelo;
                               
                                var ceil=0.15*owner.accel;
                                xvelo+=xaccel;
                                if(xvelo>ceil)
                                        xvelo=ceil;
                                if(xvelo<-ceil)
                                        xvelo=-ceil;

                                var ceil=0.02*owner.accel;
                                xaccel+=(Math.random()-0.5)*owner.accel*0.03;
                                if(xaccel>ceil)
                                        xaccel=ceil;
                                if(xaccel<-ceil)
                                        xaccel=-ceil;
                               
                                if(y>window.primaryLayer.height){
                                        x=int(window.primaryLayer.width*Math.random());
                                        y=-back.height;
                                }

                                back.setPos(x,y);
                                fore.setPos(x,y);
                        }
                }                                       
               
        }

        function exchangeForeBack(){
                var temp;
                temp=back;
                back=fore;
                fore=temp;
        }
        function finalize(){
                invalidate back;
                invalidate fore;
        }

}


class SnowPlugin extends KAGPlugin{
        var window;
        var count;
        var backVisible,foreVisible;
        var snowgrain=[];
        var timer,interval,speed;
        var excursion,accel;
        var start;
        var starttime,stoptime;

        function SnowPlugin(window){
                super.KAGPlugin(window);
                this.window=window;
        }

        function startSnow(elm){
                if(timer!==void) return;               

                count=300;       
                foreVisible=backVisible=true;
                interval=50;               
                speed=50;
                excursion=50;
                accel=10;
                starttime=10000;
                stoptime=1000;
                setOption(elm);       

                for(var i=0;i<count;i++)
                        snowgrain[i]=new SnowGrain(window,this);       

                start=true;

                timer=new Timer(timeevent,"");
                timer.enabled=true;
                timer.interval=interval;                       
        }

        function timeevent(){
                for(var i=0;i<count;i++)
                        snowgrain[i].setPosition();
                if(!start){
                        stoptime-=interval;
                        if(stoptime<0)
                                invalidateSnow();       
                }       
        }

        function setOption(elm){
                count=elm.count if elm.count!==void;
                backVisible=elm.backvisible if elm.backvisible!==void;
                foreVisible=elm.forevisible if elm.forevisible!==void;
                if(elm.excursion!==void){
                        if(elm.excursion>200)
                                excursion=200;
                        else if(elm.excursion<0)
                                excursion=0;
                        else
                                excursion=elm.excursion;
                }
                if(elm.accel!==void){
                        if(elm.accel>100)
                                accel=100;
                        else if(elm.accel<0)
                                accel=0;
                        else
                                accel=elm.accel;
                }
                if(elm.speed!==void){
                        speed=elm.speed;
                        if(speed<0)
                                speed=0;
                        if(elm.speed>=100)
                                speed=99;
                        interval=100-speed;
                }
                if(elm.starttime!==void){
                        if(elm.starttime<100)
                                starttime=100;
                        else
                                starttime=elm.starttime;
                }
                if(elm.stoptime!==void){
                        if(elm.stoptime<100)
                                stoptime=100;
                        else
                                stoptime=elm.stoptime;
                }               
        }

        function stopSnow(elm){
                if(timer==void) return;
                if(elm.stoptime!==void){
                        if(elm.stoptime<100)
                                stoptime=100;
                        else
                                stoptime=elm.stoptime;
                }
                start=false;
        }

        function invalidateSnow(){
                for(var i=0;i<snowgrain.count;i++)
                        invalidate snowgrain[i];
                snowgrain.count=0;
                invalidate timer;
                timer=void;
        }

        function finalize(){
                super.finalize();
                for(var i=0;i<snowgrain.count;i++)
                        invalidate snowgrain[i];
                invalidate snowgrain;
                invalidate timer if timer!==void;
        }

        function onStore(f,elm){
                super.onStore(...);
                f.snow=%[];
                f.snow.issnowing=(timer!==void);
                f.snow.count=count;
                f.snow.backvisible=backVisible;
                f.snow.forevisible=foreVisible;
                f.snow.excursion=excursion;
                f.snow.accel=accel;
                f.snow.speed=speed;
                f.snow.starttime=starttime;
                f.snow.stoptime=stoptime;
                stopSnow(f) if timer!==void;
        }               
                                               
        function onRestore(f,clear,elm){
                super.onRestore(...);
                f.snow.starttime/=3;
                if(f.snow.issnowing)
                        startSnow(f.snow);
                delete f.snow;
        }

        function onCopyLayer(toback){
                super.onCopyLayer(...);
                if(toback)
                        backVisible=foreVisible;
                else
                        foreVisible=backVisible;
                for(var i=0;i<snowgrain.count;i++)
                        snowgrain[i].setVisible();
        }

        function onExchangeForeBack(){
                super.onExchangeForeBack();
                for(var i=0;i<snowgrain.count;i++)
                        snowgrain[i].exchangeForeBack();               
        }       
}

kag.addPlugin(global.snow_object=new SnowPlugin(kag));

@endscript
@endif

@macro name=startsnow
@eval exp="global.snow_object.startSnow(mp)"
@endmacro

@macro name=stopsnow
@eval exp="global.snow_object.stopSnow(mp)"
@endmacro

@macro name=savesnow
@eval exp="global.snow_object.onStore(f,'tempsave')"
@endmacro

@macro name=loadsnow
@eval exp="global.snow_object.onRestore(f,false,'tempload')"
@endmacro

@return

@startsnow  backvisible=true forevisible=true count=100 excursion=50 starttime=2000 stoptime=1000 speed=50 accel=20
backvisible         雪粒里层的可视性
forevisible         雪粒表层的可视性
count                雪粒的数目,注意数目越大,所占内存空间越大
excursion        雪粒纵向移动的偏离位置,可填0到100
starttime        雪粒从疏到密所经历的时间,单位是毫秒(只是一个估计的值)
stoptime        雪粒停止时从密到疏所经历的时间,单位是毫秒(只是一个估计的值)
speed                雪粒的速度,可填0到100
accel                雪粒横向的加速度,可填0到100

@stopsnow stoptime=4000
stoptime        雪粒停止时从密到疏所经历的时间,单位是毫秒(只是一个估计的值),在startsnow中设定了,在这里可以不用设定

@savesnow        如果使用右键菜单时,需对现在的下雪状态进行保存,保存的同时也会让雪停止,停止所需的时间来源于startsnow的stoptime

@loadsnow        读取保存的雪状态,让雪粒重现

在使用这个插件时,请把确认雪粒图像的命名方式,必须是snow_X.png,X是0以上的整数,可自行放入任意张雪粒图像,但X必须是从0开始的连续数字
如snow_0.png,snow_1.png,snow_2.png,snow_3.png......





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



UID 58
精华 0
积分 203
帖子 119
阅读权限 5
注册 2007-2-10
 
发表于 2007-6-12 11:25  资料  短消息  加为好友 
话说,tjs的除错功能太差了...写snow插件时,偶不小心把intrandom打成了random...但是因为迷乱了心窍,看不出错在哪里...系统又不说错在哪里...结果花去了偶半个小时的时间才找出了错误...
以上插件已经过多次试验,应该没问题...如有问题...请指正...





我的女朋友今年十五歲——就這樣在一起就好了~~~ 就這樣在一起~~~ 忘卻一切世俗的眼光~~~
顶部
Miliardo
幕后黑手
Rank: 4


UID 1
精华 0
积分 379
帖子 339
阅读权限 255
注册 2006-12-3
 
发表于 2007-6-12 13:32  资料  短消息  加为好友 
呵呵,Debug的话,要多利用控制台和程序内的楔子才行= v =
你大概是还没有适应吧= v =





そんな世界を 僕らはゆく
誰かのために また目覚める
誰がいても 誰もいなくても そう思うよ
顶部
sarah707
亲友
Rank: 2


UID 15
精华 3
积分 825
帖子 366
阅读权限 50
注册 2006-12-20
 
发表于 2007-12-24 22:15  资料  短消息  加为好友 
有关于这个插件……在使用的时候出了一点问题……下雨的插件在backvisible和forevisible都true的情况下一trans就会没有……请问下这个是bug还是本来就是这样写的呢?
我把back和fore改成
back=new Layer(window,window.back.base);
fore=new Layer(window,window.fore.base);
就可以正常trans,目前还没发现什么问题……
另外,有一处笔误,268行raingrain写成了rainggrain

[ 本帖最后由 sarah707 于 2007-12-24 22:52 编辑 ]






KX3游戏制作组
顶部
dantelight
会员
Rank: 1


UID 725
精华 0
积分 30
帖子 7
阅读权限 5
注册 2008-2-29
 
发表于 2008-3-14 12:27  资料  短消息  加为好友 
很小白地问一下哦。。。
我按照那个插件使用说明的使用这个插件
为什么每次调用时都显示找不到成员startSnow...?
555...
可以用了。。。原来换到system才行啊。。。

[ 本帖最后由 dantelight 于 2008-3-14 18:50 编辑 ]

顶部
darkcross
会员
Rank: 1


UID 770
精华 0
积分 196
帖子 63
阅读权限 5
注册 2008-3-29
 
发表于 2008-8-3 19:08  资料  短消息  加为好友 
那么,如何设定图层呢?谢谢!

顶部
sakuyuki
会员
Rank: 1
KR初心者



UID 510
精华 0
积分 37
帖子 8
阅读权限 5
注册 2007-10-25
 
发表于 2008-9-20 16:15  资料  短消息  加为好友 
遇到了和dantelight一样的问题,
‘无法找到成员 "startSnow"  at anonymous@0x093459F8(1)[(top level script) global]……’
而且就算是换到SYSTEM也不行……怎么办?





http://blog.sina.com.cn/kota
顶部
 



清除 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.025163 second(s), 9 queries , Gzip enabled
粤ICP备05060595号
[ 当前模板 - 天高云淡 v 设计制作 - 七星论坛 v 请使用1024*768或以上分辨率浏览本模板 ]
请勿删除或修改此处版权图示