2010-4-20 16:40
全局变量D
[自动显示回收的日期栏]让我们做个举牌子的工作人员
进入2010年懒散了N个月终于还是开始学着写插件了。
因为一直秉承着技术共享的原则,基本有写的东西带点难度的就共享。
……所以麻烦各位无聊人士行行好不要拆我做程序的游戏,你拆了也就是这么些内容……
AIN里就用到了类似这样的一个效果。
这个日期栏可以在任何时候默默的自动显示然后回收。就好像举个牌子路过上面写“X年X月X日”的NPC。
至于其间玩家是继续剧情,trans还是保存都不会影响到它的正常工作。
——当然没经过魔鬼级别的测试我也不知道有没有BUG。
[code]
@if exp="typeof(global.timeframe_object) == 'undefined'"
@iscript
//---------------------------------------------------------------------------------------
//自动显示回收的日期栏 by 全局变量D
//加工·修改自由
//转载请注明作者和出处
//---------------------------------------------------------------------------------------
//单个数字
class TimeNum
{
var fore;
var back;
var l;
var t;
//创建一个数字
function TimeNum(window,owner,n)
{
this.owner = owner;
this.window = window;
fore = new Layer(window, window.fore.base);
back = new Layer(window, window.back.base);
fore.hitType = htMask;
fore.hitThreshold = 256;
back.hitType = htMask;
back.hitThreshold = 256;
fore.loadImages("num-"+n); //读入单个数字图片,文件名为num-0到num-9
back.assignImages(fore);
fore.setSizeToImageSize();
back.setSizeToImageSize();
}
function finalize()
{
invalidate fore;
invalidate back;
}
//显示数字,设定数字和日期框的相对位置
function spawn(pos)
{
t=owner.top+47;
l=pos;
fore.setPos(l, t);
back.setPos(l, t); // 保证表里页面的位置同步
fore.visible = owner.foreVisible;
back.visible = owner.backVisible;
}
//可见效果(由plugin控制)
function resetVisibleState()
{
fore.visible = owner.foreVisible;
back.visible = owner.backVisible;
}
//刷新数字
function move()
{
t=owner.top+47; //数字的移动是跟随日期框的
fore.setPos(l, t);
back.setPos(l, t); // 保证表里页面的位置同步
}
//表里交换
function exchangeForeBack()
{
// trans时的表里页内容交换
var tmp = fore;
fore = back;
back = tmp;
}
}
//---------------------------------------------------------------------------------------
//日期栏
class TimeFrame
{
var fore;
var back;
var spawned = false;
var l;
var t;
//创建日期栏
function TimeFrame(window, owner)
{
this.owner = owner;
this.window = window;
fore = new Layer(window, window.fore.base);
back = new Layer(window, window.back.base);
fore.hitType = htMask;
fore.hitThreshold = 256;
back.hitType = htMask;
back.hitThreshold = 256;
fore.loadImages("时间栏-背景"); // 读入日期框背景图片
back.assignImages(fore);
fore.setSizeToImageSize();
back.setSizeToImageSize();
}
//删除日期栏
function finalize()
{
invalidate fore;
invalidate back;
}
//显示
function spawn()
{
l=owner.left;
t=owner.top;
spawned = true;
fore.setPos(l, t);
back.setPos(l, t);
fore.visible = owner.foreVisible;
back.visible = owner.backVisible;
}
//可见效果(由plugin控制)
function resetVisibleState()
{
// 表示?非表示の状態を再設定する
if(spawned)
{
fore.visible = owner.foreVisible;
back.visible = owner.backVisible;
}
else
{
fore.visible = false;
back.visible = false;
}
}
//移动效果
function move()
{
owner.top++;//向下移动
t=owner.top;
fore.setPos(l, t);
back.setPos(l, t);
}
function moveback()
{
owner.top--;//向上移动
t=owner.top;
fore.setPos(l, t);
back.setPos(l, t);
}
//表里交换
function exchangeForeBack()
{
var tmp = fore;
fore = back;
back = tmp;
}
}
//---------------------------------------------------------------------------------------
class TimeFramePlugin extends KAGPlugin
{
var dframe;
var nums=[];
var timer; // 计时器
var window;
var foreVisible = true;
var backVisible = true;
var left=500;//日期框左坐标
var top=-100;//日期框初始上坐标
var count=0;//计数器
var y;//年月日,用来保存日期框上的各具体数字
var m;
var d;
function TimeFramePlugin(window)
{
super.KAGPlugin();
this.window = window;
}
function finalize()
{
invalidate timer if timer !== void;
super.finalize(...);
}
function init(yy,mm,dd)
{
dframe=new TimeFrame(window, this); //创建日期框
//创建日期数字,并读入具体年月日数字
if (nums==void) nums=[];
nums[0]=new TimeNum(window,this,yy[0]);
nums[1]=new TimeNum(window,this,yy[1]);
nums[2]=new TimeNum(window,this,yy[2]);
nums[3]=new TimeNum(window,this,yy[3]);
nums[4]=new TimeNum(window,this,mm[0]);
nums[5]=new TimeNum(window,this,mm[1]);
nums[6]=new TimeNum(window,this,dd[0]);
nums[7]=new TimeNum(window,this,dd[1]);
//计时器的具体设定
timer = new Timer(onTimer, '');
timer.interval = 10;
timer.enabled = true;
foreVisible = true;
backVisible = true;
y=yy;
m=mm;
d=dd;
dframe.spawn();
//对年月日的显示位置进行设定,这里的left就是日期框的左坐标了
nums[0].spawn(left*1+40);
nums[1].spawn(left*1+60);
nums[2].spawn(left*1+80);
nums[3].spawn(left*1+100);
nums[4].spawn(left*1+150);
nums[5].spawn(left*1+170);
nums[6].spawn(left*1+220);
nums[7].spawn(left*1+240);
}
function uninit()
{
top=-100;
count=0;
timer=void;
dframe=void;
nums=void;
}
function onTimer()
{
if(timer == void) return; //当计时器被删除,什么都没发生
if (count>=700) {uninit();return;} //当日期框已经收回,处理掉它
if (count<100) dframe.move(); //向下移动阶段(显示)
if (count>=500 && count<700) dframe.moveback(); //向上移动阶段(收回)
for (var i=0;i<8;i++) nums[i].move();//所有数字跟着日期框移动
count++;
}
function resetVisibleState()
{
if (dframe==void) return;
dframe.resetVisibleState(); // resetVisibleState メソッドを呼び出す
for (var i=0;i<8;i++) nums[i].resetVisibleState();
}
function onStore(f, elm)
{
// 当保存时,记录日期框的状况
var dic = f.timeframes = %[];
dic.init = timer !== void;
dic.foreVisible = foreVisible;
dic.backVisible = backVisible;
dic.count=count;
dic.y=y;
dic.m=m;
dic.d=d;
dic.left=left;
dic.top=top;
}
function onRestore(f, clear, elm)
{
// 当读取时……
var dic = f.timeframes;
if(dic === void || !+dic.init)
{
uninit();
}
else if(dic !== void && +dic.init)
{
left=dic.left;
top=dic.top;
y=dic.y;
m=dic.m;
d=dic.d;
count=dic.count;
init(y,m,d,%[ forevisible : dic.foreVisible, backvisible : dic.backVisible ] );
}
}
function onCopyLayer(toback)
{
// レイヤの表←→裏情報のコピー
// このプラグインではコピーすべき情報は表示?非表示の情報だけ
if(toback)
{
// 表→裏
backVisible = foreVisible;
}
else
{
// 裏→表
foreVisible = backVisible;
}
resetVisibleState();
}
function onExchangeForeBack()
{
// 裏と表の管理情報を交換
if (dframe==void) return;
dframe.exchangeForeBack(); // exchangeForeBack メソッドを呼び出す
}
}
kag.addPlugin(global.timeframe_object = new TimeFramePlugin(kag));
@endscript
@endif
;-------------------------------------------------------------------------------------------
;★时间显示
;-------------------------------------------------------------------------------------------
[macro name=dateframe]
;显示日期框并设定年月日
@eval exp="timeframe_object.init(mp.year,mp.month,mp.day)"
;同步年月日到三个对应变数
@eval exp="f.year=mp.year"
@eval exp="f.month=mp.month"
@eval exp="f.day=mp.day"
[endmacro]
[return]
[/code]
其实所谓的tjs插件就是将几个类写到一起然后让其中一个类去管其他的类(喂你这样说谁看得懂啊!)。
所以这就是一个叫TimeFramePlugin的类,管着另外两个类做出一个能够自动显示和回收的日期框。
准备一张日期框图片和0-9的数字图片。
用@dataframe year="2010" month="04" day="20"调用。(年一定要4位,月日一定要2位,记得加引号)
假如你看得懂,位置可以随便调,这个是在右上角,落下来,等待几秒,然后收回去。
也可以调成从下到上或者从左到右,反正原理一样。
同时会自动改变f.year、f.month、f.day的内容。
参考下雨下雪插件做的,所以其实还可以扩展出一些其他的功能来……
看不懂的也不要问我怎么用……= =
[[i] 本帖最后由 全局变量D 于 2010-4-20 16:48 编辑 [/i]]