KCDDP ADV综合创作站 » 技术发布区 » [自动显示回收的日期栏]让我们做个举牌子的工作人员


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]]

页: [1]


Powered by Discuz! Archiver 5.5.0  © 2001-2006 Comsenz Inc.