搜索附件  

官方框架外部实现.zip

 

【RMXP改造计划:开源】0x01模块化开发与多线程支持:
【项目简介:自己正在制作游戏,于是在自己的游戏项目中衍生出了一个RMXP的空壳框架思想,打算将这一部分开源分享。框架改造我们会一边进行一边发帖,目的是让大家了解我们的框架思想,并且鼓舞更多作者制作更多精彩的框架,更新不定期,不需要关注和塞糖】

1.模块化的开发,让mod成为可能

        模块化的开发,是增加工作效率和协同开发的好方案,为了实现模块化开发,我们引入一个Import类,我们可以亲切的称呼Import对象为“加载器”,每一个“加载器”都是一个域,倘若两个“加载器”互相独立,则里面的环境也自然互相独立。所以有了这个想法之后,那么这个想法的行为可以用伪代码描述为:        
       loader = Import.new(根目录名,  扩展名)        
        这里描述了“加载器”的创建,loader和loader2虽然都是加载器,但是他们提供给代码运行的域是不同的,所以对于一般的开发,我们通常只需要一个域,则我们只需要复用一个加载器就好了。
        让“加载器”加载代码,我们设想了三种方案:1,export曝出到全局   2,open自我曝出,get全局接收  3,run无视曝出规则直接运行,曝出最后一条语句返回值。我们用伪代码来诠释三种方案。

        ⚪export方案
        # 这个文件我们视为    mod.ruby
       def foo
              p "这里是mod"
       end

       # 这里是主程序
        loader.load("mod.ruby")
       f = loader.export
       f.foo    # 输出    这里是mod  


        ⚪open/get方案
        # 这个文件我们视为    mod.ruby
       f  = Proc.new{
              p "这里是mod"
       }
      open(f)

       # 这里是主程序
        loader.load("mod.ruby")
       f = loader.get
       f.call    # 输出    这里是mod


        ⚪run方案
        # 这个文件我们视为    mod.ruby
              p "这里是mod"

       # 这里是主程序
        loader.load("mod.ruby")
       f.run   # 输出    这里是mod  
        介于这一种模块化思想,我们做了一个简单的Import类,完成了上面的规则方案。
class Import
  #--------------------------------------------------------------------------
  # ● 初始化
  #     dir      : 根目录
  #     ext      : 扩展名
  #--------------------------------------------------------------------------
  def initialize(dir="scripts/", ext=".ruby")
    @hashKey = 0
    @data = nil
    @dir = dir
    @ext = ext
  end
  #--------------------------------------------------------------------------
  # ● 载入
  #     filename : 文件名
  #--------------------------------------------------------------------------
  def load(filename)
    @data = nil
    @str = ""
      File.open(@dir + filename + @ext, 'r') { |file|
        file.each_line { |line|
          @str = @str+line+"\n"
        }
      }
    end
  #--------------------------------------------------------------------------
  # ● 模块化导出
  #--------------------------------------------------------------------------
   def export
     @str = "class Export"+ @hashKey.to_s + " \n" + @str +"end\n"
     @str =  @str + "Export" + @hashKey.to_s + ".new"
     @hashKey = @hashKey + 1
   end
  #--------------------------------------------------------------------------
  # ● 运行载入的文件
  #--------------------------------------------------------------------------
   def run
     return eval(@str)
   end
  #--------------------------------------------------------------------------
  # ● (内核函数)自我导出
  #-------------------------------------------------------------------------
   def open(param)
     @data = param
   end
  #--------------------------------------------------------------------------
  # ● 获取自我导出数据
  #-------------------------------------------------------------------------
   def get
     if @data == nil
       eval(@str)
     end
     return @data
   end
end


        这个类是很简单一个基础实现,喜欢动手的开发者可以丰富这个模块,定义出自己的模块化规则。基于该类,我们把RM的官方构架搬到了外部,只是做一个实验,有兴趣可以下载尝试



2.多线程,让RM效率提升
一个线程,就是一个世界,两边的人独立的或者,他们,一同改变RM这个大世界... ...
我们中二的定义一个类,叫做“World”,由它产生的对象,都是一个“次世界”,我们将主世界的一些事情移交到次世界去执行,让我们的主世界安心的渲染游戏... ...
       # 这里是伪代码
        world = World.new
    task = Proc.new{
         p "这是被主世界抛弃的任务"
    }
    world.join(task)
         基于想法,我们粗糙的实现了一个“世界类”。

class World
  #--------------------------------------------------------------------------
  # ● 初始化
  #--------------------------------------------------------------------------
  def initialize
    @proc = []
    @thread = Thread.new {
      loop do
        proc = @proc.shift
        if proc
          proc.call()
        end
      end
    }
  end
  #--------------------------------------------------------------------------
  # ● 初始化
  #     proc     : 作用函数,类或Proc对象
  #--------------------------------------------------------------------------
  def join(proc)
    @proc.push(proc)
  end
  #--------------------------------------------------------------------------
  # ● 获取线程
  #--------------------------------------------------------------------------
  def getThread
    return @thread
  end
  #--------------------------------------------------------------------------
  # ● 队列是否有任务
  #--------------------------------------------------------------------------
  def task?
    return @proc.length
  end
  #--------------------------------------------------------------------------
  # ● 退出
  #--------------------------------------------------------------------------
  def exit
    @thread.exit
  end
end
















            本帖来自P1论坛作者antilmid,因Project1站服务器在国外有时候访问缓慢不方便作者交流学习,经联系P1站长fux2同意署名转载一起分享游戏制作经验,共同为国内独立游戏作者共同创造良好交流环境,原文地址:https://rpg.blue/forum.php?mod=viewthread&tid=477493  若有侵权,发帖作者可联系底部站长QQ在线咨询功能删除,谢谢。
Loading...

QQ|Archiver|手机版|小黑屋|同能RPG制作大师 ( 沪ICP备12027754号-3 )

GMT+8, 2024-11-22 08:56 , Processed in 0.050988 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

返回顶部