在RM中使用gem和bundle

2014 年 8 月 26 日

其实很多东西跟普通ruby使用gem和bundle是一样的,但是RM没有自带rubygems,因此有两种思路,一种是给RM嵌入一个rubygems,一种是利用另一个Ruby(也就是实际运行bundle的ruby.exe等)来发现require需要的文件和依赖关系。

下面以第二种思路为例,例子任务是使用iniparse这个gem来帮助RM里面读Game.ini。

注意:RPGMaker系列本身不支持载入.so文件,因此能用到的gems只能是纯Ruby形式的源文件组成的代码,这个文章与这个限制无关,也无意绕过这个限制。只是提供了另一种管理脚本插件的思路:借用rubygems。产生的gem目录也可以最后放在加密的rgssad(rgss2a/rgss3a)文件里面并用某种手段当做本地目录读出来,从而保证了加密保护游戏程序的语义,当然这里也不讨论对gem目录的加密和解包具体方法。

1. 首先像正常使用bundle一样在Game.exe目录下建立一个gemfile:

2. 用bundle在工程目录安装所需的gems:

用cmd在工程目录下运行下列代码。

3. 在RM的脚本编辑器中插入一段辅助代码,让require可以自动去找到我们指定的gem:

 

4. 这个时候在脚本编辑器之后可以插入使用的代码了,这里我们用的是RGSS3(RPG Maker VX Ace)的代码例子:

5. 最后,运行的方式是在cmd下运行下列代码,你也可以建立快捷方式:

 

RGSS3Facets 0.02

2014 年 2 月 23 日

0.02

Class:
#基于类的通用cache系统,比如
x = Bitmap.cache(“Graphics/Parallaxes/Mountain4”) #你懂的
y = Bitmap.cache(“Graphics/Parallaxes/Mountain4”)
# x.object_id == y.object_id应该成立,同一个位图
#Bitmap.clear_cache #你懂的
#也可以是自定义对象
class A
def initialize(a, b)
@a, @b = a, b
end
end
x = A.cache(3, 5)
y = A.cache(3, 5)
#应该是同一个对象

# RGSS3Facets::CachePolicy 奇怪的东西:
Bitmap.cache_policy = RGSS3Facets::CachePolicy::Default #Cache在内存中,以Hash的形式记录,类似于默认脚本的Cache或者RPG::Cache
Bitmap.cache_policy = RGSS3Facets::CachePolicy::Marshal.new(Bitmap) #Cache不是在内存中而是以Marshal形式存到磁盘上
Bitmap.cache_policy = RGSS3Facets::CachePolicy::BareMarshal.new(Bitmap) #Cache不是在内存中而是以Marshal形式存到磁盘上,而且没有Marshal头,仅仅是直接调用了_dump和_load

Bitmap:
#Bitmap::MarshalPolicy bitmap的marshal方案可以是
Bitmap::MarshalPolicy = Bitmap::BitmapMarshalPolicy::Raw # [width, height, data].pack(“LLa*”)
Bitmap::MarshalPolicy = Bitmap::BitmapMarshalPolicy::RawCompress # [width, height, Zlib::Deflate.deflate(data)].pack(“LLa*”)
Bitmap::MarshalPolicy = Bitmap::BitmapMarshalPolicy::BitmapFile # Marshal内容相当于savebmp做的,也就是一个合法的bmp文件内容

Object:
load_script(name) #也就是eval read_data(name), TOPLEVEL_BINDING, “Load Script: #{name}”, 1

0.01

Object:
font.assign(:size=>5, :color=>Color.new(255,0,0,255)) # font.size=5; font.color = Color.new(255,0,0,255)
object.self # 返回本身,为了某些场合可以用&:self
object.deepcopy #=>某种深拷贝,也就是Marshal.load Marshal.dump object
object.template(“{{a}}, {{b}}”)#=>模板替换,也就相当于是”#{obj.a},#{obj.b}”,但模板内容可以是变量。
私有:
read_data(“Data/1.txt”) #=>读取Data/1.txt的内容,可以是加密包中的内容
write_data(“Data/1.txt”, “Hello”)#=>把Hello写到Data/1.txt,只能是磁盘上的,不会变更加密包
sugar(/\b类\b/){“class”} #=>宏替换,$RGSS_SCRIPTS.each{|x| x[3].gsub!(/\b类\b/){“class”}}
with(obj){}#=>obj.instance_eval{}
a = 5
ref{}[“a”]=3
a = ref{}[“a”]#=> 上下文变量的字符引用

Module:
Sprite_Base.each_object{|x| p x}#遍历Sprite_Base的实例
Vocab.each_constant{|value, name| p value, name}#遍历常量,以值和名的形式
MyModule.to_class #生成一个include了本模块的类(可以new了)
attr_constant :a, 5# 相当于def a(); 5; end

Proc:
lambda{|x| a}.call(a,b,c)可以写成lambda{|x| a}.update(a,b,c) lambda{|x| a}.fire(a,b,c)随便什么方法名都行
用method_missing实现的,不一定是call了

Range:
(1..5).clamp(a) # 如果a<1返回1 如果a>5返回5 否则返回a

Rect:
rect.each_slice(5, 5) do |r| … end # 将这个rect均匀分成5×5的部分,每一部分调用一下迭代器

