【项目简介:自己正在制作游戏,于是在自己的游戏项目中衍生出了一个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在线咨询功能删除,谢谢。