赞 0
VIP 0
好人卡 0
积分 1
经验 792
最后登录 2014-10-5
在线时间 24 小时
Lv1.梦旅人
梦石 0
星屑 50
在线时间 24 小时
注册时间 2012-2-14
帖子 9
本帖最后由 花晴兰 于 2012-2-14 06:43 编辑
http://sourceforge.net/projects/roost/
晴兰的帐号出现了一点问题,仅仅是为了负责,对Roost v1.8.rar进行hash,
MD5:A7FCA99303212CCF47D94A3F2EE915D5
SHA1:DC9C0C0A15523A1FBA43775F05F089C16CF2C060
1经验仅仅是统计用,也可以直接联系我来索取一份Roost v1.8
另外@凌童鞋 关于
http://rpg.blue/forum.php?mod=vi ... 6orderby%3Dlastpost
提到的仔细介绍,一并放在这个升级版里面了,
Roost是晴兰的一个原创或修改的脚本库,旨在RGSS惯例脚本语法上,尽量上改进脚本性能和增强脚本功能,
尤其是密集像素计算或者其他外部操作,工程中有详细测试和范例代码。
Roost根据协议选择外部组件,使脚本尽量能够被商业或者非商业应用,如果您的游戏使用了Roost作为开发基础之一,而且有可能被商业化,小女子将不胜荣幸,但是请注意阅读Roost和Roost关联组件的版权说明,Roost本身含有的非RPG Maker的dll是LGPL协议的,可选组件tcc是LGPL协议,OpenCV是BSD协议,如果需要修改代码重新发布,请仔细阅读协议文字,以避免任何可能的纠纷。
(快吐槽这种文风,话是这么说的,自己都认真得受不了了{:nm_9:} )
原创脚本说明:
Roost.CFactory: Roost.libTCC 已经改为Roost.CFactory以tcc作为C后端,而RGSS作为语法前端的一个工具,
出于tcc协议的尊重,是不能用tcc名字做宣传的,故已修改。
也就是说,写的是RGSS,生成的是C的代码并可以运行。它的前端是Ruby代码或者自定义程序代码(@某叔),推荐用Roost.PP兼容的预处理器进行处理。
Roost.PP 是使C语法向Ruby语法过渡的预处理器模板类,出于灵活性,尚需实现具体的预处理器,也就是说,描述的是如何把写的代码转换成C。Roost.CUtils.CPP1是一个具体的预处理代码,是一个低级的预处理器,如export{add}表示导出add符号,而不需要写麻烦的__declspec(dllexport) __stdcall add,实现见工程。
Roost.Static 是一个Cache模块,对应实现了类型Roost::Static::StaticClass。
有些素材,希望或者只能在游戏运行时生成,而且只生成一次,如游戏地图的小地图,或者游戏地图为基础的战斗背景,或者行走图或者战斗图为基础的战斗卡片。
或者为生成这种素材加速的DLL的源代码,可以放在Roost.Static里面,使得这种操作只进行一次。
Roost.Dynamic 和Roost.Dynamic.DynClass 使DLL的使用和Ruby无缝接触,尽量简化操作,至少简化了.call和参数说明,对于浮点类型和其他类型有待完善,下面是测试代码中的一段
class Wnd; end ;
SW_SHOW = 5
SW_HIDE = 0
xx=Roost::Dynamic::DynClass .new ( 'user32' ,
{ :__ctor => "CreateWindowExA" ,
:__dtor => "DestroyWindow"
} )
xx.attach ( Wnd) ;
#上面为定义
r = Wnd.new
r.dyncreate 0 , "Button" , "Hello" , 0x10cf0000, 0 , 0 , 640 , 480 , 0 , 0 , 0 , 0
r.ShowWindow SW_SHOW
r.MessageBoxA "Hello" ,Roost::CharConv .u2s ( "从子窗口获得的信息" , 128 ) , 16
r.ShowWindow SW_HIDE
r.dynuninit
class Wnd; end ;
SW_SHOW = 5
SW_HIDE = 0
xx=Roost::Dynamic::DynClass .new ( 'user32' ,
{ :__ctor => "CreateWindowExA" ,
:__dtor => "DestroyWindow"
} )
xx.attach ( Wnd) ;
#上面为定义
r = Wnd.new
r.dyncreate 0 , "Button" , "Hello" , 0x10cf0000, 0 , 0 , 640 , 480 , 0 , 0 , 0 , 0
r.ShowWindow SW_SHOW
r.MessageBoxA "Hello" ,Roost::CharConv .u2s ( "从子窗口获得的信息" , 128 ) , 16
r.ShowWindow SW_HIDE
r.dynuninit
而对应的C代码为:
#include <windows.h>
//链接user32.dll的代码
//上面为定义
HWND h = CreateWindowExA( 0 , "Button" , "Hello" , 0x10cf00000, 0 , 0 , 640 , 480 , 0 , 0 , 0 , 0 ) ;
ShowWindow( h, SW_SHOW) ;
MessageBox( h, "Hello" , "..." , 16 ) ;
ShowWindow( h, SW_HIDE) ;
DestroyWindow( h) ;
#include <windows.h>
//链接user32.dll的代码
//上面为定义
HWND h = CreateWindowExA( 0 , "Button" , "Hello" , 0x10cf00000, 0 , 0 , 640 , 480 , 0 , 0 , 0 , 0 ) ;
ShowWindow( h, SW_SHOW) ;
MessageBox( h, "Hello" , "..." , 16 ) ;
ShowWindow( h, SW_HIDE) ;
DestroyWindow( h) ;
和C代码是很相似的,如果您使用MFC,会发现另一种相似性,这里在下由于对MFC不大熟悉,所以不敢多言。
Roost::CUtils 是一组实用工具对象,在下会慢慢完善
其中RBMP.op2是一个试验中的位图变换函数:
用法:首先将rbmp关联到Bitmap类
xx=DynClass.new ( 'rbmp.rax' , {
:__ctor =>:getBitmap,
:__dtor =>:releaseBitmap,
} )
xx.attach ( Bitmap)
xx=DynClass.new ( 'rbmp.rax' , {
:__ctor =>:getBitmap,
:__dtor =>:releaseBitmap,
} )
xx.attach ( Bitmap)
假设(RMXP)(a,b是两个位图, 进行操作的如果是两个位图,暂时必须有相同的宽和高)
a,b =RPG::Cache .battler ( '001-Fighter01' , 0 ) , RPG::Cache .battler ( '001-Fighter01' , 0 )
#就可以
a.dyninit ; b.dyninit
a.op2 ( b, "ab+a=" , -1 ) #逆波兰式 a=a+b(仅仅是抛砖引玉
=begin
或者
a.op2(0, "aHa=", -1) # a=水平翻转(a)
a.op2(b, "aaHb&+a=", -1) # a=a+水平翻转(a) 位与 b
=end
b.dynuninit ; a.dynuninit
a,b =RPG::Cache .battler ( '001-Fighter01' , 0 ) , RPG::Cache .battler ( '001-Fighter01' , 0 )
#就可以
a.dyninit ; b.dyninit
a.op2 ( b, "ab+a=" , -1 ) #逆波兰式 a=a+b(仅仅是抛砖引玉
=begin
或者
a.op2(0, "aHa=", -1) # a=水平翻转(a)
a.op2(b, "aaHb&+a=", -1) # a=a+水平翻转(a) 位与 b
=end
b.dynuninit ; a.dynuninit
op2有很多限制,只能是相同的宽和高,只有1 个临时图片,所以说"a~b~"是会覆盖的,使用了逆波兰式,
(逆波兰式参考http://rpg.blue/thread-200922-1-1.html @DeathKing )
有限的操作:
a b r 参数1入栈 参数2入栈 上次的结果入栈
H V F ~ 分别是弹出栈顶一个元素 进行水平翻转,竖直翻转,H+V的翻转,取反,结果入栈
+ - & | ^ 分别是弹出栈顶二个元素 进行像素加,像素减,像素与,像素或,像素异或,结果入栈,ab-的结果是a-b
= 栈顶二个元素的复制,ab=的意思是b=a,请不要弄反了……
欢迎同好批评指正