| 赞 | 0 |
| VIP | |
| 好人卡 | |
| 积分 | 1 |
| 经验 | |
| 最后登录 | 2014-10-5 |
| 在线时间 | 24 小时 |
- 梦石
- 0
- 星屑
- 50
- 在线时间
- 24 小时
- 注册时间
- 2012-2-14
- 回帖
- 8
|
发表于 2012-2-14 04:40:40
|
显示全部楼层
本帖最后由 花晴兰 于 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和参数说明,对于浮点类型和其他类型有待完善,下面是测试代码中的一段
[pre lang="ruby" line="1"]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[/pre]
而对应的C代码为:
[pre lang="C" line="1"]
#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);[/pre]
和C代码是很相似的,如果您使用MFC,会发现另一种相似性,这里在下由于对MFC不大熟悉,所以不敢多言。
Roost::CUtils是一组实用工具对象,在下会慢慢完善
其中RBMP.op2是一个试验中的位图变换函数:
用法:首先将rbmp关联到Bitmap类
[pre lang="ruby" line="1"]xx=DynClass.new('rbmp.rax', {
:__ctor=>:getBitmap,
:__dtor=>:releaseBitmap,
})
xx.attach(Bitmap)
[/pre]
假设(RMXP)(a,b是两个位图, 进行操作的如果是两个位图,暂时必须有相同的宽和高)
[pre lang="ruby" line="1"]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
[/pre]
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,请不要弄反了……
欢迎同好批评指正 |
|