永恒的灌水帝吧 关注:589贴子:1,694

[模版]线性存储结构+id回收机制

只看楼主收藏回复

模板,可用于制作各种单计时器循环操作数据的系统.
比如中心计时器,单计时器弹幕等.
比传统处理方法的优点是:
1, 回收数据不需要大量操作. (单一线性存储回收时, 需要设置每个数据变量的值)
2, 回收数据不会对其他数据的id造成影响 (用单一线性存储来循环的话, 你无法保证在循环期间的id不变, 因为删除id会使最后一个id的位置变化) 于是你可以在循环期间使用id来对数据做一定的改变
library DateTemplate initializer onInit
  #define TIMER_TIMEOUT=0.03 //计时器的循环时间
  private integer array Data_Index
  private integer array Index
private integer CreateDataId(){
  if(Data_Index[++Data_Index[0]]==0){return Data_Index[0]}
  return Data_Index[Data_Index[0]]
}
private nothing DestroyDataId(integer id){
  //TODO: 将清理以id索引数据的代码写在这里
  Data_Index[Data_Index[0]--]=id
}
private nothing DeleteId(integer id){
  DestroyDataId(Index[id])
  Index[id]=Index[Index[0]--]
}
private integer NewId(){
  Index[++Index[0]]=CreateDataId()
  return Index[Index[0]]
}
//新建一个数据存储项
public integer New(){//TODO:修改自己的参数列表
  integer id=NewId()
  //TODO: 使用id作为变量组索引来存储数据
  return id //此id在循环期间不会发生变化,
}
private nothing update(){
  integer id
  integer i=Index[0]
  loop{exitwhen i<=0;set id=Index[i]
    //TODO:在此使用id作为变量组索引来操作数据
    //TODO:在达到删除条件时使用 DeleteId(i) 来删除
  --i}
}
private nothing onInit(){
  TimerStart(CreateTimer(),TIMER_TIMEOUT,true,function update)
}
endlibrary


1楼2012-05-06 09:51回复
    存储意向


    2楼2012-05-06 09:51
    回复
      @najizhimo 快精0.0


      3楼2012-05-06 09:59
      回复
        什么玩意!!!!哥哥我看不懂


        IP属地:广东4楼2012-05-06 12:04
        回复
          在TODO的地方写上自己的动作就可以


          6楼2012-05-06 12:58
          回复
            :<


            7楼2012-05-06 13:01
            回复
              请用纯J编写,么么哒


              IP属地:广东8楼2012-05-06 13:03
              回复
                :<
                library DateTemplate initializer onInit
                globals
                  constant private real TIMER_TIMEOUT=0.03 //计时器的循环时间
                  private integer array Data_Index
                  private integer array Index
                endglobals
                private function CreateDataId takes nothing returns integer
                  set Data_Index[0]=Data_Index[0]+1
                  if(Data_Index[Data_Index[0]]==0)then
                    return Data_Index[0]
                  endif
                  return Data_Index[Data_Index[0]]
                endfunction
                private function DestroyDataId takes integer id returns nothing
                  //TODO: 将清理以id索引数据的代码写在这里
                  set Data_Index[Data_Index[0]]=id
                  set Data_Index[0]=Data_Index[0]-1
                endfunction
                private function DeleteId takes integer id returns nothing
                  set DestroyDataId(Index[id])
                  set Index[id]=Index[Index[0]]
                  set Index[0]=Index[0]-1
                endfunction
                private function NewId takes nothing returns integer
                  set Index[0]=Index[0]+1
                  set Index[Index[0]]=CreateDataId()
                  return Index[Index[0]]
                endfunction
                //新建一个数据存储项
                public function New takes nothing returns integer//TODO:修改自己的参数列表
                  local integer id=NewId()
                  //TODO: 使用id作为变量组索引来存储数据
                  return id //此id在循环期间不会发生变化,
                endfunction
                private function update takes nothing returns nothing
                  local integer id
                  local integer i=Index[0]
                  loop
                    exitwhen i<=0
                    set id=Index[i]
                    //TODO:在此使用id作为变量组索引来操作数据
                    //TODO:在达到删除条件时使用 DeleteId(i) 来删除
                    set i=i-1
                  endloop
                endfunction
                private function onInit takes nothing returns nothing
                  call TimerStart(CreateTimer(),TIMER_TIMEOUT,true,function update)
                endfunction
                endlibrary


                9楼2012-05-06 13:13
                回复
                  虽然看不懂,但看在卖萌的份上加个精


                  IP属地:广东10楼2012-05-06 13:14
                  回复
                    才没有卖萌!


                    11楼2012-05-06 13:15
                    回复
                      又卖萌了


                      IP属地:广东12楼2012-05-06 13:21
                      回复


                        13楼2012-05-06 13:23
                        回复
                          什么是传统方法
                          这悲剧的代码,数组的第一位就是指针吧,为什么不单独用一个变量,数组的溢出也没做检查


                          IP属地:广东14楼2012-05-07 20:15
                          回复
                            0.0就是naji发的那个T的多人使用击退.
                            溢出不检查, 就不检查, 气死你


                            15楼2012-05-07 20:36
                            收起回复