Project1

标题: 【RGM】RGModern 1.0.4 - RMXP新runtime [打印本页]

作者: guoxiaomi    时间: 2023-4-4 20:48
标题: 【RGM】RGModern 1.0.4 - RMXP新runtime
本帖最后由 guoxiaomi 于 2023-6-8 00:42 编辑

RGModern 1.0.4 已发布

RGM 目前有2位贡献者,我和本贴6楼的 kirh_036。

项目已开源,github仓库地址:https://github.com/gxm11/RGModern

在线文档:RGModern使用指南,文档编辑中……

以下照搬 Github 仓库的 Readme。

简介

RGModern 是极具现代化特色的 RMXP 新 runtime,主要使用 C++20 和 Ruby 3 编写。

RGModern 特点:
1. 对 RGSS 功能的几乎 100% 覆盖,并提供了一些额外的实用功能;
2. 使用各种优化技巧提升执行效率,画面流畅,性能强劲;
3. 使用 SDL2 作为底层,支持 Direct3D9,Direct3D11 和 OpenGL 绘制;
4. 驱动多个 worker 完成脚本逻辑、画面渲染等任务。worker 以多线程或者协程的方式合作;
5. 借助 C++ 元编程,RGModern 能自由配置每个 worker 的功能模块,利于二次开发。

编译

游戏制作者请下载:RGM小助手,并按照以下步骤操作:
1. 更新编译环境 1 次;
2. 更新 RGModern 1 次;
3. 选择合适的编译、链接选项,开始编译;
4. 打开产物所在目录。

注意:
1. 第一次使用请更新 2 次编译环境并更新 2 次 RGModern;
2. 小助手自带的 RGModern 仓库安装在 ./msys64/opt/RGModern 下;
3. 选择 Data 文件夹将制作加密包,选择后将强制使用普通模式。

二次开发者请查阅使用指南和 Makefile,或参考 Github Actions 的设置。

使用

在 Windows 上使用必须安装 DirectX 最终用户运行时

直接使用 Game.exe 代替原版的 Game.exe 即可。大多数脚本都会兼容,如果出现不兼容的情况或者其他运行时报错,请查看 error.log 尝试排查错误。

如果出现 RGModern Internal Error 或其他复杂问题,请提出 Issue。如果不方便使用 Issue,可以在此文档反馈需求和缺陷:RGModern用户反馈,当然直接回帖也是OK的~

如果要修改 RGModern 的功能或进行二次开发,可以用开发者模式编译的 main.exe,此 exe 需要读取当前路径下的 src/script 文件夹中的 ruby 脚本运行,可以修改这些脚本文件自定义对 RGSS 的实现。

config.ini

RGModern 在运行时会读取 config.ini 中的配置信息。如果 config.ini 不存在,RGModern 会产生一份新的配置文件,但是可能部分配置项未能正确读取。建议分发游戏时始终携带 config.ini。

config.ini 中有以下几个 section:
1. Game,配置游戏标题和 RTP 路径;
2. System,配置游戏的显示(分辨率、全屏等)和音乐选项;
3. Keymap,配置键盘(或控制器)按键与游戏内的虚拟按键的映射关系;
4. Font,配置游戏中使用的字体名和字体文件路径的映射关系;
5. Kernel,配置渲染器、协作模式等高级选项。

加密

RGModern 支持加密图片素材。

首先需要制作加密包。使用 7-zip 软件打包 Graphics 文件夹并设置密码即可。注意,打包后的 zip 文件中需要包含 Graphics 目录。

在游戏开始加载图片素材前调用:
  1. Finder.regist("Graphics.zip", "password")
复制代码

其中第一个参数是加密包的文件名,第二个参数是加密包的密码。此后就会优先从加密包中读取资源,如果加密包中没有资源,则会从游戏目录和 RTP 中寻找。

RGModern 不支持加密音乐素材。

RGModern 支持加密 Data 文件夹。如果使用 RGM 小助手编译,选择对应的 Data 文件夹即可。不使用小助手请参照 Makefile 中 Gamew.exe 的编译。

RGModern 不支持原版的加密方案。众所周知,原版加密方案等同于没有加密。RGModern 未来也不会支持原版的加密方案。

设计

src/main.hpp 所示,引擎本身是一个由多个 worker 组合而成的 scheduler,每个 worker 管理各自的数据并执行不同的任务,scheduler 负责 worker 之间的任务转发和运行调度。

具体运作原理请查看 src 内的 c++ 源码。RGModern 的代码使用 gcc13 在 -Wall -Wextra -Werror 的选项下编译通过,代码质量有保障,附带详细的 Doxygen 风格的注释,可放心查看。

范例

点击下载 完整测试工程,或https下载

范例里的各个exe都支持win10 64位及以上版本,其中后缀带 _win7 的原则上可以在 win7 上运行,并且你需要安装DirectX 最终用户运行时

工程内部的Game.exe可以代替原版Game.exe使用,Gamew.exe则内嵌了加密的Data文件夹,用来测试数据加密的效果。

执行main.exe会读取src/里的脚本并执行 load.rb,可以从这里查看RGM是如何实现RGSS的各个内部模块和类的,相应的cpp代码也可以作为参考,注释详细,相对好懂。

src里的scripts文件夹已经内嵌于Game.exe和Gamew.exe里了,所以这两个exe的执行不依赖外面的src文件夹。

Graphics.zip的密码是123,可以在范例的箱子事件测试读取加密图片的效果。测试工程中还提供了输入法、分辨率扩展等额外功能,以及单元测试等。

希望大家能帮忙测试一下 RGModern 的效果,提提建议。大部分脚本应该能兼容(涉及到调用外部32位的dll,魔改原版dll和操作Bitmap内容的旧脚本肯定不兼容)。

感谢各位坛友的支持!
作者: miantouchi    时间: 2023-4-4 21:00
本帖最后由 miantouchi 于 2023-4-4 21:11 编辑

这款runtime大致方向是实现哪些功能?  双击报错!!!

QQ截图20230404211053.png (9.36 KB, 下载次数: 52)

QQ截图20230404211053.png

作者: b565185756    时间: 2023-4-4 21:01
第一!非常强悍!世界最强的神中神——加菲猫!!!
作者: guoxiaomi    时间: 2023-4-5 10:43
大家有哪些常见、重要但是不兼容的功能也可以提出来,我这边看看能不能出替代方案,尽可能帮助老旧工程的移植。