Exception:
ex.raise # reraise ex
ex.translate(新的消息) # 返回一个和ex只有消息不同的异常对象,也就是ex.exception的别名

IO:
IO.binread(“1.txt”) #二进制读取1.txt
IO.binwrite(“1.txt”, “Hello”)#二进制写入1.txt

Symbol:
to_proc(这个功能VA本来就有)

String:
self.note.match_notes “<itemid = {{item}}>”, “<skillid = {{skill}}>”#如果self.note是一个”<itemid = 5> <skillid = 3>”的话,返回一个hash {“item”=>5, “skill”=>3}

Bitmap:
bitmap.repeat_blt(bitmap.rect, another_bitmap, another_bitmap.rect)#尽可能平铺绘制another_bitmap的rect部分的内容
bitmap.address:位图地址
bitmap.savebmp(“1.bmp”): 以bmp格式保存为1.bmp
bitmap.savepng(“1.png”):以png格式保存为1.png
bitmap.getBitmap(rect) : 返回rect部分构成的新位图
bitmap.split(:A=>[0,0,128,128], :B=>[0,128,128,128]):返回一个hash,其中hash[:A]= bitmap.getBitmap(Rect.new(0,0,128,128)),类推
bitmap.with_tone!(tone)
bitmap.with_tone(tone) #用指定的色调tone来处理本位图

(下面是还在测试和修正的内容)
Sprite:
sprite.image #返回sprite能看到的图形,没有考虑tone,wave系列,考虑了src_rect
Plane:
plane.image #返回plane能看到的图形,没有考虑tone,考虑了屏幕大小和循环的情况

 

 

[RGSS]RGStorage 1.00

2013 年 12 月 16 日

介绍

RGStorage实现了一个通用的存储类,统一接口,可以从以下实际或虚拟文件系统来读写文件资料

并可以通过可选的扩展来读写

同时在以上的基础上重定义了require方法,也可以混入Object,使它能像普通的Ruby的require一样工作,但不局限于require具体文件,比如:

基本用法:

把一个类似于文件路径的字符串叫做资源标识符(resource identifier, rsrc_id)。

因为可以通过RGStorage::Active来重新设定关联,以下的用法的举例与默认关联有关。

1.RGStorage.get rsrc_id

取得资源的内容

2. RGStorage.set rsrc_id, content

设置资源的内容

3. RGStorage.copyTo rsrc_id1, rsrc_id2

复制资源内容,相当于RGStorage.set(rsrc_id2, RGStorage.get(rsrc_id1))

基本设置:

默认设置是:

其中每一个设置的格式为,

[ 匹配条件, 文件系统, 转换器1, 转换器2, 转换器3,…]

匹配条件可以是正则表达式,范围,或者一个接受一个参数返回真假值的lambda/proc

文件系统是RGFileSystem类的实例,或者实现了get/set方法的对象,如果可以get/set一个rsrc_id,那么get/set的调用将返回一个lambda{|rsrc|}(get)或者lambda{|rsrc, content|}(set),否则应该返回nil,这是用来测试一个文件是否可读/可写

转换器也是实现了get/set方法的对象,或者RGFormatter类的实例,但get/set直接返回转换结果,比如MarshalFormatter的get方法是对输入(记为input)返回Marshal.load(input)的结果, 而set刚好相反。

 

RGSSType alpha 0.1

2013 年 11 月 27 日

一个用于直接在RGSS3的位图上写文字的类,

不经过bitmap.draw_text,而是直接写像素,

就算RGSS3启动时没有安装字体,安装字体之后使用RGSSType.new仍然有用

这个版本只实现了一个简单的写字体方法,而且并没有作为Bitmap的方法被定义

用法:

RGSSType#font

返回RGSSType使用的Font对象,可以设置他的字型字号颜色等, 文字轮廓阴影暂时不支持。

RGSSType#writetext(bitmap, string, x, y, color[, height])

在bitmap上,从(x, y)开始书写文字string, height

 

SAFX进展报告(updating)

2013 年 11 月 23 日

2013/11/13 13:55

下一步:

 

目前的进展的例子:http://codepad.org/VFmwq4jp

基本约定:所有这种返回字符串用来eval的函数叫usefunc

编译为DLL之后,RGSS中写一行use “1.dll”就行了
或者严格点use “1.dll”, “imported”
use DLL名, usefunc名(缺省是imported)
之所以叫imported是因为你可以用它仅仅是导入同dll的所有其他函数等等:

C 代码复制打印
  1. USEFUNC(math);
  2. USEFUNC(color);
  3. USEFUNC(imported){
  4.    this_is_a_usefunc;
  5.     use(“math”);
  6.     use(“color”);
  7.    end_usefunc;
  8. }
  1. module(A)
  2.           def(“self.add”, add)
  3.           def(“self.sub”, sub)
  4.           defva(“self.sum”, sum)
  5. end

的例子解释

Ruby里面直接用
A.add(3,5) A.sub(4, 6) A.sum(1,2,3,4,5,6,7,8,9,10)等来调用

上面defva的意思是自动打包不定参数(所有类型def的打包方式定义在safx.h里面,(白字:不是stdafx.h))