查看: 69|回复: 0

[转载发布] 【RMXP改造计划:开源】0x01模块化开发与多线程支持

[复制链接]
  • TA的每日心情
    开心
    5 天前
  • 签到天数: 33 天

    连续签到: 1 天

    [LV.5]常住居民I

    2022

    主题

    32

    回帖

    7144

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    VIP
    0
    卡币
    5074
    OK点
    16
    积分
    7144
    发表于 同元一千年八月八日(秋) | 显示全部楼层 |阅读模式
    【项目简介:自己正在制作游戏,于是在自己的游戏项目中衍生出了一个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在线咨询功能删除,谢谢。

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x
    天天去同能,天天有童年!
    回复 论坛版权

    使用道具 举报

    ahome_bigavatar:guest
    ahome_bigavatar:welcomelogin
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

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

    GMT+8, 2024-5-3 05:23 , Processed in 0.050363 second(s), 44 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

    快速回复 返回顶部 返回列表