比如画面截图有Bitmap#captue_screen,在范例中就已经展示了
作者: Admenri    时间: 2023-4-5 11:20
前来祝贺发布
作者: kirh_036    时间: 2023-4-5 16:15
也许该抓个热血年轻人来写个炫酷demo(?
作者: kirh_036    时间: 2023-4-5 16:17
kirh_036 发表于 2023-4-5 16:15
也许该抓个热血年轻人来写个炫酷demo(?

比如RGD的演示里,还原the world特效就很酷,给我印象很深
作者: guoxiaomi    时间: 2023-4-5 16:54
kirh_036 发表于 2023-4-5 16:15
也许该抓个热血年轻人来写个炫酷demo(?

得想个点子展示一下RGM的优势,酒香也怕巷子深>_<

我觉得RGM最大的优势就是高性能,ruby3+d3d11+异步模式应该是所有runtime中性能最高的了。要不咱做个弹幕游戏演示一下,正好xbox手柄已经适配了,可以做个边移动边开火的>_<

另一个优势就是扩展性了,我尽可能把内核代码写到了ruby层,并且ruby层跟c++部分尽可能脱耦,很适合魔改内核>_<

但感觉用XP的开发者更关心编辑器上的限制,对runtime的性能和扩展性不是那么关注>_<
作者: guoxiaomi    时间: 2023-4-5 18:26
本帖最后由 guoxiaomi 于 2023-4-5 18:44 编辑

@soulsaga 如果RGM支持某种特定格式的加密包,就意味着RGM内置了这种加密包的解密算法。RGM还是个开源软件,那么稍作修改就可以当解包器用了。

最好的方案是加密算法的作者提供一个包含了解密算法的DLL,RGM在运行时读取这个DLL里的函数对rgssad文件进行解密。不过这还直接方便了攻击者,只需要写个程序加载DLL中的相应函数就可以直接解密了。主要是因为一些旧的加密算法不是靠密钥加密,而是靠算法保密。当然密钥也好不到哪去,毕竟总会加载到内存的某个位置。

或者,让加密算法的作者fork一个不公开的分支,把解密算法写入RGM,自行发布支持特定格式的RGM。

经过了综合的考虑,RGM决定不管解密其他格式的加密包这件事,只支持自己的加密格式。此格式本质上就是压缩成zip时添加一个长密码,攻击者必须在Game.exe里找到密码,否则无法破解。

如果能找到游戏的原作者,可以让他发布一个RGM格式的加密版。正式发布时,我会提供一个图形化界面的程序供开发者制作加密包,点几下就可以了。
作者: 纯属小虫    时间: 2023-4-6 11:53
本帖最后由 纯属小虫 于 2023-4-6 12:28 编辑

好丝滑的60FPS

还没有移植老工程,但老工程几乎都是40FPS基础上制作的,


不过想来想去,好像也没有什么办法能让老工程也享受到高性能直接带来的不一样(除非在原作地图尺寸大的地方或者会掉帧的场景里),当然,也许是我的老工程里的一些内容在性能上过于保守了的原因吧!

另外,没接触过runtime的我,再默默问一个比较呆的问题:
老工程的具体移植方式是什么 O.o
作者: 张咚咚    时间: 2023-4-6 21:54
虽然不常用XP,但还是顶一下
作者: soulsaga    时间: 2023-4-6 22:32
菜刀提过改60FPS会影响到原本按40FPS的触发机制
例如计时器之类会出错?
作者: 契约师Vi    时间: 2023-4-6 22:45
本帖最后由 契约师Vi 于 2023-4-6 23:28 编辑

这个分辨率的黑边,希望能解决
RUBY 代码复制
  1. #==============================================================================
  2. # 本脚本来自[url]www.66RPG.com[/url],使用和转载请保留此信息
  3. #==============================================================================
  4.  
  5. # ————————————————————————————————————
  6.  
  7. # ▼▲▼ XRXS_BP 1. CP制導入 ver..23 ▼▲▼
  8. # by 桜雅 在土, 和希
  9.  
  10. #==============================================================================
  11. # □ カスタマイズポイント
  12. #==============================================================================
  13. module XRXS_BP1
  14. #
  15. # 对齐方式。0:左 1:中央 2:右
  16. #
  17. ALIGN =0
  18. #
  19. # 人数
  20. #
  21. MAX = 4
  22. end
  23. class Scene_Battle_CP
  24. #
  25. # 战斗速度
  26. #
  27. BATTLE_SPEED = 2.0
  28. #
  29. # 战斗开始的时候气槽百分比
  30. #
  31. START_CP_PERCENT = 100
  32. end
  33.  
  34. class Scene_Battle
  35.  
  36. # 效果音效,可以自己添加
  37. DATA_SYSTEM_COMMAND_UP_SE = ""
  38.  
  39. # 各项数值功能消耗的CP值
  40. CP_COST_BASIC_ACTIONS = 0 # 基础共同
  41. CP_COST_SKILL_ACTION = 65535 # 技能
  42. CP_COST_ITEM_ACTION = 65535 # 物品
  43. CP_COST_BASIC_ATTACK = 65535 # 攻撃
  44. CP_COST_BASIC_GUARD = 32768 # 防御
  45. CP_COST_BASIC_NOTHING = 65535 # 不做任何事情
  46. CP_COST_BASIC_ESCAPE = 65535 # 逃跑
  47. end
  48.  
  49. #==============================================================================
  50. # --- XRXS.コマンドウィンドウ?コマンド追加機構 ---
  51. #------------------------------------------------------------------------------
  52. # Window_Commandクラスに add_command メソッドを追加します。
  53. #==============================================================================
  54. module XRXS_Window_Command_Add_Command
  55. #--------------------------------------------------------------------------
  56. # ○ コマンドを追加
  57. #--------------------------------------------------------------------------
  58. def add_command(command)
  59. # 初期化されていない場合、無効化判別用の配列 @disabled の初期化
  60. #
  61. if @disabled == nil
  62. @disabled = []
  63. end
  64. if @commands.size != @disabled.size
  65. for i in 0...@commands.size
  66. @disabled[i] = false
  67. end
  68. end
  69. #
  70. # 追加
  71. #
  72. @commands.push(command)
  73. @disabled.push(false)
  74. @item_max = @commands.size
  75. self.y -= 32
  76. self.height += 32
  77. self.contents.dispose
  78. self.contents = nil
  79. self.contents = Bitmap.new(self.width - 32, @item_max * 32)
  80. refresh
  81. for i in 0...@commands.size
  82. if @disabled[i]
  83. disable_item(i)
  84. end
  85. end
  86. end
  87. #--------------------------------------------------------------------------
  88. # ○ 項目の無効化
  89. # index : 項目番号
  90. #--------------------------------------------------------------------------
  91. def disable_item(index)
  92. if @disabled == nil
  93. @disabled = []
  94. end
  95. @disabled[index] = true
  96. draw_item(index, disabled_color)
  97. end
  98. end
  99. class Window_Command < Window_Selectable
  100. #--------------------------------------------------------------------------
  101. # ○ インクルード
  102. #--------------------------------------------------------------------------
  103. include XRXS_Window_Command_Add_Command
  104. #--------------------------------------------------------------------------
  105. # ● 項目の無効化
  106. # index : 項目番号
  107. #--------------------------------------------------------------------------
  108. def disable_item(index)
  109. super
  110. end
  111. end
  112. #==============================================================================
  113. # □ Scene_Battle_CP
  114. #==============================================================================
  115. class Scene_Battle_CP
  116. #--------------------------------------------------------------------------
  117. # ○ 公開インスタンス変数
  118. #--------------------------------------------------------------------------
  119. attr_accessor :stop # CP加算ストップ
  120. #----------------------------------------------------------------------------
  121. # ○ オブジェクトの初期化
  122. #----------------------------------------------------------------------------
  123. def initialize
  124. @battlers = []
  125. @cancel = false
  126. @stop = false
  127. @agi_total = 0
  128. # 配列 count_battlers を初期化
  129. count_battlers = []
  130. # エネミーを配列 count_battlers に追加
  131. for enemy in $game_troop.enemies
  132. count_battlers.push(enemy)
  133. end
  134. # アクターを配列 count_battlers に追加
  135. for actor in $game_party.actors
  136. count_battlers.push(actor)
  137. end
  138. for battler in count_battlers
  139. @agi_total += battler.agi
  140. end
  141. for battler in count_battlers
  142. battler.cp = [[65535 * START_CP_PERCENT * (rand(15) + 85) * 4 * battler.agi / @agi_total / 10000, 0].max, 65535].min
  143. end
  144. end
  145. #----------------------------------------------------------------------------
  146. # ○ CPカウントアップ
  147. #----------------------------------------------------------------------------
  148. def update
  149. # ストップされているならリターン
  150. return if @stop
  151. #
  152. for battler in $game_party.actors + $game_troop.enemies
  153. # 行動出来なければ無視
  154. if battler.dead? == true
  155. battler.cp = 0
  156. next
  157. end
  158. battler.cp = [[battler.cp + BATTLE_SPEED * 4096 * battler.agi / @agi_total, 0].max, 65535].min
  159. end
  160. end
  161. #----------------------------------------------------------------------------
  162. # ○ CPカウントの開始
  163. #----------------------------------------------------------------------------
  164. def stop
  165. @cancel = true
  166. if @cp_thread != nil then
  167. @cp_thread.join
  168. @cp_thread = nil
  169. end
  170. end
  171. end
  172.  
  173. #==============================================================================
  174. # ■ Game_Battler
  175. #==============================================================================
  176. class Game_Battler
  177. attr_accessor :now_guarding # 現在防御中フラグ
  178. attr_accessor :cp # 現在CP
  179. attr_accessor :slip_state_update_ban # スリップ?ステート自動処理の禁止
  180. #--------------------------------------------------------------------------
  181. # ○ CP の変更
  182. #--------------------------------------------------------------------------
  183. def cp=(p)
  184. @cp = [[p, 0].max, 65535].min
  185. end
  186. #--------------------------------------------------------------------------
  187. # ● 防御中判定 [ 再定義 ]
  188. #--------------------------------------------------------------------------
  189. def guarding?
  190. return @now_guarding
  191. end
  192. #--------------------------------------------------------------------------
  193. # ● コマンド入力可能判定
  194. #--------------------------------------------------------------------------
  195. alias xrxs_bp1_inputable? inputable?
  196. def inputable?
  197. bool = xrxs_bp1_inputable?
  198. return (bool and (@cp >= 65535))
  199. end
  200. #--------------------------------------------------------------------------
  201. # ● ステート [スリップダメージ] 判定
  202. #--------------------------------------------------------------------------
  203. alias xrxs_bp1_slip_damage? slip_damage?
  204. def slip_damage?
  205. return false if @slip_state_update_ban
  206. return xrxs_bp1_slip_damage?
  207. end
  208. #--------------------------------------------------------------------------
  209. # ● ステート自然解除 (ターンごとに呼び出し)
  210. #--------------------------------------------------------------------------
  211. alias xrxs_bp1_remove_states_auto remove_states_auto
  212. def remove_states_auto
  213. return if @slip_state_update_ban
  214. xrxs_bp1_remove_states_auto
  215. end
  216. end
  217. #==============================================================================
  218. # ■ Game_Actor
  219. #==============================================================================
  220. class Game_Actor < Game_Battler
  221. #--------------------------------------------------------------------------
  222. # ● セットアップ
  223. #--------------------------------------------------------------------------
  224. alias xrxs_bp1_setup setup
  225. def setup(actor_id)
  226. xrxs_bp1_setup(actor_id)
  227. @cp = 0
  228. @now_guarding = false
  229. @slip_state_update_ban = false
  230. end
  231. end
  232. #==============================================================================
  233. # ■ Game_Enemy
  234. #==============================================================================
  235. class Game_Enemy < Game_Battler
  236. #--------------------------------------------------------------------------
  237. # ● オブジェクト初期化
  238. #--------------------------------------------------------------------------
  239. alias xrxs_bp1_initialize initialize
  240. def initialize(troop_id, member_index)
  241. xrxs_bp1_initialize(troop_id, member_index)
  242. @cp = 0
  243. @now_guarding = false
  244. @slip_state_update_ban = false
  245. end
  246. end
  247. #==============================================================================
  248. # ■ Window_BattleStatus
  249. #==============================================================================
  250. class Window_BattleStatus < Window_Base
  251. #--------------------------------------------------------------------------
  252. # ○ 公開インスタンス変数
  253. #--------------------------------------------------------------------------
  254. attr_accessor :update_cp_only # CPメーターのみの更新
  255. #--------------------------------------------------------------------------
  256. # ● オブジェクト初期化
  257. #--------------------------------------------------------------------------
  258. alias xrxs_bp1_initialize initialize
  259. def initialize
  260. @update_cp_only = false
  261. xrxs_bp1_initialize
  262. end
  263. #--------------------------------------------------------------------------
  264. # ● リフレッシュ
  265. #--------------------------------------------------------------------------
  266. alias xrxs_bp1_refresh refresh
  267. def refresh
  268. unless @update_cp_only
  269. xrxs_bp1_refresh
  270. end
  271. refresh_cp
  272. end
  273. #--------------------------------------------------------------------------
  274. # ○ リフレッシュ(CPのみ)
  275. #--------------------------------------------------------------------------
  276. def refresh_cp
  277. for i in 0...$game_party.actors.size
  278. actor = $game_party.actors[i]
  279. width = [self.width*3/4 / XRXS_BP1::MAX, 100].max
  280. space = self.width / XRXS_BP1::MAX
  281. case XRXS_BP1::ALIGN
  282. when 0
  283. actor_x = i * space + 4
  284. when 1
  285. actor_x = (space * ((XRXS_BP1::MAX - $game_party.actors.size)/3.0 + i)).floor
  286. when 2
  287. actor_x = (i + XRXS_BP1::MAX - $game_party.actors.size) * space + 4
  288. end
  289. actor_x += self.x
  290. draw_actor_cp_meter(actor, actor_x, 90, width, 0)
  291. end
  292. end
  293. #--------------------------------------------------------------------------
  294. # ○ CPメーター の描画
  295. #--------------------------------------------------------------------------
  296. def draw_actor_cp_meter(actor, x, y, width = 200, type = 0)
  297. self.contents.font.color = system_color
  298. self.contents.fill_rect(x-1, y+27, width+10,9, Color.new(0, 0, 0, 150))
  299. if actor.cp == nil
  300. actor.cp = 0
  301. end
  302. w = width * [actor.cp,65535].min / 65535
  303. self.contents.fill_rect(x, y+28, w+4,3, Color.new(0, 0, 0, 255))
  304. self.contents.fill_rect(x, y+29, w+4,3, Color.new(255, 255, 0, 255))
  305. self.contents.fill_rect(x, y+30, w+4,3, Color.new(200, 200, 0, 255))
  306. self.contents.fill_rect(x, y+31, w+4,3, Color.new(128, 128, 0, 255))
  307. end
  308. end
  309. #==============================================================================
  310. # ■ Scene_Battle
  311. #==============================================================================
  312. class Scene_Battle
  313. #--------------------------------------------------------------------------
  314. # ● フレーム更新
  315. #--------------------------------------------------------------------------
  316. alias xrxs_bp1_update update
  317. def update
  318. xrxs_bp1_update
  319. # CP更新
  320. @cp_thread.update
  321. end
  322. #--------------------------------------------------------------------------
  323. # ● バトル終了
  324. # result : 結果 (0:勝利 1:敗北 2:逃走)
  325. #--------------------------------------------------------------------------
  326. alias xrxs_bp1_battle_end battle_end
  327. def battle_end(result)
  328. # CPカウントを停止する
  329. @cp_thread.stop
  330. # 呼び戻す
  331. xrxs_bp1_battle_end(result)
  332. end
  333. #--------------------------------------------------------------------------
  334. # ●战斗阶段開始
  335. #--------------------------------------------------------------------------
  336. alias xrxs_bp1_start_phase1 start_phase1
  337. def start_phase1
  338. @agi_total = 0
  339. # CP加算を開始する
  340. @cp_thread = Scene_Battle_CP.new
  341. # 引索设定計算
  342. @cp_escape_actor_command_index = @actor_command_window.height/32 - 1
  343. # 返回命令窗口的追加
  344. # @actor_command_window.add_command("逃跑")
  345. if !$game_temp.battle_can_escape
  346. # @actor_command_window.disable_item(@cp_escape_actor_command_index)
  347. end
  348. # 返回
  349. xrxs_bp1_start_phase1
  350. end
  351. #--------------------------------------------------------------------------
  352. # ● パーティコマンドフェーズ開始
  353. #--------------------------------------------------------------------------
  354. alias xrxs_bp1_start_phase2 start_phase2
  355. def start_phase2
  356. xrxs_bp1_start_phase2
  357. @party_command_window.active = false
  358. @party_command_window.visible = false
  359. # CP加算を再開する
  360. @cp_thread.stop = false
  361. # 次へ
  362. start_phase3
  363. end
  364. #--------------------------------------------------------------------------
  365. # ● アクターコマンドウィンドウのセットアップ
  366. #--------------------------------------------------------------------------
  367. alias xrxs_bp1_phase3_setup_command_window phase3_setup_command_window
  368. def phase3_setup_command_window
  369. # CPスレッドを一時停止する
  370. @cp_thread.stop = true
  371. # ウィンドウのCP更新
  372. @status_window.refresh_cp
  373. # @active_battlerの防御を解除
  374. @active_battler.now_guarding = false
  375. # 効果音の再生
  376. Audio.se_play(DATA_SYSTEM_COMMAND_UP_SE) if DATA_SYSTEM_COMMAND_UP_SE != ""
  377. # 呼び戻す
  378. xrxs_bp1_phase3_setup_command_window
  379. end
  380. #--------------------------------------------------------------------------
  381. # ● フレーム更新 (アクターコマンドフェーズ : 基本コマンド)
  382. #--------------------------------------------------------------------------
  383. alias xrxs_bsp1_update_phase3_basic_command update_phase3_basic_command
  384. def update_phase3_basic_command
  385. # C ボタンが押された場合
  386. if Input.trigger?(Input::C)
  387. # アクターコマンドウィンドウのカーソル位置で分岐
  388. case @actor_command_window.index
  389. when @cp_escape_actor_command_index # 逃げる
  390. if $game_temp.battle_can_escape
  391. # 決定 SE を演奏
  392. $game_system.se_play($data_system.decision_se)
  393. # アクションを設定
  394. @active_battler.current_action.kind = 0
  395. @active_battler.current_action.basic = 4
  396. # 次のアクターのコマンド入力へ
  397. phase3_next_actor
  398. else
  399. # ブザー SE を演奏
  400. $game_system.se_play($data_system.buzzer_se)
  401. end
  402. return
  403. end
  404. end
  405. xrxs_bsp1_update_phase3_basic_command
  406. end
  407. #--------------------------------------------------------------------------
  408. # ● メインフェーズ開始
  409. #--------------------------------------------------------------------------
  410. alias xrxs_bp1_start_phase4 start_phase4
  411. def start_phase4
  412. # 呼び戻す
  413. xrxs_bp1_start_phase4
  414. # CPスレッドを一時停止する
  415. unless @action_battlers.empty?
  416. @cp_thread.stop = true
  417. end
  418. end
  419. #--------------------------------------------------------------------------
  420. # ● 行動順序作成
  421. #--------------------------------------------------------------------------
  422. alias xrxs_bp1_make_action_orders make_action_orders
  423. def make_action_orders
  424. xrxs_bp1_make_action_orders
  425. # 全員のCPを確認
  426. exclude_battler = []
  427. for battler in @action_battlers
  428. # CPが不足している場合は @action_battlers から除外する
  429. if battler.cp < 65535
  430. exclude_battler.push(battler)
  431. end
  432. end
  433. @action_battlers -= exclude_battler
  434. end
  435. #--------------------------------------------------------------------------
  436. # ● フレーム更新 (メインフェーズ ステップ 1 : アクション準備)
  437. #--------------------------------------------------------------------------
  438. alias xrxs_bp1_update_phase4_step1 update_phase4_step1
  439. def update_phase4_step1
  440. # 初期化
  441. @phase4_act_continuation = 0
  442. # 勝敗判定
  443. if judge
  444. @cp_thread.stop
  445. # 勝利または敗北の場合 : メソッド終了
  446. return
  447. end
  448. # 未行動バトラー配列の先頭から取得
  449. @active_battler = @action_battlers[0]
  450. # ステータス更新をCPだけに限定。
  451. @status_window.update_cp_only = true
  452. # ステート更新を禁止。
  453. @active_battler.slip_state_update_ban = true if @active_battler != nil
  454. # 戻す
  455. xrxs_bp1_update_phase4_step1
  456. # @status_windowがリフレッシュされなかった場合は手動でリフレッシュ(CPのみ)
  457. if @phase4_step != 2
  458. # リフレッシュ
  459. @status_window.refresh
  460. # 軽量化:たったコレだけΣ(?w?
  461. Graphics.frame_reset
  462. end
  463. # 禁止を解除
  464. @status_window.update_cp_only = false
  465. @active_battler.slip_state_update_ban = false if @active_battler != nil
  466. end
  467. #--------------------------------------------------------------------------
  468. # ● フレーム更新 (メインフェーズ ステップ 2 : アクション開始)
  469. #--------------------------------------------------------------------------
  470. alias xrxs_bp1_update_phase4_step2 update_phase4_step2
  471. def update_phase4_step2
  472. # 強制アクションでなければ
  473. unless @active_battler.current_action.forcing
  474. # 制約が [敵を通常攻撃する] か [味方を通常攻撃する] の場合
  475. if @active_battler.restriction == 2 or @active_battler.restriction == 3
  476. # アクションに攻撃を設定
  477. @active_battler.current_action.kind = 0
  478. @active_battler.current_action.basic = 0
  479. end
  480. # 制約が [行動できない] の場合
  481. if @active_battler.restriction == 4
  482. # アクション強制対象のバトラーをクリア
  483. $game_temp.forcing_battler = nil
  484. if @phase4_act_continuation == 0 and @active_battler.cp >= 65535
  485. # ステート自然解除
  486. @active_battler.remove_states_auto
  487. # CP消費
  488. @active_battler.cp -= 65535
  489. # ステータスウィンドウをリフレッシュ
  490. @status_window.refresh
  491. end
  492. # ステップ 1 に移行
  493. @phase4_step = 1
  494. return
  495. end
  496. end
  497. # アクションの種別で分岐
  498. case @active_battler.current_action.kind
  499. when 0
  500. # 攻撃?防御?逃げる?何もしない時の共通消費CP
  501. @active_battler.cp -= CP_COST_BASIC_ACTIONS if @phase4_act_continuation == 0
  502. when 1
  503. # スキル使用時の消費CP
  504. @active_battler.cp -= CP_COST_SKILL_ACTION if @phase4_act_continuation == 0
  505. when 2
  506. # アイテム使用時の消費CP
  507. @active_battler.cp -= CP_COST_ITEM_ACTION if @phase4_act_continuation == 0
  508. end
  509. # ステート自然解除
  510. @active_battler.remove_states_auto
  511. # 呼び戻す
  512. xrxs_bp1_update_phase4_step2
  513. end
  514. #--------------------------------------------------------------------------
  515. # ● 基本アクション 結果作成
  516. #--------------------------------------------------------------------------
  517. alias xrxs_bp1_make_basic_action_result make_basic_action_result
  518. def make_basic_action_result
  519. # 攻撃の場合
  520. if @active_battler.current_action.basic == 0 and @phase4_act_continuation == 0
  521. @active_battler.cp -= CP_COST_BASIC_ATTACK # 攻撃時のCP消費
  522. end
  523. # 防御の場合
  524. if @active_battler.current_action.basic == 1 and @phase4_act_continuation == 0
  525. @active_battler.cp -= CP_COST_BASIC_GUARD # 防御時のCP消費
  526. # @active_battlerの防御をON
  527. @active_battler.now_guarding = true
  528. end
  529. # 敵の逃げるの場合
  530. if @active_battler.is_a?(Game_Enemy) and
  531. @active_battler.current_action.basic == 2 and @phase4_act_continuation == 0
  532. @active_battler.cp -= CP_COST_BASIC_ESCAPE # 逃走時のCP消費
  533. end
  534. # 何もしないの場合
  535. if @active_battler.current_action.basic == 3 and @phase4_act_continuation == 0
  536. @active_battler.cp -= CP_COST_BASIC_NOTHING # 何もしない時のCP消費
  537. end
  538. # 逃げるの場合
  539. if @active_battler.current_action.basic == 4 and @phase4_act_continuation == 0
  540. @active_battler.cp -= CP_COST_BASIC_ESCAPE # 逃走時のCP消費
  541. # 逃走可能ではない場合
  542. if $game_temp.battle_can_escape == false
  543. # ブザー SE を演奏
  544. $game_system.se_play($data_system.buzzer_se)
  545. return
  546. end
  547. # 逃走処理
  548. update_phase2_escape
  549. return
  550. end
  551. # 呼び戻す
  552. xrxs_bp1_make_basic_action_result
  553. end
  554. #--------------------------------------------------------------------------
  555. # ● フレーム更新 (メインフェーズ ステップ 6 : リフレッシュ)
  556. #--------------------------------------------------------------------------
  557. alias xrxs_bp1_update_phase4_step6 update_phase4_step6
  558. def update_phase4_step6
  559. # スリップダメージ
  560. if @active_battler.hp > 0 and @active_battler.slip_damage?
  561. @active_battler.slip_damage_effect
  562. @active_battler.damage_pop = true
  563. # ステータスウィンドウをリフレッシュ
  564. @status_window.refresh
  565. end
  566. # 呼び戻す
  567. xrxs_bp1_update_phase4_step6
  568. end
  569. end
  570.  
  571. #==============================================================================
  572. # 本脚本来自[url]www.66RPG.com[/url],使用和转载请保留此信息
  573. #==============================================================================
还有用上CP条脚本 之后战斗直接闪退 不得不说BUG还是有的
虽然很想要将旧工程,变成60帧。还有战斗图标脚本,图标就不显示了。
作者: guoxiaomi    时间: 2023-4-7 06:22
本帖最后由 guoxiaomi 于 2023-4-7 06:44 编辑
契约师Vi 发表于 2023-4-6 22:45
这个分辨率的黑边,希望能解决



暂时把302行改成:
  1. w = (width * [actor.cp,65535].min / 65535).to_i
复制代码

因为下面的fill_rect里我忘了把输入数据转换为整数类型,会在下一次发布时添加。
其实error.log里已经对报错有完整描述了,下次可以直接贴出前几行。比如这次的报错就是:

2023-04-07 06:03:16 +0800
Error occurs when load Data/Scripts.rxdata.
wrong argument type Float (expected Integer)
- eval:133:in `bitmap_fill_rect'
- eval:133:in `fill_rect'
- CP脚本测试:303:in `draw_actor_cp_meter'

================
黑框是因为viewport大小限制了tilemap的大小。RGSS设计时就没考虑过修改分辨率,很多宽和高都被硬编码成了640或者480。所以单纯的把viewport扩大到窗口大小,还是会有通行度、显示上的问题,需要逐个找出,把硬编码的部分改成适配动态分辨率的模式。简单说就是把640改成Graphics.width,480改成Graphics.height,320改成Graphics.width/2,240改成Graphics.height/2这种。

回头我参考一下那些分辨率扩展的脚本,看看它们改了哪些地方,先给默认系统加上分辨率扩张。这个看看大家的需求优先级。
作者: pporder    时间: 2023-4-9 02:26
顶一个,助上首页
作者: RyanBern    时间: 2023-4-9 09:44
这,简直强到不可思议,猫叔 yyds

梦石+高亮安排
作者: 玻璃柿子    时间: 2023-4-9 09:46
一起为rmxp注入新的活力
作者: guoxiaomi    时间: 2023-4-12 23:01
本帖最后由 guoxiaomi 于 2023-4-12 23:35 编辑

1.0.0-rc2发布了,因为正式版发布后就不能随便改ABI了,所以在发布前还需要一些命名等地方的小调整,这些调整不会影响现有的功能。
顺便这次范例里添加了输入法的范例事件和读取加密文件(setu):

输入法按回车输入,按ESC清除。事件的写法也很简单:
这里是启动事件,第二页还要设置一个并行处理的事件,太长就不发了,请下载范例查看~

具体实现参见textbox.rb,整个输入法功能几乎都是用ruby写的,RGM只提供了Ext模块下的4个函数封装了SDL的对应函数,和一个赋值@@need_refresh的机制。
作者: SailCat    时间: 2023-4-13 11:40
理论上有这个东西的话,我的SEP Core就不需要搞成近4000行的大脚本了……

另外,有没有计划把编辑器"名称"和"描述"文本框的长度放开?现在分别是40和100,而且100没法入力100个汉字(能输入进去,但无法提交)。
因为XP没有备注,如果能把这两个文本框的长度放开(比如放开到条件分歧-脚本的10000)就可以干许许多多以前根本不敢想的事情了……
作者: 765111039    时间: 2023-4-13 17:14
膜拜大佬,请问下WIN7可以用吗
作者: guoxiaomi    时间: 2023-4-13 19:45
本帖最后由 guoxiaomi 于 2023-4-13 19:55 编辑
SailCat 发表于 2023-4-13 11:40
理论上有这个东西的话,我的SEP Core就不需要搞成近4000行的大脚本了……

另外,有没有计划把编辑器"名称" ...


猫姐好像回错贴了0v0,编辑器的需求在魔改计划那个贴~

不过正好我也想整理一个带SEP Core的各种强化/修补功能,也支持扩展分辨率的RGSS出来作为范例工程使用,但我没有仔细研究过SEP Core,不知猫姐有没有什么建议,比如哪些适合加进去?(要是能做好白送我更好啦)
作者: 真·可乐    时间: 2023-4-13 20:50
不知道该说什么,我来发一个牛逼。
作者: taeckle    时间: 2023-4-24 05:13
guoxiaomi 发表于 2023-4-5 10:43
大家有哪些常见、重要但是不兼容的功能也可以提出来,我这边看看能不能出替代方案,尽可能帮助老旧工程的移 ...

大神请问下你的这个RGModern可以用来调整游戏窗口分辨率吗?
作者: soulsaga    时间: 2023-4-24 16:44
同样是60FPS
跟其他第三方runtime感觉上不同
这个感觉更更加絲滑
作者: SailCat    时间: 2023-4-25 15:40
guoxiaomi 发表于 2023-4-13 19:45
猫姐好像回错贴了0v0,编辑器的需求在魔改计划那个贴~

不过正好我也想整理一个带SEP Core的各种强化/修 ...

SEP Core本身的功能都写在前面那个说明里,如果你想植入其中一部分的话……不知道是哪些部分
作者: 765111039    时间: 2023-4-25 15:53
还在用WIN7的来顶下,顺便问下 如果发布了玩家也是只能用WIN10来玩吗
作者: 灯笼菜刀王    时间: 2023-4-27 15:59
win7没反应
作者: guoxiaomi    时间: 2023-4-29 00:13
本帖最后由 guoxiaomi 于 2023-4-29 05:43 编辑

1.0.0-rc3发布了,修复了一些bug,添加了对win7的支持,不过我没win7也测不了,按说是没问题的0v0

win7版本的exe是动态链接sdl2,使用时需要把附带的几个sdl2*.dll放到exe所在的目录下,lib*.dll看上去不太需要,但是以防万一还是都带上。
作者: 765111039    时间: 2023-4-29 11:30
guoxiaomi 发表于 2023-4-29 00:13
1.0.0-rc3发布了,修复了一些bug,添加了对win7的支持,不过我没win7也测不了,按说是没问题的0v0

win7版 ...

好的 我来试试
作者: 灯笼菜刀王    时间: 2023-4-29 16:09
经测试(win7旗舰版), 从第一层文件夹的 main_win7.exe 可以打开并进入游戏, 但是第二层和Project1里的就直接闪退,  且从project1的编辑器里点击测试也是无反应

尝试把第一层文件夹的所有文件复制进去后也是一样, 而且,复制进去后, 原本可以运行的第一层main_win7.exe, 也是闪退了

删除, 重新解压一份, 然后把我工程里的data,audio, graphics 复制到project1里(有把新增加的两段脚本塞入), 并从第一层文件夹的main_win7.exe打开, 结果也是直接闪退(PS:我的工程没有使用任何dll和API)

PS: 测试的文件夹位于 G:\RMXP,  不含中文路径。 运行时只开着谷歌浏览器和TIM, 除了自带防火墙(中级) 外,没有杀毒软件

作者: guoxiaomi    时间: 2023-4-29 18:08
本帖最后由 guoxiaomi 于 2023-4-29 18:22 编辑
灯笼菜刀王 发表于 2023-4-29 16:09
经测试(win7旗舰版), 从第一层文件夹的 main_win7.exe 可以打开并进入游戏, 但是第二层和Project1里的就直 ...


我重新上传了一份文件,这个版本会把内部错误弹窗。

我买了台阿里云的win7服务器,把config.ini中的RenderDriver设置为software就可以在win7上运行,说明程序是兼容的,甚至静态链接的Game.exe也能运行,不清楚原因。

设置成opengl、direct3d9或者direct3d11会显示找不到合适的Driver,这个是阿里云win7的一贯问题。

你可以试一下改这个RenderDriver的值为software看看是不是兼容的。改成其他的如果没有弹窗报错,那么看看error.log,有可能是字体不匹配,或者别的bug……


作者: 契约师Vi    时间: 2023-5-2 09:12
,黑边就是这样这样。
作者: 765111039    时间: 2023-5-2 11:20
又经过几天的开发,RGModern的1.0.0-rc5版本发布了
作者: RPGzh500223    时间: 2023-5-3 15:43
楼主加油
作者: guoxiaomi    时间: 2023-5-4 23:20
RGModern 1.0.0 正式版发布了,同时发布的还有 RGM 小助手(1楼有下载链接)

由于 RGM 的加密方案是把 Data 文件夹打包后内嵌到 exe 内,所以必须编译源码才可以完成加密。RGM 小助手可以协助开发者配置环境并完成编译。

首次更新编译环境和更新RGModern会非常慢,请耐心等待~

下面是 RGM 小助手的界面,RGM 小助手使用了 nana gui 库编写,源码也附在压缩包里了。

作者: 李时珍的皮    时间: 2023-5-5 17:38
更新一直出现错误,不知道是不是我WIN7系统的原因。

捕获.PNG (80.32 KB, 下载次数: 40)

捕获.PNG

作者: 765111039    时间: 2023-5-5 17:40
李时珍的皮 发表于 2023-5-5 17:38
更新一直出现错误,不知道是不是我WIN7系统的原因。

WIN7没问题 我就是WIN7的,是不是放在中文路径了
作者: jinae2022    时间: 2023-5-5 19:26
点击下载 完整测试工程,或https下载
这里链接挂了吗
作者: 15217320790    时间: 2023-5-5 20:05
顶~建议给想用的人儿出个视频安装教学(不会吧,不会吧不会只有我不会装吧)
作者: 15217320790    时间: 2023-5-5 20:13
15217320790 发表于 2023-5-5 20:05
顶~建议给想用的人儿出个视频安装教学(不会吧,不会吧不会只有我不会装吧) ...

还不会打开
作者: 765111039    时间: 2023-5-6 10:39
郭大,我发现一个小问题,不知道是不是我操作不对,改那个config中的Title,程序运行窗口的名称始终是RGModern,改外面的是这样,改src里面那个也是这样,是怎么回事呢
作者: gengxiao101    时间: 2023-5-6 11:52
765111039 发表于 2023-5-6 10:39
郭大,我发现一个小问题,不知道是不是我操作不对,改那个config中的Title,程序运行窗口的名称始终是RGMod ...

如果是范例工程,改Project1下的config,并且用Project1下的Game.exe启动才行
作者: gengxiao101    时间: 2023-5-6 14:12
反馈个不知道应不应该算是兼容问题,编译Game.exe执行后报错

错误信息如下:
2023-05-06 12:01:48 +0900
Error occurs when load Data/Scripts.rxdata.
Window_Time 2:326: syntax error, unexpected ',', expecting ')'
...ts.font.color = Color.new (109,56,137) #紫
...                              ^

脚本源码
  1. case $game_variables[$hour]
  2.     when 1
  3.       hourtxt = "子时"#11pm ~ 1am
  4.       self.contents.font.color = Color.new (109,56,137) #紫
  5.     when 2
  6.       hourtxt = "丑时"#1am ~ 3am
  7.       self.contents.font.color = Color.new (68,78,153) #蓝紫
  8.     when 3
  9.       hourtxt = "寅时"#3am ~ 5am
  10.       self.contents.font.color = Color.new (38,113,178) #蓝
  11.     when 4
  12.       hourtxt = "卯时"#5am ~ 7am
  13.       self.contents.font.color = Color.new (6,150,187) #绿蓝
  14.     when 5
  15.       hourtxt = "辰时"#7am ~ 9am
  16.       self.contents.font.color = Color.new (0,142,91) #绿
  17.     when 6
  18.       hourtxt = "巳时"#9am ~ 11am
  19.       self.contents.font.color = Color.new (140,187,38) #黄绿
  20.     when 7
  21.       hourtxt = "午时"#11am ~ 1pm
  22.       self.contents.font.color = Color.new (244,229,0) #黄
  23.     when 8
  24.       hourtxt = "未时"#1pm ~ 3pm
  25.       self.contents.font.color = Color.new (255,153,0) #橙黄
  26.     when 9
  27.       hourtxt = "申时"#3pm ~ 5pm
  28.       self.contents.font.color = Color.new (241,145,1) #橙
  29.     when 10
  30.       hourtxt = "酉时"#5pm ~ 7pm
  31.       self.contents.font.color = Color.new (234,98,31) #红橙
  32.     when 11
  33.       hourtxt = "戌时"#7pm ~ 9pm
  34.       self.contents.font.color = Color.new (227,35,34) #红
  35.     when 12
  36.       hourtxt = "亥时"#9pm ~ 11pm
  37.       self.contents.font.color = Color.new (196,3,125) #紫红
  38.     end
复制代码

作者: gengxiao101    时间: 2023-5-6 14:27
gengxiao101 发表于 2023-5-6 14:12
反馈个不知道应不应该算是兼容问题,编译Game.exe执行后报错

错误信息如下:

感谢大大,知道问题所在了。

注册10年了,现在只有1积分的我不能点评,只能参与回复主题
作者: 765111039    时间: 2023-5-6 21:52
图片太大十几M传不上来,你可以看下我发的链接里面有操作的GIF,不管改哪里的设置项都改不了标题,只有改脚本才有用,但是脚本载入游戏的前两秒还是RMG的默认名字
链接:https://pan.baidu.com/s/1KljXIym4qUHoJPph0qn02Q
提取码:kg4h
作者: guoxiaomi    时间: 2023-5-6 22:34
本帖最后由 guoxiaomi 于 2023-5-6 22:39 编辑
765111039 发表于 2023-5-6 21:52
图片太大十几M传不上来,你可以看下我发的链接里面有操作的GIF,不管改哪里的设置项都改不了标题,只有改脚 ...


另外ini中如果设置了screen和window的大小,就不用游戏中再设置一次了。

既然你使用main.exe,那么你可以修改src中的脚本。把src/scripts/graphics.rb里的set_title改成:
  1.   def set_title(title)
  2.     @@title = title
  3.     RGM::Base.set_title(title)
  4.   end
复制代码
看看行不行?这个更改我已经加入dev分支了,至少可以让改名立即生效。

src/config.ini是exe找不到ini时自动生成的那份,有config.ini的场合改了是没用的。

我想在这个月整理一下思路,完善用户手册,所以下一个版本应该是6月更新(除非出现恶行BUG),你可能要耐心等等。
作者: SailCat    时间: 2023-5-6 23:48
SEP 没法用,涉及字符串处理的基本上全部挂了。
1.8的字符串和3.0的字符串就不是一个东西

作者: 765111039    时间: 2023-5-7 08:23
本帖最后由 765111039 于 2023-5-7 14:09 编辑

改标题没用,但是其他的设置比如改窗口都有效,我的两个程序都是小助手生成的,
其他的设置项我都没动过,就动了窗口和标题,然后我试着改了其他选项 都是有用的 ,就标题用不了

作者: guoxiaomi    时间: 2023-5-7 13:36
本帖最后由 guoxiaomi 于 2023-5-7 13:58 编辑
765111039 发表于 2023-5-7 08:23
改标题没用,但是其他的设置比如改窗口都有效,我的两个程序都是小助手生成的,
其他的设置项我都没动过, ...


OK,我知道原因了。因为你用了一些软件修改了config.ini,使其格式从UTF-8变成了UTF-8 with BOM。所以解决方案可以是:
1. 在config.ini的[Game]前面随便加几行内容,空行也行。
2. 使用记事本另存为,选择编码为utf-8(在保存按钮左边)

此外,main.exe只是我为了方便区分不同模式取的名字。你可以改名成Game.exe,然后就可以在RMXP中用F12调试了。

最后,仔细看一下46楼和src中脚本的区别,46楼中我去掉了 unless @@show_fps。。。不过没关系,反正问题解决了。

机智的我在src/config.ini前面加了一段版权声明,下个版本会更新:

作者: 灯笼菜刀王    时间: 2023-5-15 16:33
本帖最后由 灯笼菜刀王 于 2023-5-15 16:35 编辑

找了半天没找到帖子原来拉到顶上去了......

很抱歉这么晚才测试, 测试结果是范例都可以正常运行,

不过当我把我自己工程里的data auido graphics复制过去后, 就会闪退
点击运行会一瞬间看到标题画面, 然后立刻退出, 包括后台


这是闪退前的最后抢拍


新建工程可以正常运行, 应该是我自己工程的问题, 毕竟改了很多地方, 还改得很任性.... 而且猫姐说的那个"abc"[0]的问题我也有, 估计是不能用了=.=
作者: 灯笼菜刀王    时间: 2023-5-16 10:01
本帖最后由 灯笼菜刀王 于 2023-5-17 12:01 编辑

没有找到 error.log 这个文件

cmd是这样的




Scripts.rar

134.36 KB, 阅读权限: 100, 下载次数: 2


作者: guoxiaomi    时间: 2023-5-16 11:52
本帖最后由 guoxiaomi 于 2023-5-16 12:06 编辑
灯笼菜刀王 发表于 2023-5-16 10:01
没有找到 error.log 这个文件

cmd是这样的


在graphics.update里出错,你只需要依次排查Scene_Title里的绘制的那些对象,应该就可以找到是绘制哪个对象导致的问题了。

个人觉得有可能是你修改或者继承了内部类,并且使用了属性名称相同的实例变量,如 @x,@visible 等,并且在使用时改变了它们原本的类型,比如 @x = 0.0 这种,RGM要求很严格,很多属性不能是浮点数,包括color、tone的rgb值等。

以Sprite举例,原版的Sprite是一个C结构体的wrapper,没有定义实例变量 @x,只定义了self.x和self.x=方法来访问对应的数据,如果在此类中定义了 @x,这个变量跟绘制无关。

RGM则设置了相应的实例变量 @x,并且给此实例变量定义了 self.x= 和 self.x(其实是attr_reader) 方法。如果在此类中直接修改了 @x,可能设置会失败,但如果 @x 的类型变成了浮点数就可能出大问题。

另外@color,@tone这种实例变量,只要类型还是Color或者Tone,是可以自由操作的,但是如果类型变了,比如设置@color=0,也可能会出问题。

最好的方法就是完全不操作实例变量,改用self.x,self.x=这两个接口。或者仔细检查是否存在给特定属性赋值了浮点数的情况。
作者: guoxiaomi    时间: 2023-5-18 23:29
本帖最后由 guoxiaomi 于 2023-5-18 23:38 编辑
灯笼菜刀王 发表于 2023-5-16 10:01
没有找到 error.log 这个文件

cmd是这样的


查出来的问题是你使用了Bitmap#dup方法,但是RGM没有定义此方法,可能就自动使用父类Object的实现了。然而Bitmap有部分数据在显存中,dup之后就不能再还原了。RGM定义了clone方法,可以作为dup的替代:
  1. class Bitmap
  2.   alias dup clone
  3. end
复制代码

如果你看源码就会发现clone的定义非常直接:
  1.   def clone
  2.     b = Bitmap.new(@width, @height)
  3.     b.blt(0, 0, self, rect)
  4.     b
  5.   end
复制代码

顺便我发现你还使用了SailCat写的的Bitmap#to_grayscale,RGM也定义了转换成灰度图的方法Bitmap#grayscale,此方法调用的是内部函数,效率会高很多,推荐使用。范例工程里也有此方法的应用:在截图保存时会变成灰度图。

可以查阅src/script/bitmap.rb了解RGM中Bitmap的各方法。
作者: 半昭吖!    时间: 2023-5-25 10:47
WC,这玩意儿太劲爆了(
我大xp还能再战300年(
但范例工程沙滩这里的水怎么有黑色点点啊(


作者: gengxiao101    时间: 2023-5-25 21:48
1.0.1版改了啥啊
作者: RTCanwind    时间: 2023-5-27 01:24
纯萌新 打开范例工程跳这个是什么原因呢?
作者: guoxiaomi    时间: 2023-5-27 06:36
补充一下迄今的更新日志:

## [1.0.2] - 2023-05-27
### 新增
- 新增了 ext/gamecontrollerdb.txt 文件,并在程序中内嵌此文件以支持多种控制器。

## [1.0.1] - 2023-05-12
### 修复
- 修复了 Game.exe(Build Mode 2)无法在中文路径下运行的问题。
- 给 config.ini 文件头部添加了 License,以解决 UTF8-BOM 头导致 `[Game]` 匹配失败的问题。
### 优化
- Viewport 的 dispose 会将 @data_ptr 设置为 nil。
- Graphics 的 set_title 在显示 FPS 的场合会立即生效,而不是跟随下一次 FPS 更新。
- 对 Finder 中缓存的路径字符串执行 freeze。
- 给 src/shader 下的 C++ 代码添加了注释。
- 给部分 C++ 函数添加了`[[nodiscard]]`、`noexcept` 和 `const` 的标记。
- rgm::ext::zip_data_external 类中的 load_texture 和 load_surface 返回 std::optional,而不是裸指针。若返回了 std::nullopt,后续流程中会抛出异常。
- 第 4 个 worker 的标签从 table 改名为 aside。
- rgm::shader 中各类的静态变量全部 inline 处理。
### 新增
- config.ini 的 `[System]` 栏目中添加了 ScreenScaleMode 词条,此值可以设置为 0~3,分别对应不同的画面缩放模式:0:最近邻,1:线性,2:最佳,3:不缩放且居中。
- Input 的 bind 的第二个参数可以使用整数,之前必须是常量名对应的 Symbol。
- config.ini 的 `[Keymap]` 可以使用数字代替虚拟按键的常量名。比如:`K_DOWN=2`。这样便于绑定自定义虚拟按键,因为在读取这部分内容时,很可能自定义虚拟按键的常量尚未定义,如果使用常量名则会报错。
- 新增了 src/script/rgm_defines.rb 文件,可以查看 RGM 模块中定义的方法和常量。仅用于提示开发者 RGM 模块中的内容,不能在脚本中执行。此外,此文件是扫描 C++ 代码自动生成的,故 sprite_create 等方法未列出。
- CMakeList 添加了 MSVC 中预编译头的设置。
- 新增了 src/script/kernel.rb 文件,此文件中定义了所有的全局函数。
### 删除
- 移除了 src/script 中的 main-xp.rb 和 test.rb 文件。
- 移除了 src/script 下的 debug.rb 文件,代码移动到新增的 kernel.rb 文件中。
- 移除了 src/rmxp/drawable.hpp 中复杂的 pmr 方案。此方案并未实装,目前使用的是简单的 pmr 方案。
- 移除了 rgm::init_shader 的定义,使用 rgm::shader::init_shader。

## [1.0.0] - 2023-05-04
正式版发布。
作者: RTCanwind    时间: 2023-5-27 14:50
2023-05-27 14:44:44 +0800
Error occurs when load Data/Scripts.rxdata.
no implicit conversion of nil into Integer

eval:41:in `initialize'
eval:41:in `new'
eval:41:in `initialize'
004_Win32API.rb:3:in `new'
004_Win32API.rb:3:in `<class:Win32API>'
004_Win32API.rb:1:in `block in load_scripts_from_folder'

用到Win32API的老工程有办法移植吗()
作者: miantouchi    时间: 2023-5-27 15:32
作者介绍下范例工程里面这些文件列表大概作用吗?
文件里面有个Project1工程文件夹,文件夹里面还有许多不认识的dll
希望介绍下,我好了解下,怎么才能精简的使用上RGM。

目录.png (33.64 KB, 下载次数: 37)

目录.png

作者: RTCanwind    时间: 2023-5-27 17:50
RTCanwind 发表于 2023-5-27 14:50
2023-05-27 14:44:44 +0800
Error occurs when load Data/Scripts.rxdata.
no implicit conversion of nil  ...

class Win32API
  @@RGSSWINDOW = nil
  @@GetCurrentThreadId       = Win32API.new('kernel32', 'GetCurrentThreadId', '%w()', 'l')
  @@GetWindowThreadProcessId = Win32API.new('user32', 'GetWindowThreadProcessId', '%w(l p)', 'l')
  @@FindWindowEx             = Win32API.new('user32', 'FindWindowEx', '%w(l l p p)', 'l')
作者: guoxiaomi    时间: 2023-5-27 20:36
RTCanwind 发表于 2023-5-27 17:50
class Win32API
  @@RGSSWINDOW = nil
  @@GetCurrentThreadId       = Win32API.new('kernel32', 'GetCu ...

额,看来是ruby3不支持这种产生字符串的语法了。你要这样写:
  1. @@GetCurrentThreadId = Win32API.new('kernel32', 'GetCurrentThreadId', '', 'l')
  2. @@GetWindowThreadProcessId = Win32API.new('user32', 'GetWindowThreadProcessId', 'lp', 'l')
  3. @@FindWindowEx = Win32API.new('user32', 'FindWindowEx', 'llpp', 'l')
复制代码

以及你读这些Win32API是用作什么呢,如果是改分辨率、输入法之类的,RGM已经内置了这些功能。
作者: RTCanwind    时间: 2023-5-27 21:24
guoxiaomi 发表于 2023-5-27 20:36
额,看来是ruby3不支持这种产生字符串的语法了。你要这样写:
以及你读这些Win32API是用作什么呢,如果是 ...

是Pokemon essentials的老版本中的调用,我没太分析过具体作用()。

**后续又出现了一个未定义问题
2023-05-27 21:14:06 +0800
Error occurs when load Data/Scripts.rxdata.
undefined method `rect=' for class `Viewport'
- 007_Sprite_Resizer.rb:450:in `<class:Viewport>'
- 007_Sprite_Resizer.rb:446:in `block in load_scripts_from_folder'

对应的脚本是
class Viewport
  unless @SpriteResizerMethodsAliased
    alias _initialize_SpriteResizer initialize
    alias _rect_ViewportResizer rect
    alias _recteq_SpriteResizer rect=
    alias _oxeq_SpriteResizer ox=
    alias _oyeq_SpriteResizer oy=
    @SpriteResizerMethodsAliased=true
  end
作者: SailCat    时间: 2023-5-27 23:16
guoxiaomi 发表于 2023-5-27 20:36
额,看来是ruby3不支持这种产生字符串的语法了。你要这样写:
以及你读这些Win32API是用作什么呢,如果是 ...

从这个角度来说,这个现象如此普遍的话,可能真的需要一个ruby 3降级支持ruby 1.8的mod了
不然几乎所有以前的插件能废一大半
作者: RTCanwind    时间: 2023-5-28 01:18
大佬我又来了(),感觉ess老版本确实有些时代眼泪了

出现的错误是
2023-05-27 22:00:54 +0800
Error occurs when load Data/Scripts.rxdata.
Exec format error
- Main:32:in `rescue in block in load_scripts_from_folder'
- Main:29:in `block in load_scripts_from_folder'
- Main:27:in `each'
- Main:27:in `load_scripts_from_folder'
- Main:40:in `block in load_scripts_from_folder'
- Main:39:in `each'
- Main:39:in `load_scripts_from_folder'
- Main:44:in `block in rgss_main'
- eval:36:in `eval'
- eval:36:in `block in rgss_main'
- eval:32:in `each'
- eval:32:in `rgss_main'
- eval:60:in `load_script'
- eval:23:in `load_script'
- eval:23:in `load_script'
- eval:69:in `<main>'
- ruby:in `load_script'

相关代码是负责从文件夹读取脚本的部分
RUBY 代码复制
  1. def load_scripts_from_folder(path)
  2.   files   = []
  3.   folders = []
  4.   Dir.foreach(path) do |f|
  5.     next if f == '.' || f == '..'
  6.     (File.directory?(path + "/" + f)) ? folders.push(f) :  files.push(f)
  7.   end
  8.   files.sort!
  9.   files.each do |f|
  10.     code = File.open(path + "/" + f, "r") { |file| file.read }
  11.     begin
  12.       eval(code, nil, f)
  13.     rescue ScriptError
  14.       raise ScriptError.new($!.message)
  15.     rescue
  16.       $!.message.sub!($!.message, traceback_report)
  17.       raise_traceback_error
  18.     end
  19.   end
  20.   folders.sort!
  21.   folders.each do |folder|
  22.     load_scripts_from_folder(path + "/" + folder)
  23.   end
  24. end
  25.  
  26. load_scripts_from_folder("Data/Scripts")



作者: guoxiaomi    时间: 2023-5-28 08:43
RTCanwind 发表于 2023-5-28 01:18
大佬我又来了(),感觉ess老版本确实有些时代眼泪了

出现的错误是

这里不是读取有问题,而且被读取的代码有问题,因为抛出了scripterror。你需要在32行前面加一些调试信息,输出报错的代码位置。或者可以不捕获错误,让rgm来接管异常处理:29到36行只保留30行就行。然后根据报错提示去排查。
作者: RTCanwind    时间: 2023-5-28 12:25
guoxiaomi 发表于 2023-5-27 20:36
额,看来是ruby3不支持这种产生字符串的语法了。你要这样写:
以及你读这些Win32API是用作什么呢,如果是 ...

上面的Win32API的问题 似乎是用来找游戏窗口的
进行如上修改以后 点开Game,RGM不抛出错误,黑屏无响应
Ess给出以下错误:
Exception: RuntimeError
Message: Can't find RGSS player window

Backtrace:
004_Win32API.rb:31:in `pbFindRgssWindow'
RUBY 代码复制
  1. def Win32API.pbFindRgssWindow
  2.     return @@RGSSWINDOW if @@RGSSWINDOW
  3.     processid = [0].pack('l')
  4.     threadid = @@GetCurrentThreadId.call
  5.     nextwindow = 0
  6.     loop do
  7.       nextwindow = @@FindWindowEx.call(0,nextwindow,"RGSS Player",0)
  8.       if nextwindow!=0
  9.         wndthreadid = @@GetWindowThreadProcessId.call(nextwindow,processid)
  10.         if wndthreadid==threadid
  11.           @@RGSSWINDOW = nextwindow
  12.           return @@RGSSWINDOW
  13.         end
  14.       end
  15.       break if nextwindow==0
  16.     end
  17.     raise "Can't find RGSS player window"
  18.   end

作者: RTCanwind    时间: 2023-5-28 18:50
RTCanwind 发表于 2023-5-28 12:25
上面的Win32API的问题 似乎是用来找游戏窗口的
进行如上修改以后 点开Game,RGM不抛出错误,黑屏无响应
E ...

不知道为什么站内的上传附件一直在请稍后
https://wwjk.lanzoub.com/i12PS0xj7z9e
作者: guoxiaomi    时间: 2023-5-30 00:14
本帖最后由 guoxiaomi 于 2023-5-30 00:20 编辑
RTCanwind 发表于 2023-5-28 18:50
不知道为什么站内的上传附件一直在请稍后
https://wwjk.lanzoub.com/i12PS0xj7z9e ...


基本上都是win32api的格式改动,大概改了10处吧,你可以对照看看。现在运行Game.exe的报错是找不到Animations.rxdata文件,说明脚本语法已经基本通过了,后续还有什么bug还需要运行时排查。

附上了新编译的Game.exe: test20230529.7z (5.6 MB, 下载次数: 7) ,相关的改动会在下一次发布RGM时同步。
作者: RTCanwind    时间: 2023-5-30 01:49
guoxiaomi 发表于 2023-5-30 00:14
基本上都是win32api的格式改动,大概改了10处吧,你可以对照看看。现在运行Game.exe的报错是找不到Animat ...

感谢~~
单独运行确实是到Animations.rxdata这步,不过在工程里运行时还有一些脚本报错,如
- 013_PictureEx.rb:114:in `new'
- 013_PictureEx.rb:114:in `initialize'
- 002_EventScene.rb:122:in `new'
- 002_EventScene.rb:122:in `addImage'
- 003_Scene_Intro.rb:10:in `initialize'
- 003_Scene_Intro.rb:130:in `new'
- 003_Scene_Intro.rb:130:in `main'
好像是Rect的初始化问题?
这里把v18.dev的原始工程(49M)传上来了,大佬如果有空再帮忙看看()
https://wwjk.lanzoub.com/igru70xnri8f
作者: 纯属小虫    时间: 2023-5-30 18:54
本帖最后由 纯属小虫 于 2023-5-31 17:27 编辑

2023.05.30
试了试自己的工程,尝试能不能移植(抱紧大佬大腿死缠烂打)

第一次错误报告



请问,问题是出在【对话】的两个脚本,以及【技能】●装备状态附加  这个脚本中码?
还是说我操作错了,我只把【Game.exe】丢到旧工程里替换了一下




2023.05.31
发生错误的代码


这个出错的代码是从图书馆里顺来的,感觉...内容有些高级,没太理解~~

出错的地方是这里
$WEAPONSKILLS_ORIG_ACTOR = Game_Actor.clone unless $WEAPONSKILLS_ORIG_ACTOR
class Game_Actor < $WEAPONSKILLS_ORIG_ACTOR



2023.05.31
然后有一处bitmap相关的错误。。。。
呼,完全超出修改能力之外了。。。。

另一处 error.log

发生错误的代码


这是用于烛光系统Bitmap相关的,也是从图书馆顺来的,
更...更改不来了


作者: guoxiaomi    时间: 2023-5-30 21:51
本帖最后由 guoxiaomi 于 2023-5-30 22:34 编辑

1.0.3已更新,主要添加了鼠标功能。注意Graphics.set_title和Graphics.set_fullscreen已经移除,相关代码移动到RGM::Ext::Window模块下。
以下是本次更新日志:

## 1.0.3 - 2023-05-30
### 修复
- 在Bitmap#font_size函数的C++实现中,将两个未初始化的变量初始化为0。
- 在controller_buttonmap和key_map的各个函数中,显式指定作为函数参数的元素类型为std::pair类型。
- 添加了Viewport#rect=方法。

### 优化
- config.rb中的修改窗口标题、全屏和修改窗口分辨率改为调用RGM::Ext::Window的模块方法。
- Graphics中的update_fps方法改为调用RGM::Ext::Window的模块方法。
- 在读取config之前先等待所有的worker,原来是在rgss_main的开头,即读取scripts.rxdata之前。

### 新增
- 新增了mouse.rb,实现了RGM::Ext::Mouse模块,以提供鼠标功能。提供以下方法:
  - `position` 返回鼠标当前的位置,对全屏模式或者分辨率扩张的场合,此位置会自动映射到正确的坐标。
  - `raw_position` 返回鼠标的当前的位置,未经过坐标映射。
  - `press?` 检查鼠标某个按键是否被按下,目前支持LEFT/MIDDLE/RIGHT/X1/X2共5个按键。
  - `trigger?` 检查鼠标某个按键是否刚刚被按下。
  - `double_click?` 检查鼠标的某个按键是否被双击,默认是帧数的1/3,也就是1/3秒内按下被识别为双击。
  - `double_click_interval=` 设置双击的判定间隔,单位是帧数,范围只能在1~63帧之间。
  - `wheel_down?` 检查鼠标滚轮是否在向下滚动。
  - `wheel_up?` 检查鼠标滚轮是否在向上滚动。
- 新增了window.rb,实现了RGM::Ext::Window模块,用于管理窗口,包括修改分辨率、全屏和获取HWND等。部分原来在Graphics模块中功能被移动到此类中。提供以下方法:
  - `set_title` 设置窗口标题,原属于Graphics模块中的功能。
  - `set_fps` 设置 FPS 的值。设置为nil不显示FPS,设置为-1则显示 Sampling...
  - `set_fullscreen` 设置全屏模式,原属于Graphics模块中的功能。
  - `resize` 重设窗口大小。
  - `refresh_size` 在全屏模式下,获取窗口真实的大小。
  - `cast_to_screen` 在全屏模式下,将鼠标在窗口中的坐标映射到屏幕中的坐标。
  - `get_hwnd` 获取窗口的 HWND,此值只在Windows操作系统有效,其他操作系统始终返回0。

### 删除
- 移除Graphics的@@screen_width和@@screen_height,改为使用@@width和@@height。
- 移除Graphics#set_title和Graphics#set_fullscreen方法。相关功能在RGM::Ext::Window中实现。

作者: miantouchi    时间: 2023-5-31 17:09
guoxiaomi 发表于 2023-5-30 21:51
1.0.3已更新,主要添加了鼠标功能。注意Graphics.set_title和Graphics.set_fullscreen已经移除,相关代码移 ...

范例里面鼠标功能如何开启?
作者: guoxiaomi    时间: 2023-5-31 22:17
本帖最后由 guoxiaomi 于 2023-6-6 02:21 编辑
纯属小虫 发表于 2023-5-30 18:54
2023.05.30
试了试自己的工程,尝试能不能移植(抱紧大佬大腿死缠烂打)


第一种写法我也是第一次见到,似乎是为了避免使用alias,改用类继承类自身的clone。这个写法属实逆天,你这个脚本是完整的吗?如果是完整的我可以修改一下。下面那个调用了外部32位的tktk_bitmap.dll,而且还是操作Bitmap的dll,RGM是不兼容的。如果想实现那些效果,可以用RGM自带的Bitmap的功能,也可以等后续我有空了写一个类似的。

对比一下两者的区别:
1. 不需要进行对自身的clone和继承;
2. 对于函数skills中出现的super,改用alias来代替。首先alias此函数(24行)创建一个别名,然后把super换成此函数别名(27行)。
RUBY 代码复制
  1. #===============================================================================
  2. # ● 【简易坑爹系列】武器、装备与状态的附加特技
  3. #===============================================================================
  4. class Game_Actor
  5.   WEAPON_SKILLS = {}
  6.   ARMOR_SKILLS = {}
  7.   STATE_SKILLS = {}
  8.   #----------------------------------------------------#
  9.   # 设置区域
  10.   #
  11.   # 设置方法:STATE_SKILLS[状态id] = [特技id]
  12.   #           WEAPON_SKILLS 与 ARMOR_SKILLS 同理
  13.   #           当特技id为负值时则删减该技能
  14.   #           不论顺序,删减技能一并落后处理
  15.   #----------------------------------------------------#
  16.  
  17.   WEAPON_SKILLS[5] = [5] # 匕首 致命一击
  18.  
  19.   ARMOR_SKILLS[63] = [4] # 软木盾 盾防
  20.  
  21.   # STATE_SKILLS[74] = [23]#鱼人仿息  悬浮水膜
  22.  
  23.   #----------------------------------------------------#
  24.   alias _origin_skills skills
  25.  
  26.   def skills
  27.     output = _origin_skills | (WEAPON_SKILLS[@weapon_id] || [])
  28.     [@armor1_id, @armor2_id, @armor3_id, @armor4_id].each { |a| output |= ARMOR_SKILLS[a] || [] }
  29.     @states.each { |s| output |= STATE_SKILLS[s] || [] }
  30.     output.each do |s|
  31.       if s < 0
  32.         output.delete(s.abs)
  33.         output.delete(s)
  34.       end
  35.     end
  36.     output.sort
  37.   end
  38.  
  39.   def skill_learn?(skill_id)
  40.     skills.include?(skill_id)
  41.   end
  42. end

作者: b565185756    时间: 2023-6-4 15:46
掌握了RGM就是掌握了毁灭宇宙的终极力量!但这一切都在一只可爱极致的加菲猫先生手上!!!
作者: guoxiaomi    时间: 2023-6-6 02:08
本帖最后由 guoxiaomi 于 2023-6-6 02:18 编辑
RTCanwind 发表于 2023-5-30 01:49
感谢~~
单独运行确实是到Animations.rxdata这步,不过在工程里运行时还有一些脚本报错,如
- 013_Pictur ...


做了大概13处修改了吧,大的bug没有了,可以正常进入到游戏里。


其实有很多功能是RGM自带的,Pokemon Essentials自己又实现了一遍,就很蛋疼,如果能请Pokemon Essentials的作者专门用RGM重制一遍就完美了,生态+1。

当然借此我也找到了RGM的几处bug,下个版本1.0.4会修复,附件里的Game.exe是已经修复的版本。

具体的改动可以查阅fix.log。然后建议你把PBS文件夹里的文本文件都用记事本重新保存一下,选择编码为utf-8。
附件(1个月后会删除):
https://7niu.gxmatmars.com/p1/RG ... %20-%20modified.zip

度盘链接: https://pan.baidu.com/s/1V75OpCKKX8KrBgeZyAEouw?pwd=3x59 提取码: 3x59 复制这段内容后打开百度网盘手机App,操作更方便哦

目前没搞定的地方是无法点击X关闭程序,以及无法正确修改窗口大小,这个我找机会再看看代码吧。

可能有人只关心fix.log

作者: 真·可乐    时间: 2023-6-6 07:26
移植的时候发现的,图块素材,文件名使用中文会报错。


ERROR档下附
RUBY 代码复制
  1. 2023-06-06 07:22:49 +0800
  2. Error occurs when load Data/Scripts.rxdata.
  3. incompatible character encodings: UTF-8 and ASCII-8BIT
  4. - eval:80:in `expand_path'
  5. - eval:80:in `block (2 levels) in find'
  6. - eval:79:in `each'
  7. - eval:79:in `block in find'
  8. - eval:78:in `each'
  9. - eval:78:in `find'
  10. - eval:42:in `initialize'
  11. - eval:74:in `new'
  12. - eval:74:in `make_tileset'
  13. - eval:66:in `tileset'
  14. - Spriteset_Map:21:in `initialize'
  15. - Scene_Map:13:in `new'
  16. - Scene_Map:13:in `main'
  17. - Main:16:in `block in rgss_main'
  18. - eval:31:in `eval'
  19. - eval:31:in `block in rgss_main'
  20. - eval:27:in `each'
  21. - eval:27:in `rgss_main'
  22. - eval:55:in `load_script'
  23. - eval:23:in `load_script'
  24. - eval:23:in `load_script'
  25. - eval:71:in `<main>'
  26. - ruby:in `load_script'


作者: guoxiaomi    时间: 2023-6-8 00:41
本帖最后由 guoxiaomi 于 2023-6-8 01:42 编辑

1.0.4已更新,以下是本次更新日志:

## 1.0.4 - 2023-06-07
### 修复
- Tone#new和Tone#set现在可以省略第4个参数gray,默认值是0。
- Finder#find现在会检查路径是否为文件夹,并且不会返回对应于文件夹的路径。
- 修复了Font#exist?未生效的BUG。

### 优化
- 允许Graphics#transition使用小于或等于0的duration。
- 现在可以在中文工程路径下读取中文文件名的素材。
- 现在可以读取加密包中的中文素材,不过加密包必须使用`7z a -tzip Graphics.zip Graphics -scsUTF-8 -p123`指令制作,否则文件名不会以UTF-8的格式保存。
- 范例里的箱子事件现在会读取加密包中的中文文件名素材“加菲猫.jpg”。

### 新增
- Graphics.zip已更新。如果使用RGM小助手,请删掉misc.7z然后更新RGModern。
作者: RTCanwind    时间: 2023-6-8 02:42
本帖最后由 RTCanwind 于 2023-6-8 02:54 编辑
guoxiaomi 发表于 2023-6-6 02:08
做了大概13处修改了吧,大的bug没有了,可以正常进入到游戏里。


试了一下佬改的版本,记录一下遇到的问题
1.Message: undefined method `exists?' for File:Class
File似乎也需要exists?方法?
2.文本字体似乎会被强制缩放为撑满文本框。
3.部分操作Error occurs when load Data/Scripts.rxdata.怀疑与第五步修改有关系。
作者: 纯属小虫    时间: 2023-6-8 13:17
本帖最后由 纯属小虫 于 2023-6-8 13:24 编辑

试了下窗口放大,特别完美!
应该能够完全平替之前用过的一个画面放大脚本了。
原画面放大脚本1
原画面放大脚本2


不过config里面的 System 中的各个值,能否当变量用呢?或者根据玩家的屏幕大小来做适应性的整数缩放。
如 WindowWidth 和 WindowHeight  我想做成游戏中按键操作后才会 * 2 的效果 (因为有些人的屏幕分辨率很小,或者很大)



再来就是烛光效果的移植,因为涉及了bitmap,无法兼容了~~
这个插件里面bitmap相关的内容还挺多的,虽然自己没有用过,不过看上去好酷炫的样子!
如果RGM能统统合并过去最好不过了(啥也不干还要求贼多的伸手党先自罚一巴掌)


Bitmap 追加 for 烛光

烛光


【tktk_bitmap.dll】烛光效果相关的插件
tktk_bitmap.zip (88.68 KB, 下载次数: 5)
作者: plain666    时间: 2023-6-8 15:53
我想问一下,最低配置是多少,比如说:CPU?内存?显卡?操作系统?等等。
作者: guoxiaomi    时间: 2023-6-8 22:16
本帖最后由 guoxiaomi 于 2023-6-8 22:50 编辑
RTCanwind 发表于 2023-6-8 02:42
试了一下佬改的版本,记录一下遇到的问题
1.Message: undefined method `exists?' for File:Class
File似 ...


1. File的exists?方法在ruby3.2移除了,你要改成exist?(去掉s)
2. 这个可能是src_rect设置超过了Bitmap大小,RGM会强行把Bitmap缩放到这么大,而RGSS则会使用透明像素填满剩下的区域。需要检查一下对话文本里Sprite#src_rect的设置。
3. 既然有错误日志,那还得排查具体的报错。

===
2已经确认是这个问题,用附件替换Data\Scripts\009_Objects and windows\004_SpriteWindow.rb文件。其实只改动了一行,但是solargraph会自动format。
004_SpriteWindow.rb (27.92 KB, 下载次数: 1)

全局搜索.src_rect.set发现003_Window.rb里也有一处类似的写法。不过这个似乎没有影响到对话文本,所以就没改。
作者: RTCanwind    时间: 2023-6-8 23:48
感谢
补上之前的一个具体报错
2023-06-08 02:01:29 +0800
Error occurs when load Data/Scripts.rxdata.
ArgumentError
- eval:183:in `set'
- eval:178:in `initialize'
- 005_SpriteWindow_text.rb:1114:in `new'
- 005_SpriteWindow_text.rb:1114:in `drawCursor'
- 003_PScreen_PokedexMain.rb:62:in `refresh'
- 005_SpriteWindow_text.rb:1058:in `initialize'
- 003_PScreen_PokedexMain.rb:4:in `initialize'

[2023-06-08 23:39:44 +0800]
[Pokémon Essentials version 18.1.dev]
Exception: ArgumentError
Message: ArgumentError

Backtrace:
eval:183:in `set'
eval:178:in `initialize'
005_SpriteWindow_text.rb:1114:in `new'
005_SpriteWindow_text.rb:1114:in `drawCursor'
003_PScreen_PokedexMain.rb:62:in `refresh'
005_SpriteWindow_text.rb:1058:in `initialize'
003_PScreen_PokedexMain.rb:4:in `initialize'
003_PScreen_PokedexMain.rb:249:in `new'
003_PScreen_PokedexMain.rb:249:in `pbStartScene'
003_PScreen_PokedexMain.rb:1186:in `pbStartScreen'

此外还遇到一个问题
RGModern Internal Error:
Unrecognized audio format
这通常是由于什么原因?RGM支持哪些音频格式呢。
作者: guoxiaomi    时间: 2023-6-9 01:24
本帖最后由 guoxiaomi 于 2023-6-9 01:30 编辑
RTCanwind 发表于 2023-6-8 23:48
感谢
补上之前的一个具体报错
2023-06-08 02:01:29 +0800


这个argument error是我主动抛出的,因为width和height有一个被设置了小于0的值。你可以查看builtin.rb的183行就能看到是我主动报错的。

在005_SpriteWindow_text的1114行把可能小于0的rect.width-16改成[rect.width-16, 0].max就行。

比起原版RGSS,RGM对数据有更严格的要求。主要是为了避免在C++层出现更难排查的错误,所以在ruby层有各种范围和类型检查。根据常识,Rect的宽和高小于0是没有意义的,所以给报错了。
作者: RTCanwind    时间: 2023-6-9 08:08
本帖最后由 RTCanwind 于 2023-6-9 08:50 编辑
RTCanwind 发表于 2023-6-8 23:48
感谢
补上之前的一个具体报错
2023-06-08 02:01:29 +0800


[2023-06-09 08:04:10 +0800]
[Pokémon Essentials version 18.1.dev]
Exception: RuntimeError
Message: Finder cannot find valid path for Audio/SE/Anim/Defense Curl
路径文件夹有Defense Curl.mp3 不清楚这个是需要手动匹配后缀还是?

以及不清楚是不是因为换中文字体导致的问题,换用的是Zpix,出现无errorlog闪退
作者: guoxiaomi    时间: 2023-6-9 13:58
本帖最后由 guoxiaomi 于 2023-6-10 12:03 编辑
RTCanwind 发表于 2023-6-9 08:08
[2023-06-09 08:04:10 +0800]

Exception: RuntimeError


音乐和音效对素材的要求不一样。音乐(BGM和ME)支持mp3,wav,ogg和mid,音效(BGS和SE)只支持wav和ogg。所以Finder里只尝试匹配这几个后缀。你这里SE使用了mp3格式,你可以加上后缀,但我不确定能不能正常播放。

以下脚本会让Finder查找BGS和SE时匹配mp3格式,你可以查看finder.rb的相关内容
  1. Finder::Suffix[:sound] << ".mp3"
复制代码


无errorlog闪退,你参考一下本贴50和51楼的处理,用cmd运行Game.exe,给我最后的日志信息我好定位错误。
作者: mkl7788    时间: 2023-6-10 11:13
我将rmxp 更换 rgss3 引擎,能正常使用RGD。
然后使用RGM 打包data文件,打开game.exe闪退  工程里测试也一样闪退
作者: guoxiaomi    时间: 2023-6-10 12:30
mkl7788 发表于 2023-6-10 11:13
我将rmxp 更换 rgss3 引擎,能正常使用RGD。
然后使用RGM 打包data文件,打开game.exe闪退  工程里测试也一 ...

对VA的支持可能不会很快。 不过我猜你跑的是这个?https://rpg.blue/thread-363284-1-1.html

只要把第一个脚本去掉,并且定义几个常量,看上去rgm就可以跑起来了。
  1. $Screen_X = Graphics.width
  2. $Screen_Y = Graphics.height
  3. $Map_X=$Screen_X/32
  4. $Map_Y=$Screen_Y/32
  5. $Screen_X_2=$Screen_X/2
  6. $Screen_Y_2=$Screen_Y/2
复制代码

作者: guoxiaomi    时间: 2023-6-15 20:31
计划闭关1~2个月以重写核心模块,使用全新的数据管理和协作模式。
作者: 89444640    时间: 2023-6-16 08:46
本帖最后由 89444640 于 2023-6-16 08:54 编辑

版主,请问能不顺道能弄个无论是外挂还是内置的动画编辑器2.0版本,自打菜刀改了动画上中下的位置以后,做动画时,编辑器动画原件调节范围的限制,对我的干扰更明显了。
现在的上中下位置是这样

然后动画编辑器里,如果要做跟敌人又互动的近身攻击,调节时候是这个位置

如果仅仅是这样不动位置的平砍还好,但是别指望我能好好按规矩画只在192范围内画,某城管罗伊德曾经说过墙就是为了拆的XD,动画我是按照攻击范围576*576的范围绘制的,而默认编辑器动画原可拉动范围极其有限,每个动画原件只能在编辑器给定的640*320 +-96的范围内调节,
因为我每个敌人都有10帧替换动画做配合表演,来表现技能,比如升龙类技能敌人配合动画是被击飞的,如果仅以默认编辑器给的这么一点Y数值的位移,动画表现极其不爽,被击飞一点就消失或者无法继续往上飞了。
如图所示


请问能不能黑了这动画编辑器,最好是连这个窗口一起黑了,现在是缩放50%我每次调动画都瞎狗眼,然后让每个动画原件可拉动或者盲调到+-10086范围呢?
让菜刀看看能不能整合下版本。
作者: 765111039    时间: 2023-6-16 18:50
郭大,我这里发现个问题,我加了几首BGM,是MP3格式的,然后我在一个地图用了默认的那些MID格式的,然后进入该地图后,然后去其他地方,MP3格式的BGM放不出来了,应该是切换了,因为音乐停了,但是没有声音。如果使用MID的背景音乐才会正常有声音
作者: guoxiaomi    时间: 2023-6-16 19:34
本帖最后由 guoxiaomi 于 2023-6-18 16:32 编辑
765111039 发表于 2023-6-16 18:50
郭大,我这里发现个问题,我加了几首BGM,是MP3格式的,然后我在一个地图用了默认的那些MID格式的,然后进 ...


偶尔也会有mp3放不出来的情况,但我还没查出问题在哪。

我在范例的音乐测试事件里也提到了这个问题,好像在播放mp3音乐前先使用Audio.bgm_stop或者Audio.bgm_fade关掉音乐,再播放就没问题。

试一下在Game_System中打个补丁吧,bgm_play之前先stop。
补充:Game_System中有4处volume,在后面添加上 * 128 / 100 将音量扩大就行,参见下面的代码。
  1.   #--------------------------------------------------------------------------
  2.   # ● 演奏 BGM
  3.   #     bgm : 演奏的 BGM
  4.   #--------------------------------------------------------------------------
  5.   def bgm_play(bgm)
  6.     @playing_bgm = bgm
  7.     if bgm != nil and bgm.name != ""
  8.       Audio.bgm_stop # 在播放之前停止BGM
  9.       Audio.bgm_play("Audio/BGM/" + bgm.name, bgm.volume * 128 / 100, bgm.pitch) # 扩大音量到原来的1.28倍
  10.     else
  11.       Audio.bgm_stop
  12.     end
  13.     Graphics.frame_reset
  14.   end
复制代码



作者: 765111039    时间: 2023-6-20 18:06
郭大,额  我这里发游戏给别人了 ,经常闪退,然后报这个错误

ELB_Z4V`FE9FV@VH$_WRGDQ.png (49.69 KB, 下载次数: 37)

ELB_Z4V`FE9FV@VH$_WRGDQ.png

作者: 小秋橙    时间: 2023-6-29 20:38
私以为RGSS这几代(xp vx vxa)的第三方运行时最应该考虑的是如何支持非Windows系统(如MacOS、Linux或移动端)……
作者: shitake    时间: 2023-7-6 16:19
  1. $ make Game.exe
  2. compile src/lib/lib.hpp.gch
  3. make: *** [Makefile:119: src/lib/lib.hpp.gch] Error 1
复制代码


您好 这个问题是什么原因导致的?
顺便,我在 GitHub 上提交了 issue 如果看到希望能回复一下
作者: aoaoxlxlqq    时间: 2023-7-8 18:27
本帖最后由 aoaoxlxlqq 于 2023-7-8 19:30 编辑

感谢大佬!
偶然发现一个与原版不一样的地方
这是我很早前一个搞了一半的ARPG工程,如图BGM淡出20秒,应该是当时写错了,但是原版运行没毛病,20帧后就换BGM了,用了RGM则是要等完这20秒的淡出,然后才切歌

不知大佬之后会不会增强一下音频模块,我测试这个ARPG,双方人马群殴起来,音效一多经常会有缺失
最开心的是Tilemap大小的限制给解除了,再也不用多建几个Viewport去拼,直接把Spriteset_Map的viewport1和窗口改大就能显示大片地图啦~
另外请教一下,我很想写个脚本来支持48*48的地图,设想中大概是这样:画地图的时候用等比缩成32的临时元件图来画,实际游戏时则读取并显示对应的48的图,这样也不用重写编辑器,用起来也不会太麻烦
但是我本身就菜,而且已经好久没碰RM了,现在正在使劲复习中,所以恳请大佬指点一下,应该改动的地方大致有哪些?以及不会碰到底层的东西吧?这个我就完全无能为力了
我觉得这个功能意义重大,比支持3D模型什么的都大,而且工程量估计也不多,大佬可以考虑RGM要不要直接支持一波哩(不是无耻伸手,如果大佬不做我也会尽力尝试的,成功的话也会分享,但是真心觉得这个功能有助于RGM拓展更多新用户,而不会只有老工程翻新的作用,总之无论如何都非常感谢!


忘了汇报BUG了,改了画面大小之后,每次切换场景和地图的时候,画面都会有一瞬间被缩小了,有渐变过渡的话要等执行完渐变完才复原,是冻结画面的时候大小被写死了吗?
还有一个更奇葩,范例工程没做任何改动,上二楼音乐测试房间,不碰任何东西进入绘制测试,再回来打开改分辨率的开关,之后每个事件包括主角身后就会多了个背后灵,重复触发开关还会继续增员。。笑死

作者: aoaoxlxlqq    时间: 2023-7-10 15:00
BUG后续
发现执行死循环的时候无法右上红叉关闭游戏,原版是可以的,类似的,我那个BGM淡出20秒期间,点红叉会程序无响应,要等完这20秒才关闭
背后灵的BUG,我改大了窗口和地图视口,以及删除01入口地图上楼梯那里的side窗口公共事件这行(不明白这行事件的用意),然后就无法再触发这个BUG了。。(单是删掉那行事件的话还是会触发的
54楼的黑斑BUG我也遇到了,感觉几率不算太高,一般开关一下菜单就恢复正常了,少数时候不行,人物出现那个开关对症状完全没有影响
黑斑是透明的,如图,我在后面垫了张蓝天背景就透出来了

似乎基本只出现在自动元件上,尤其是带动画的出现几率最高,一般只在某一帧出现,所以一闪一闪的,草地这种静止的也偶有发生,普通图块目前还没发现过
再者是只在大地图出现,而且我改大视口之前没发生过,试过简单把地图扩大成500*100,发病率好像会更高一点点,除了海滩之外其它小地图没发现过,我显卡3080

最后48*48图块的事,大致看了下,貌似得动render_tilemap.hpp里面的东西。。。算了我这种低端玩家还是告辞吧,而且就算勉强改成了将来RGM更新还麻烦,还是蹲一个大佬亲自出手
作者: aoaoxlxlqq    时间: 2023-7-16 19:27
大佬这是出关了吗,辛苦了

问题可能就出在d3d9吧,一直用的9,后来我改11就再没触发了,但是set_pixel也没了呀。。。opengl暂时没测试过
另外音频还有BUG,有几次从海滩返回绘制测试的时候,把BGS海浪声也给带过去了,没停
我完全不懂MIDI,只模糊地知道声音跟。。叫音源还是音色库来着。。有关,但是RGM的声音听起来,不像我之前用的转MP3软件变味得那么夸张,还是跟原版很相似的,只是感觉非常地闷,这又是什么原因啊?
以及同时只能播一条音效这个太蛋疼了,。。想问下RGM有没有可能突破?

-------
我在config里改大了窗口:
WindowWidth=1920
WindowHeight=960
ScreenWidth=1920
ScreenHeight=960
然后稍微动了动脚本↓



这样镜头是对准主角了,在大地图上也能限制住镜头移动范围
但是小于(20*3)*(15*2)的地图,仍然是左上对齐的,这个小问题看着简单,实际想了想,貌似竟然是无解的?唯一的办法就只能把地图扩大到至少60*30格了
倒也行吧,不过地图无限平铺是BUG吧?以及天气仍然是锁640*480的,真是牵一发动全身


--------
不想烦人,如果大佬真不想搞的话我今后就不再主动提了,但是请允许我最后一次:
一人血书48*48地图!

没办法底层那些我实在是盲区了,大佬可以稍微讲一下难点吗?
脚本这边应该是比较容易的,不过我一直没明白为啥非要128/4,单纯是为了移动计算精确吗?如果改48了是不是直接192/4就行?
作者: guoxiaomi    时间: 2023-7-24 23:01
aoaoxlxlqq 发表于 2023-7-16 19:27
大佬这是出关了吗,辛苦了

问题可能就出在d3d9吧,一直用的9,后来我改11就再没触发了,但是set_pixel也没 ...

1. 音效应该可以多放,最多支持8声道的。
2. d3d11其实是有set_pixel的,只是没有get_pixel。
3. midi的音效库可以自己下载,去config.ini里设置,不过建议弃用midi,这已经是旧时代的技术了
4. 地图平铺是feature,rmxp也是平铺的,取消平铺可以设置@[email protected]_y=false
5. 48x48做不了主要是自动元件和tileset的格式限制比较死,但是并非绝对做不了,需要想一个好方案

音乐的事情我记下来了,不过按照目前的进度我估计9月才能继续修bug
作者: aoaoxlxlqq    时间: 2023-7-25 12:56
谢谢回复
声道和get_pixel是我记错了不好意思,声道的问题可能是因为我那工程音效略多,又经常中断或缺失,所以感觉像是同时只能播一条,有可能还是音频bug相关
不太清楚大佬说的格式限制是什么情况,不过自动元件应该是让素材来适应程序会比较简单吧,做个脚本批量把MV的自动元件重新排布成XP格式,XP这边只要把图块间距调大然后直接用,不改变内部逻辑,不知是否可行,不过好像一直听说RM的地图效率特别高,不知道是不是有什么针对性的优化,跟32是否有关,RGM是怎么处理的我也不懂,总之太复杂就算了吧,还是修bug优先
辛苦了
作者: zlyl_wiley    时间: 2023-8-6 19:32
本帖最后由 zlyl_wiley 于 2023-9-16 01:11 编辑

伟大的新轮子,感谢

经过测试,有一些BUG、疑问和需求反馈,一股脑列出来了

1
set_title已经移动,但使用指南暂未更新,新人容易踩坑,建议将更新信息汇总在1楼方便查阅

2
一直觉得对话框出现时会闪一下,直到我在框里加了图片,这个情况就很明显了,看抓拍到的图,像是叠加模式从减法过渡到正常的样子,连灰色的文字也曝光成白的了,虽然实际上还挺帅的,但如果是BUG的话还是修了吧,然后可以移植成可选的附加功能哈哈哈哈




3
以下脚本预期的效果是 Alt + Enter 切换全屏和窗口显示,但是实际上除了 Enter ,按 C 或 Space 也能触发, 虚拟按键的绑定不应该是双向的吧,另外我还是没搞懂如何添加新的按键,直接传递未注册的键码似乎是不支持的,下个版本可否做成自动识别是直接传递键码还是虚拟按键常量(把常量值平移放大?),原键码只监听单键,虚拟常量监听多个键,并默认开放全键盘?
RUBY 代码复制
  1. if Input.press?(23)
  2.       if Input.trigger?(13)
  3.         RGM::Ext::Window.set_fullscreen($full_screen ? 0 : 1)
  4.         $full_screen = !$full_screen
  5.         return
  6.       end
  7.     end


4
input.rb中有句注释:“RGM 会在按键抬起的那一帧判定为 trigger”,实测好像并不是这样,而是在按下的那一帧触发,当然这样更好,否则鼠标拖拽还不好做了,这里只是问一下是否笔误
还有非常需要隐藏鼠标,甚至锁定鼠标,否则鼠标模块是没有灵魂的
窗口是否焦点和鼠标移入移出判断是已存在的,但不知如何获取,求教
(编辑)仔细一想还是需要抬起时的判定的,因为实际上经常会有这样的操作:在元件上按下左键后,如果抬起前鼠标发生位移,则开始拖拽(或移出范围后不触发点击),若抬起时鼠标未移动,才判定为点击

5
TextBox非常值得继续强化,感觉很快就会有人接入AI聊天了呢
建议增加Shift+左右键选取部分文本功能,可以考虑顺便增加鼠标选取操作
目前字体不能设置,简单添加attr_accessor :sprite可以凑合,但是@textbox.sprite.bitmap.font.size也很怪,或可弄个font_size和font_name属性
希望开放设置确认按键,支持限制输入长度,并增加输入过滤功能,例如:可以设置按小键盘回车键确认,并限制输入范围为0-9的4位数字(感觉目前的应用场景还是输入密码居多)
需要随时修改输入框中内容的方法,毕竟是游戏引擎,这个玩法就多了,而且做工具时也有很多用处,例如检测到输入左括号时,自动补全右括号并把光标移动到括号中间
建议开放自定义光标样式,可以update(自己做动画效果)

6
需要在程序退出(红X和Alt+F4)时调用函数,用于自动存档和META整活

7
需要隐藏控制台,但不关闭(关闭后IO会受阻),试过用vbs脚本调用RGM并设置后台运行,但结果两个窗口一起钻后台去了……
(编辑)正考虑写一些工具,为了方便与编辑器联动,最好能实现窗体置顶,(虽然能获取句柄但我不懂WINDOWS……
另外传递中文数据时经常乱码,看着不像编码的问题,但我还是尽力尝试设置了内外环境的编码,结果仍无法正常工作,疑似某个环节的to_string之类的方法有问题?
(编辑)我好像发现了,应该是dump了对吗……能否去掉……
  

8
建议增加整体打包功能,不为防盗,只是从游戏设计的角度出发,希望阻止玩家竭尽所能地破坏自身的游戏体验而已,多一道坎,让普通玩家懒得寻求破解就足够了

9
非常需要高效的蒙板功能,逐像素一get一set(原图r,g,b,原图a - 蒙板a)的话实在太贵了,用Palette也不可能经得起update,请求从底层开发一个最便宜的
希望增加反色的blend_type
另外进入战斗画面的那个渐变过渡能否挪出来平时给Sprite什么的用用?

10
看说明的意思是只要释放Viewport,里面的东西就都不用手动dispose吗?
顺便Plane不要求指定Viewport了,会有什么不同吗?

11
音频的BUG似乎是淡出时会卡线程?而且奇怪的是一旦触发BGM无声BUG之后,即使重启电脑也不会复原,必须在游戏中另一处位置正常触发播放音乐才能解除,以及有无声BUG的地方是固定会触发的,很可能都是在渐隐之后

12
补充一点,建议天气的范围和数量根据屏幕大小动态调整
其它的就不赘述了,感觉最迫切的就音频BUG了

13
最后一点个人的感想:现在RM在大众眼里的印象并不是很好,处在鄙视链底端不说,甚至被有些人贴上了黄油引擎的标签,所幸现在还有像郭大这样的大神在持续给XP注入新的生命,真的非常感动,但是话说,我个人觉得光是性能的提升,还是很难有大的改观的,很容易给路人玩家“只是现在电脑升级了”的感觉,所以我非常盼望未来RGM在功能上也能展现出morden的一面,但只要提供一些最基础实用的功能接口就行,比如我会期待RGM加入简单的几何绘图API,常用shader预置(模糊、描边、通道偏移、空气扰动之类),以及类似RGD的音频滤镜等等,从实质上提升RMXP的表现力,换言之就是希望能给XP多加技能点,要LEVEL UP而不是疯狂奶血再苟一阵,当然我这么说也是很不负责任啦,但无奈水平实在有限,只是一家之言请别介意,另外48地图我基本是整出来了,不过还有另外一些构想,所以大概迟些再发,大大就请专心捉虫吧


就这些了,再次感谢




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1