;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
@saverain 如果使用右键菜单时,需对现在的下雨状态进行保存,保存的同时也会让雨停止,停止所需的时间来源于startrain的stoptime
如rain_0.png,rain_1.png,rain_2.png,rain_3.png......