@if exp="typeof(global.picmover_object)=='undefined'"
@iscript
class PicMover{
var window;
var angle;
var storage;
var speed,accel,stopaccel;
var templayer,targetlayer;
var tw,th;
var time;
var thistime,lasttime,last,starttime;
var l;
var canstop;
var newlayer;
var stoppingtime;
function PicMover(window){
this.window=window;
}
function setOption(elm){
l=0;
angle=elm.angle!==void?+elm.angle:(angle!==void?angle:0);
storage=elm.storage if elm.storage!==void;
speed=elm.speed!==void?+elm.speed:(speed!==void?speed:100);
accel=elm.accel!==void?+elm.accel:(accel!==void?accel:0);
stopaccel=elm.stopaccel!==void?+elm.stopaccel:(stopaccel!==void?stopaccel:0);
time=elm.time!==void?+elm.time:(time!==void?time:void);
canstop=elm.canstop!==void?elm.canstop:(canstop!==void?canstop:false);
newlayer=false;
if(elm.layer!==void){
targetlayer=window.getLayerFromElm(elm);
newlayer=true;
}
else if(targetlayer==void)
targetlayer=new AffineLayer(window,window.primaryLayer);
}
function initMove(){
if(templayer==void)
templayer=new Layer(window,window.primaryLayer);
templayer.loadImages(storage);
tw=templayer.imageWidth;
th=templayer.imageHeight;
var pw=window.primaryLayer.width,ph=window.primaryLayer.height;
targetlayer.setPos((pw-tw)/2,(ph-th)/2,tw,th);
targetlayer.visible=true;
}
function startMove(elm){
setOption(elm);
initMove();
starttime=last=System.getTickCount();
System.addContinuousHandler(handler);
}
function handler(tick){
thistime=(tick-starttime)/1000.0;
lasttime=(last-starttime)/1000.0;
last=tick;
setAppearance();
}
function setAppearance(){
l+=speed*(thistime-lasttime)+accel*(Math.pow(thistime,2)/2.0-Math.pow(lasttime,2)/2.0);
l=l-(l\th)*th*1.0;
if(l>=0){
targetlayer.copyRect(0,0,templayer,0,l,tw,th-l);
targetlayer.copyRect(0,th-l,templayer,0,0,tw,l);
targetlayer.rotate=angle;
targetlayer.update();
}
else{
targetlayer.copyRect(0,0,templayer,0,th+l,tw,-l);
targetlayer.copyRect(0,-l,templayer,0,0,tw,th+l);
targetlayer.rotate=angle;
targetlayer.update();
}
if(canstop && l<0) System.removeContinuousHandler(handler);
if(time)
stopMove() if thistime>time/1000.0;
}
function stopMove(){
stoppingtime=System.getTickCount();
System.removeContinuousHandler(handler);
}
function resumeMove(){
if(stoppingtime!==void){
var now=System.getTickCount();
starttime+=now-stoppingtime;
last+=now-stoppingtime;
}
System.addContinuousHandler(handler);
}
function clearMove(){
System.removeContinuousHandler(handler);
if(newlayer && targetlayer!==void) invalidate targetlayer;
invalidate templayer if templayer!==void;
targetlayer=templayer=void;
}
function finalize(){
System.removeContinuousHandler(handler);
if(newlayer && targetlayer!==void) invalidate targetlayer;
invalidate templayer if templayer!==void;
targetlayer=templayer=void;
}
}
kag.addPlugin(global.picmover_object=new PicMover(kag));
@endscript
@endif
@macro name=picmover
@eval exp="global.picmover_object.startMove(mp)"
@endmacro
@macro name=stoppicmover
@eval exp="global.picmover_object.stopMove(mp)"
@endmacro
@macro name=resumepicmover
@eval exp="global.picmover_object.resumeMove(mp)"
@endmacro
@macro name=clearpicmover
@eval exp="global.picmover_object.clearMove(mp)"
@endmacro
@return