目录 / Contents
- 简介 / Introduction
- 使用方法和下载 / Instructions and Download Link
- API 参考 / API Reference
- 与 RGSS3 的差异 / Difference with RGSS3
- Shader 参考 / Shader Reference
- 兼容性 / Compatibility
- 使用约定 / Terms of Use
- 更新记录 / Update Log
简介 / Introduction
RGDirect (RGD) 是对 RPG Maker VX Ace (RMVA) 的脚本系统 RGSS3 的部分重新实现和功能扩展。它的主要作用是提升游戏的绘图效率、增强绘图扩展性,同时修正一些存在于原版 RGSS3 的漏洞。
RGD 使用 DirectX9 重新实现了 RGSS3 的 Bitmap, Graphics, Viewport, Sprite, Tilemap 和 Plane 绘图相关类和模块,利用 GPU 资源,使得绘制大地图、大图片、较多旋转缩放精灵的时候足够高效,杜绝了原版 RGSS 的卡顿现象。RGD 内置了 Sprite 和 Viewport 的 shader 接口,可以很方便地添加实时计算的自定义特效代码。位图操作方面,RGD 在实现原有操作的基础上,文字绘制内置了采用像素字的选项,可以不依赖外部 DLL 绘制像素字体。在图像绘制之外,RGD 加入了鼠标输入的功能,可以使用 Mouse 模块方便地获取鼠标的位置和按键状态。
这项工作由我和 Fux2 共同完成。Fux2 负责所有 C++ 代码和 Ruby 交互、Ruby 对象处理以及描绘文字相关的功能,我负责 D3D 绘图相关的功能。感谢 Mayaru 绘制了 RGD 的形象和图标文件。
如果有任何询问或意见,请在此处回复或发送邮件到 cirno@live.cn。
RGDirect (RGD) is a partial reimplementation and functional extension of the script system of RPG Maker VX Ace (RMVA), RGSS3. The main purporse of this project is to enhance the rendering efficiency, expansibility and to fix some bugs on original RGSS3.
RGD reimplements graphical classes and modules in RGSS3, Bitmap, Graphics, Viewport, Sprite, Tilemap and Plane, using DirectX9 technique. The performance for drawing maps, images of large size and scaling, rotating sprites of large number with GPU is greatly higher compared to the lag in RGSS3. RGD has a built-in shader interface in Sprites and Viewports which is used for real-time custom effect code. On bitmap operations, besides the operators in RGSS3, RGD implements built-in pixel font option without using external DLLs. In addition, RGD implements mouse input. You may use module Mouse to get mouse position and button status easily.
This work is completed by Fux2 and me. Fux2 completed all the communications between C++ and ruby, and functions on drawing texts. I completed the functions related to D3D rendering. Many thanks to Mayaru for drawing the character and icons of RGD.
If you have any questions or advice, please reply to this post or send email to cirno@live.cn.
Please support me here: Afdian Patreon
使用方法和下载 / Instructions and Download Link
下载地址 Download Link: RGDv1.5.4 RGDv1.6.1(maybe unstable)
使用此处提供的 RGD Game.exe 替换原版游戏的 Game.exe。
Replace original Game.exe with RGD Game.exe from here.
当前可用的 RGD 脚本一览:
Available RGD script list:
http://invwindy.mist.so/archives/457
请注意一些范例内置exe可能版本并非最新。
Please pay attention to the version of exe in example. They are not always the newest version.
API 参考 / API Reference
本节只显示默认 RGSS3 没有提供的接口。对于 RGSS3 已有的功能,请参考 RMVA 的 F1 帮助文档。
This section only shows interfaces RGSS3 does not provide. For existing functions in RGSS3, please refer to the F1 manual in RMVA.
Audio
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | # ===================================== # Audio # ===================================== # 模块方法 Module Methods # ===================================== [](slot_id) # 返回某个位置的槽位对象。 # 默认音频的槽位为如下。 # Returns a slot object of an ID. # Default slots are listed below. # Slot 1: BGM # Slot 2: BGS # Slot 3: ME # Slot 10 ~ Slot 20: SE # ===================================== |
Audio_Slot
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 | # ===================================== # Audio_Slot # ===================================== # 属性 Properties # ===================================== volume # 音频音量。 # Sound Volume # 0 ~ 100 # ===================================== pitch # 音高。 # Sound pitch. # 0 ~ 100 # ===================================== pan # 音频在左右声道的倾斜。 # Sound pan in left and right channel. # -100 ~ 100 # ===================================== pos # 在音频文件中的播放位置。 # Sound playing position in audio file. # integer # ===================================== loop # 音频是否循环。 # Whether the sound is looping # true / false # ===================================== # 方法 Methods # ===================================== set_filter(index, mode, data) # 给音频槽位增加一个滤波特效。 # index: 特效编号,一个槽位可以增加多个特效。 # mode: 特效数据的模式,0为时域的冲激响应,1为频域的频率响应。 # data: 特效数据。 # Add a filter effect to the slot. # index: index of effect. Multiple effects can be # added to a slot. # mode: mode of effect data. When mode is 0, data # represents impulse response. When mode is # 1, data represents frequency response. # data: data of effect. # ===================================== clear_filter(index) # 清除指定编号的特效。 # index: 要清除的特效编号。 # Clear the specific effect from index. # index: the effect index to be cleared. # ===================================== get_filter_intensity(index) set_filter_intensity(index, value) # 获取或设置特效的强度。 # 100为完全呈现经过特效后的音频,0为特效完全不启用的音频。 # Gets or sets intensity of filter. # 100 means full filtered sound. 0 means sound # without the filter effect. # ===================================== play stop # 播放/停止音频 # Plays or stops the sound. # ===================================== |
Bitmap
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | # ===================================== # Bitmap # ===================================== # 方法 Methods # ===================================== save_png(filename) # 把图片保存为 png 格式文件。 # filename: 保存的文件名(String)。 # Saves bitmap as a png file. # filename: file name to save (String). # ===================================== process_color { |color_arr| ... } # 用自定义方式读写图片的像素。 # color_arr: 图片的所有像素(ColorArray)。 # Manually reads/writes image pixels. # color_arr: all pixels in bitmap (ColorArray). # ===================================== |
Input::Controller
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | # ===================================== # Input::Controller # ===================================== # 模块常量 Module Constants # ===================================== states # 包含手柄状态(Controller::ControllerState)的数组。 # 总共支持4个XInput(XBOX360)手柄。 # Array containing game controller states # (Controller::ControllerState). # Up to 4 XInput (XBOX360) game controllers # are supported. # ===================================== # 模块方法 Module Methods # ===================================== fisrt_state # 获取第一个活动的手柄的状态。 # 当没有手柄活动时将返回 nil。 # Gets state of first active game controller. # If no controller is active, returns zero. |
Input::Controller::State
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | # ===================================== # Controller::ControllerState # ===================================== # 方法 Methods # ===================================== left_trigger_value right_trigger_value # 获取手柄左右扳机的值(0到255) # Gets left and right trigger values of the # controller (0 to 255). # ===================================== thumb_left_x thumb_left_y thumb_right_x thumb_right_y # 获取手柄左右摇杆的 x 和 y 坐标(-32768到32767) # Gets X and Y coordinates of left and right # thumbs (-32768 to 32767) # ===================================== thumb_left_dir4 thumb_left_dir8 thumb_right_dir4 thumb_right_dir8 # 获取手柄左右摇杆四方向和八方向的朝向。 # 参考 Input.dir4 和 Input.dir8 。 # Gets 4 or 8 directional states of # left and right thumbs. # Please reference to Input.dir4 and # Input.dir8 . # ===================================== press?(button) trigger?(button) repeat?(button) # 获取对应按钮的按下、触发和持续按下状态。 # 参考 Input.press?, Input.trigger? 和 # Input.repeat? 。 # Gets the pressing, triggering and # repeating states of corresponding button. # Please reference to Input.press?, # Input.trigger? and Input.repeat? . # 接受输入的按钮如下(以数字或Symbol的形式): # Buttons received here is listed below # (in the form of code or Symbol): # 0 :DPAD_UP # 1 :DPAD_DOWN # 2 :DPAD_LEFT # 3 :DPAD_RIGHT # 4 :START # 5 :BACK # 6 :LEFT_THUMB # 7 :RIGHT_THUMB # 8 :LEFT_SHOULDER # 9 :RIGHT_SHOULDER # 12 :A # 13 :B # 14 :X # 15 :Y # ===================================== pressed_buttons # 获取当前所有正按下的按键,以数字编号的形式。 # Gets all buttons being pressed down # at present in the form of code. # ===================================== |
Font
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | # ===================================== # Font # ===================================== # 属性 Properties # ===================================== pixel # 决定字体是否像素的标签。 默认值是 FALSE。 # 一些字体在小字号下有特殊优化, # 设置 pixel 为 TRUE 可以获得更好的效果。 # Determines whether the font is pixelated. # Some fonts have special optimization # in small size and setting pixel to TRUE # leads to a better result. # ===================================== # 类属性 Class Properties # ===================================== default_pixel # 字体 pixel 属性的默认值。 # The default value of pixel property. # ===================================== |
Geometry
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 | # ===================================== # Geometry # ===================================== # 方法 Methods # ===================================== Geometry.new # 生成新的 Geometry 对象。 # Geometry 可以用来在屏幕上绘制一组三角形。 # Creates new Geometry object. # Geometry is used to draw a group of # triangles on screen, # ===================================== dispose # 释放 Geometry 对象。 # Disposes the Geometry object. # ===================================== set_point_position(triangle, point, x, y[, z = 0.5, w = 1.0]) # 设置指定三角形的指定点在屏幕上的位置。 # 1.2更新:z 和 w 用于空间变换效果。 # triangle: 指定三角形的编号。 # point: 指定点在三角形的编号(0, 1, 2)。 # x: 新设置的指定点的 x 坐标。 # y: 新设置的指定点的 y 坐标。 # z: 新设置的指定点的 z 坐标。 # w: 新设置的指定点的 w 坐标。 # Sets the position of one point in a # specified triangle. # 1.2 update: # z and w are used for spatial transforms. # triangle: triangle index. # point: index of point (0, 1, 2). # x: x coordinate of new position. # y: y coordinate of new position. # z: z coordinate of new position. # w: w coordinate of new position. # ===================================== set_point_color(triangle, point, color) # 设置指定三角形指定点的颜色。 # triangle: 指定三角形的编号。 # point: 指定点在三角形的编号 (0, 1, 2)。 # color: 设置的颜色(Color)。 # Sets the color of one point in a # specified triangle. # triangle: triangle index. # point: index of point (0, 1, 2). # color: the color to be set (Color). # ===================================== set_point_texcoord(triangle, point, x, y) # 设置指定三角形指定点的纹理坐标。 # triangle: 指定三角形的编号。 # point: 指定点在三角形的编号(0, 1, 2)。 # x: 纹理坐标 x 值(0~1)。 # y: 纹理坐标 y 值(0~1)。 # Sets the texture coordinate of one point in a # specified triangle. # triangle: triangle index. # point: index of point (0, 1, 2). # x: texture coordinate x (0 to 1). # y: texture coordinate y (0 to 1). # ===================================== effect_name effect_name=(name) clear_effect_params set_effect_param(name, value) # 1.2更新: # Geometry的shader功能,用法同Sprite。 # Shaders for Geometry. # Use them in the same way as Sprite. # ===================================== # 属性 Properties # ===================================== bitmap # 表示这个 Geometry 对象的图片。 # 设置为 nil 时不使用贴图功能。 # Refers to bitmap of the Geometry. # If it is set to nil, bitmap is disabled. # ===================================== viewport # 表示这个 Geometry 对象所在的 Viewport。 # Refers to the Viewport associated with # the Geometry object. # ===================================== visible # Geometry 的可见性,同 Sprite#visible。 # Refers to the visibility of the Geometry. # Same as Sprite#visible. # ===================================== z # Geometry 的 z 值。 # Refers to z value of Geometry. # ===================================== triangles # Geometry 所拥有的三角形数量。 # Number of triangles in the Geometry. # ===================================== |
Graphics
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | # ===================================== # Graphics # ===================================== # 模块方法 Module Methods # ===================================== window_hwnd # 获取当前游戏窗口句柄(Bignum)。 # Gets window handle of current game (Bignum). # ===================================== resize_window(width, height) # 设置游戏窗口大小(不改变游戏分辨率)。 # width: 窗口宽度。 # height: 窗口高度。 # Sets window size (without changing resolution) # width: window width. # height: window height. # ===================================== add_shader(pfunc, ppass) # 追加自定义 shader 代码。 # 可以多次使用 add_shader 追加内容。 # 增加后的 shader 在 Sprite 和 Viewport 中 # 设置效果名称和参数后生效。 # 详情见 Shader 参考部分。 # pfunc: 像素处理的 shader 代码(String)。 # ppass: 设置 pass 的 shader 代码(String)。 # Adds custom shader code. # add_shader can be used multiple times # to append contents. # Shaders added are used when name and # parameters are set to Sprites and Viewports. # See Shader Reference for detailed info. # pfunc: pixel shader code (String). # ppass: shader code for pass (String). # ===================================== is_fullscreen? # 返回当前是否正处于全屏状态。 # Returns if the game is in fullscreen mode. # ===================================== toggle_fullscreen # 在全屏状态和窗口状态之间切换。 # Toggles between fullscreen and windowed mode. # ===================================== # 模块属性 Module Properties # ===================================== vsync # 获取或设置当前是否正在使用垂直同步。 # 当 vsync 为 TRUE 时, # 画面会固定在60帧,frame_rate 不生效。 # 默认值为 TRUE 。 # Gets or sets the use of vertical sync. # When vsync is TRUE, # fps is locked at 60fps, and frame_rate # is not valid. # The default value is TRUE. # ===================================== background_exec # 获取或设置游戏是否后台运行。 # Gets of sets background execution. # ===================================== |
Input
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | # ===================================== # Input # ===================================== 模块方法 Module Methods # ===================================== press?(key) trigger?(key) repeat?(key) # 获取按键正被按下、刚被按下、按下重复触发的状态。 # key: 按键标识,共分为三种。 # 1. 游戏虚拟按键(String或Symbol) # 包括 LEFT, RIGHT, UP, DOWN, A, B, C, # X, Y, L, R。 # 它们可以被设定为不同的真实按键。 # 2. 系统按键(String或Symbol) # 包括 SHIFT, CTRL, F1, F2, F3, F4, # F5, F6, F7, F8, F9。 # 它们固定对应键盘上的按键。 # 3. RPGMaker自带的,用数字表示按键的映射(Integer)。 # 2、4、6、8分别对应方向键。 # 11 ~ 18分别对应A、B、C、X、Y、Z、L、R。 # Alt 和 F10 不包括在内,因为它们属于特殊的系统按键。 # Gets key pressing, triggering or repeating states. # key: key flags, consist of 3 types. # 1. Game virtual keys (String or Symbol) # containing LEFT, RIGHT, UP, DOWN, A, B, C, # X, Y, L, R. # They can be set to different real keys. # 2. System keys (String or Symbol) # containing SHIFT, CTRL, ALT, F1, F2, F3, F4, # F5, F6, F7, F8, F9, F10. # They are fixed keys on the keyboard. # 3. RPG Maker built-in number-to-input mapping (Integer). # 2, 4, 6 and 8 represent direction keys. # 11 ~ 18 represent A, B, C, X, Y, Z, L and R, respectively. # Alt and F10 are not included because they are special system keys. # ===================================== press_key?(key_code) trigger_key?(key_code) repeat_key?(key_code) # 判断对应代码的按键的状态。 # key_code: Windows按键代码(Integer) # 用数字表示键盘上的各种按键。 # 参考 https://docs.microsoft.com/en-us/windows/desktop/inputdev/virtual-key-codes # Determines the state of certain key-code. # key_code: Windows key codes (Integer) # Various keys represented with key code numbers. # Reference: # https://docs.microsoft.com/en-us/windows/desktop/inputdev/virtual-key-codes # ===================================== recent_pressed recent_triggered # 获取最近按下或触发的按键,用按键代码表示。 # Gets recently pressed or triggered key in key code. # ===================================== get_key_name(key) # 根据代码获取按键名称。 # Obtain key name from key code. # ===================================== get_keys_from_flag(flag) set_keys_from_flag(flag) # 获取和设置虚拟按键对应的所有实体按键。 # flag: 虚拟按键标识(String或Symbol) # Gets or Sets all real keys from # virtual key flag. # flag: virtual key (String or Symbol). # ===================================== |
L2D
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | # ===================================== # L2D # ===================================== # 属性 Properties # ===================================== viewport visible x y z zoom_x zoom_y opacity blend_type color tone effect_name # ===================================== # 方法 Methods # ===================================== lookat(x, y) set_expression(exp_name) set_random_expression() set_motion(name, index, force = false) set_random_motion(name, force = false) hit_test(area_name, x, y) get_parameter(name) set_parameter(name, value, weight = 1.0) add_parameter(name, value, weight = 1.0) clear_effect_params set_effect_param(name, value) # ===================================== |
Mouse
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 | # ===================================== # Mouse # ===================================== # 关于鼠标按键标签的约定 # 可以和 Input 一样使用 Symbol表示按键, # :L, :R, :M 分别表示左、右、中按键。 # 也可以使用数值表示, # 1、2、4 分别表示左、右、中按键。 # 可以使用 | 运算来组合多个按键, # 如果其中一个按键满足条件就返回 TRUE 。 # 按键标签参数省略时, # 表示左右中三个按键都加入判断。 # Flags on mouse buttons # You can use symbols like module Input, # :L, :R, :M represents left, right and middle # mouse buttons respectively. # You can also use numbers, # 1, 2, 4 means left, mid and right buttons. # You may use | operator to combine them. # The functions return true if one of the # buttons in combination meets the requirement. # When the button flag is omitted, # all the three buttons are added in combination. # ===================================== # 模块方法 Module Methods # ===================================== update # 已过期。刷新鼠标按键状态。 # 已经无法使用,刷新Input时自动刷新鼠标状态。 # Deprecated. Update mouse key states. # It's already disabled. # Mouse state is automatically updated # when calling Input.update. # ===================================== x # 获取鼠标相对于窗口的 x 坐标。 # Gets mouse x coordinate related to window. # ===================================== y # 获取鼠标相对于窗口的 y 坐标。 # Gets mouse y coordinate related to window. # ===================================== up?([key]) # 判断鼠标是否刚刚弹起。 # key: 按键标签。 # Determines if the button is released. # key: key flag. # ===================================== down?([key]) # 判断鼠标是否刚刚按下(与 click? 相同)。 # key: 按键标签。 # Determines if the button is clicked. # key: key flag. # ===================================== click?([key]) # 判断鼠标是否点击 (与 down? 相同)。 # key: 按键标签。 # Determines if the button is clicked. # key: key flag. # ===================================== dbl_clk?([key]) # 判断鼠标是否双击。 # key: 按键标签。 # Determines if the button is double clicked. # key: key flag. # ===================================== press?([key]) # 判断鼠标是否处于按下状态。 # key: 按键标签。 # Determines if the button is in pressed state. # key: key flag. # ===================================== scroll # 返回鼠标的滚轮位置。 # 此处获取的是滚轮的总计位置,不操作滚轮时, # 这个值将维持在之前的位置。 # Returns scroll position of mouse. # The value returned is the total position # of mouse scroll. When the scroll is not # in operation, this number will remain on # its previous value. # ===================================== move # 返回鼠标是否刚刚移动。 # Determines whether the mouse is just moved. # ===================================== set_pos(x, y) # 设置鼠标的位置。 # x: 鼠标位置的 x 坐标。 # y: 鼠标位置的 y 坐标。 # Sets mouse position. # x: x coordinate of mouse. # y: y coordinate of mouse. # ===================================== set_cursor(cursor) # 设置鼠标图形。 # cursor: 鼠标图形,系统光标数据的指针。 # Sets the cursor graphic. # cursor: pointer to system cursor graphic data. # ===================================== sys_cursor # 恢复鼠标到系统设置。 # Restores the cursor graphic to system default. # ===================================== clip clip(x, y, width, height) # 把鼠标限制在矩形中。 # x, y, width, height: 限制鼠标矩形的属性。 # 当没有参数时,消除矩形限制。 # Clips the mouse in a rect. # x, y, width, height: prop erties of rect. # When no parameter is given, the clip rect # is removed. # ===================================== set_size(size) # 设置屏幕放大时的鼠标矫正。 # size: 屏幕大小。 # 获取的鼠标 x, y 将除以 size 。 # Sets mouse adjustment when screen resizes. # size: screen scale factor. # mouse x and y will be divided with size. # ===================================== # 模块属性 Module Properties # ===================================== visible # 设置系统鼠标指针在游戏窗口内是否可见。 # Gets or sets system mouse visibility # in game window. # ===================================== |
RGD
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | # ===================================== # RGD # ===================================== # 模块方法 Module Methods # ===================================== focus_out # 需要由用户实现。 # 在窗口失去焦点时自动触发。 # Need to be implemented by user. # Triggers automatically on window # losing focus. # ===================================== focus_in # 由用户实现。 # 在窗口获得焦点时自动触发。 # Need to be implemented by user. # Triggers automatically on window # getting focus. # ===================================== |
Spine
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | # ===================================== # Spine # ===================================== # 属性 Properties # ===================================== visible viewport x y z zoom_x zoom_y opacity # ===================================== # 方法 Methods # ===================================== update() set_animation(track_index, name, loop = true) set_animation_alpha(track_index, alpha) clear_animation(track_index) set_skin(skin_array) set_bone_position(bone_name, x, y) get_event_triggered(track_id, event_name, peek = false) get_event_int_data(track_id, event_name) get_event_float_data(track_id, event_name) get_event_string_data(track_id, event_name) # ===================================== 模块方法 Module Methods # ===================================== mix_time mix_time=(val) # ===================================== |
Sprite
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 | # ===================================== # Sprite # ===================================== # 方法 Methods # ===================================== clear_effect_params # 清除已经设置的所有 effect 参数。 # Clears effect parameters set to this sprite. # ===================================== set_effect_param(param_name, data) # 添加一组 effect 参数。 # param_name: 参数的变量名称(String)。 # 需要和 shader 的变量保持一致。 # data: 参数的数据。 # 支持 Fixnum, Float 和 Bitmap 类型。 # Adds a group of effect parameters. # param_name: variable name of parameter (String). # This is the same as variables in shader. # data: data of parameter. # Fixnum, Float and Bitmap types are supported. # ===================================== start_video(path) # 在精灵上播放视频。 # path: 视频路径。 # Play a video file on sprite. # path: video directory. # ===================================== video_playing? # 获取当前是否正在播放视频。 # Gets whether a video is playing. # ===================================== # 属性 Properties # ===================================== effect_name # 获取或设置 Sprite 的 effect 名称(String)。 # 决定了 Sprite 在绘制的时候采用的 pass 名称。 # 设置为空时采用默认的 pass 。 # Gets or sets effect name of sprite (String). # This value determines the pass name used when # rendering the sprite. # If this value is empty string, the default pass # is used. # ===================================== shear_x # 获取或设置精灵沿着 x 方向上的扭曲。 # Gets or sets sprite sharing along x axis. # ===================================== shear_y # 获取或设置精灵沿着 y 方向上的扭曲。 # Gets or sets sprite sharing along y axis. # ===================================== add_child(other_sprite) # 把指定精灵添加为本精灵的子节点。 # 子节点会以上层精灵的属性为参照,包括 visible, x, y, z, # opacity, zoom_x, zoom_y, color, tone。 # 请不要循环把精灵添加为子节点,会导致卡死。 # Sets the specific sprite as a child node # of this sprite. # Child sprite refers the following properties on # its parent: visible, x, y, z, opacity, # zoom_x, zoom_y, color, tone. # Do not recurring add sprites as children, which # may cause stuck. # ===================================== remove_child(other_sprite) # 清除子节点中的指定精灵。 # Remove the specific sprite from children. # ===================================== parent # 获取当前精灵的上层。如果不存在则返回nil。 # Gets the parent of this sprite. # Returns nil if it does not exist. # ===================================== children # 获取当前精灵的所有子节点。 # Gets all children of this sprite. # ===================================== video_width # 获取当前正在播放的视频宽度。 # Gets width of the video playing on this sprite. # ===================================== video_height # 获取当前正在播放的视频高度。 # Gets height of the video playing on this sprite. # ===================================== |
Viewport
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | # ===================================== # Viewport # ===================================== # 方法 Methods # ===================================== clear_effect_params set_effect_param(param_name, data) # 同 Sprite#clear_effect_params # 和 Sprite#set_effect_param 。 # Same as Sprite#clear_effect_params # and Sprite#set_effect_param. # ===================================== save_png(filename) # 把 Viewport 的内容保存到 png 文件中。 # filename: 保存的文件名(String)。 # Saves viewport content to a png file. # filename: file name to be saved (String). # ===================================== snap_to_bitmap # 把 Viewport 的内容截图到 Bitmap 对象中。 # 返回值是新创建的 Bitmap 对象。 # Snaps the content of this Viewport into # a Bitmap. # Return value is a new created Bitmap object. # ===================================== # 属性 Properties # ===================================== effect_name # 同 Sprite#effect_name 。 # Same as Sprite#effect_name. # ===================================== add_fast_layer(z, blend_type) # 在 Viewport 中增加一层快速绘制层。 # 位于此 Viewport 并有指定 z 值的精灵将处于快速 # 绘制层中。 # 处于快速绘制层中的精灵将被批量绘制,加快速度。 # 但不能单独设置每个精灵的合成方式和 effect。 # z: 指定的快速绘制层的 z 值。 # blend_type: 快速绘制层中精灵的合成方式。 # Adds a fast display layer in Viewport. # All sprites in this viewport and have # certain z will be painted fast. # The sprites in fast layers will be painted # in batch, which is more efficient. # However blend types and effect names cannot # be set separately in these sprites. # z: z value of this fast layer. # blend_type: blend type of sprites in fast layer. # ===================================== remove_fast_layer(z) # 去除快速绘制层。 # z: 指定快速绘制层的 z 值。 # Removes a fast layer. # z: z value of the fast layer to be removed. # ===================================== clear_fast_layers # 清除所有快速绘制层。 # Removes all fast layers. # ===================================== |
与 RGSS3 的差异 / Difference with RGSS3
本节不包括上述 API 中介绍的部分。除此之外已知的 RGD 和 RGSS3 的差异有:
Graphics.play_movie 没有在 RGD 实现;在1.3版本后,Graphics.play_movie已经实现,但需求的格式为 WMV,而不是 RGSS3 的 OGV。- Bitmap 读写效率略低于 RGSS3 ,因为把修改后的纹理更新到 GPU 时有额外开销;
- RGSS3 中 Sprite 的 blend_type可以跨 Viewport 起作用,但 RGD 中由于实现方式差异, Viewport 之间的合成相互独立,上层的加法、减法合成不能作用在下层。
RGD 取消了 RGSS3 的 F1 设置界面,用“关于”代替。在1.3版本后,F1 的“关于”已经取消,提供了自定义的游戏设置、按键设置脚本可供使用。
This section does not include API differences above. Other known differences between RGD and RGSS3 include:
Graphics.play_movie is not implemented in RGD;After version 1.3, Graphics.play_movie has been implemented, but video format requirement for this function becomes WMV, rather than OGV in RGSS3.- Performance of Bitmap operators is slightly lower than RGSS3, because of extra overhead when updating modified texture to GPU.
- blend_type in Sprites of RGSS3 can work across Viewports, while Sprites with additive and subtractive blend types in higher viewport in RGD cannot work with lower viewport since the difference in implementation methods of Viewport.
RGD removes F1 config dialog in RGSS3 and replaces it with “About” dialog.After version 1.3, “About” dialog has been replaced with a custom game and control setting script.
Shader 参考 / Shader Reference
English is currently not available in the first parts of this section. Sorry.
RGD 中的 shader / Shader in RGD
RGD 使用 shader 的方式为首先在 Graphics 中添加相应代码,再在 Sprite 和 Viewport 中设置对应的名称和参数去启用 shader 特效。Graphics.add_shader 分为两部分:主函数部分和 pass 定义部分。所有的 shader 都使用 HLSL 语言。
The way RGD using shaders is to add them in Graphics first, then to set corresponding name and parameters in Sprites and Viewports to enable shader effects. Graphics.add_shader is divided into two parameters: main function part and pass definition part. All the shaders use HLSL here.
对于主函数部分,一个通用的例子,也是 RGD 的默认 shader 展示如下。本案例中使用的函数都可以在自定义 shader 中调用。
For the main function part, a common example is demonstrated here, which is also the default shader in RGD. All the functions used in this case can be arbitrary called in custom shaders.
1 2 3 4 5 6 7 8 9 10 | PS_OUTPUT PS(float4 color : COLOR0, float2 texcoord : TEXCOORD0) { float4 res = samp(texcoord); res = ColorMap(res); res = BushMap(res, texcoord); res *= color; res = ToneMap(res); res.rgb *= res.a; return GetOutput(res); } |
这一段函数是在 GPU 中每一个用上这段 shader 的像素都会独立执行一遍的,它们之间唯一的不同是传入的参数差别。下面分析上述函数的意义和作用:
This piece of function is executed on every pixel that GPU used the shader on. The only difference between these function executions are parameters. Now we analyse the function above:
首先上述函数中用到了 float4 和 float2 这些类型。它们是 HLSL 中的矢量格式,分别表示4个和2个 float 构成的矢量。它们可以进行逐位的加减乘除等操作,也可以使用 color.r, color.g, color.b, color.a(rgba 可以换成 xyzw)访问它们的分量。更进一步地,可以用 color.rg, color.rgb 等组合来用更小的向量形式一次性表示它其中好几个分量。
First the function above used data types like float4 and float2. They are vectors in HLSL, meaning vectors constructed with 4 floats or 2 floats. Vectors can be added, subtracted, multiplied and divided. You can also use color.r, color.g, color.b and color.a (rgba can replaced by xyzw) to access its components. Further more, you can use combinations like color.rg, color.rgb to represent multiple components as smaller vectors.
对于函数的定义,两个参数的格式是 name : SEMATIC。其中 name 表示参数名称,和 C 的函数参数相同;SEMATIC 表示它在 shader 中的使用方法和传递过程。color : COLOR0 是表示(顶点插值后)颜色的属性,texcoord : TEXCOORD0 表示当前位置的纹理坐标,也就是它对应 Bitmap 上哪一点。 PS_OUTPUT 是 shader 中自定义的结构,用来表示 Pixel Shader 的输出。其中包含两个颜色 COLOR0 和 COLOR1。这里不论是颜色还是纹理坐标,数据范围都是 0 到 1。对于颜色来说,(0, 0, 0) 代表全黑,(1, 1, 1) 代表全白(相当于 RM 的 (255, 255, 255))。对纹理坐标来说,(0, 0) 代表左上角,(1, 1) 代表右下角。
For function definition, the form of two parameters is name: SEMATIC, where name represents parameter name just like C function parameters, and SEMATIC means how it is passed and used in the shader. “color: COLOR0” represents vertex color after interpolation, and “texcoord: TEXCOORD0” represents texture coordinate on current pixel, which means what point on bitmap is the pixel corresponding to. PS_OUTPUT is a custom-defined structure in shader representing shader output. Two colors COLOR0 and COLOR1 are included. In this case, all colors and texture coordinates are from 0 to 1. For a color, (0, 0, 0) is totally black while (1, 1, 1) is totally white (like (255, 255, 255) in RM). For texture coordinates, (0, 0) is upper left corner while (1, 1) is bottom right corner.
samp(texcoord) 是自定义的在纹理寄存器上采样的函数,包括了坐标缩放和偏移的一些计算。如果想要直接进行采样,可以使用 tex2D( spriteSampler, texcoord ) 。tex2D 是从采样器上采样,也就是在图片上取颜色的操作;spriteSampler 通过 register(s0) 获得,是 D3DXSprite 中纹理的采样器,也就是我们需要绘制的图片。每个像素都具有不同的 texcoord,因此它们才能在图片上取到不同的点,最终把整张图片呈现出来。
samp(texcoord) is a custom sampling function on texture registers including some computation on coordinate scaling and translating. If you need to sample directly, you can use tex2D(spriteSampler, texcoord). tex2D is sampling function directly on registers, that is, obtaining colors from the image. Value of spriteSampler is obtained from register(s0), which is the texture used on D3DXSprite. Each pixel has different texture coordinate (texcoord), so they find different points on original image and finally present the whole image on screen.
ColorMap, BushMap 和 ToneMap 都是自定义的颜色处理函数,传入和返回的都是 float4 格式。其中 ColorMap 处理变色效果,BushMap 处理“草木茂密”效果,ToneMap 处理色调变更。
ColorMap, BushMap, and ToneMap are custom color transforming functions with both input and output float4. ColorMap handles color changing effect, BushMap handles “bush” effect in RM, while ToneMap handles tone changing effect.
res *= color 是把顶点颜色合成到当前颜色上。最常见的功能是当设置不透明度后,不透明度的信息就被携带在顶点颜色中,而 res 通过 tex2D 得到,只包含了原始图片的透明通道信息,所以要把精灵的整体不透明度信息合成上去。
“res *= color” is to blend vertex color on current color. A main function is to store alpha information in vertex color when using translucent sprites. Since res is got from tex2D with only alpha information in original bitmap, the overall alpha of sprite needs to be blended on it.
res.rgb *= res.a 的步骤称为预乘(Pre-multiply)。因为 alpha blending 中,最终颜色的计算公式为:背景色 * 背景色的 alpha * (1 – 前景色的不透明度) + 前景色 * 前景色的 alpha,所以我们在处理前景色时,先把它乘以 alpha,最后只要加到背景色的那一项上就可以了。当它成为背景色以后,因为已经预先乘了 alpha,所以“背景色 * 背景色的 alpha”也可以看作一个整体,直接参与运算。
“res.rgb *= res.a” is called “pre-multiply”. Because color formula in alpha blending is: final_color = background_color * background_alpha * (1 – foreground_alpha) + foreground_color * foreground_alpha, we multiply foreground_color with foreground_alpha as the new foreground_color, then we just need to add it directly on the background term. When the new color becomes background color, “background_color * background_color” is seen as a whole because alpha channel is pre-multiplied.
最后的 GetOutput,就是把我们得到的颜色,包装成 PS_OUTPUT 的格式输出。
Finally, GetOutput is to warp our result color as PS_OUTPUT and output it.
在写 shader 时可以从上面的代码开始修改和编辑。比如下面的案例就能让最终的颜色变得更红一些(为了避免重复,函数名称改成了PS2):
When you create a new shader, you can start modifying and editing from the example above. For example, the shader below makes final color more reddish. (We use PS2 as function name to avoid name conflict)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | PS_OUTPUT PS2(float4 color : COLOR0, float2 texcoord : TEXCOORD0) { float4 res = samp(texcoord); res = ColorMap(res); res = BushMap(res, texcoord); res *= color; res = ToneMap(res); // 新添加的一行 Newly added line ========== // 把颜色的红色通道 +0.5,使它显得更红 // Add 0.5 on red channel, which makes the image more reddish res.r += 0.5; // 上面是新添加的一行 Newly added line on above ===== res.rgb *= res.a; return GetOutput(res); } |
完成这个步骤后,就能在 add_shader 的第二个参数中添加 pass 了。一个典型的案例如下:
After this step, you can add a pass in the second parameter of add_shader. A typical example is shown here:
1 2 3 4 5 6 7 8 9 10 11 12 13 | pass AlphaBlend { AlphaBlendEnable = true; SeparateAlphaBlendEnable = true; BlendOp = ADD; SrcBlend = ONE; DestBlend = INVSRCALPHA; SrcBlendAlpha = ONE; DestBlendAlpha = INVSRCALPHA; PixelShader = compile ps_2_0 PS(); } |
其中需要注意的是,AlphaBlend 代表 pass 的名字,在 Sprite 和 Viewport 的 effect_name 中设置成这个值就能对应使用(但是自定义的 pass 请换一个名称,因为 AphaBlend 是内部 shader 使用的,自定义写成 AlphaBlend2 就没问题)。另一点需要注意的在 PixelShader = compile ps_2_0 PS(); 中,PS() 就是我们上面定义的函数,如果想要使用自己定义的名叫 PS2 的函数,那么这里也要使用 PS2。
What you need to pay attention to is that AlphaBlend is the name of a pass. You can use it by setting effect_name to it on Sprites or Viewports (but please select another name in your custom shader, such as AlphaBlend2, because AlphaBlend is used in internal shader). Another point is that PS in PixelShader = compile ps_2_0 PS(); is the function we have defined. If you are going to use custom function PS2, you need to change function name to PS2 here.
AlphaBlendEnable 和 SeparateAlphaBlendEnable 分别表示开启透明合成以及颜色和不透明度采用不同的透明合成方式(因为存在减法合成这类颜色和透明度合成方式不同的算法)。BlendOp代表合成的运算符号,下面四行分别代表前景图颜色、背景图颜色、前景图 alpha,背景图 alpha 的合成参数。ONE 代表乘以1,INVSRCALPHA 代表 1 – 前景图 alpha 。上述的合成方式是在采用预乘的条件下,按透明度合成的正确做法。
在 Sprite 和 Viewport 上使用 shader / Use Shader on Sprites and Viewports
要使用上面定义的 shader,方法很直接,只要设置 Sprite#effect_name 和 Viewport#effect_name 对应于我们设置的值(比如 AlphaBlend2)就可以了。但是要实现一些复杂的效果,还需要把参数传入 shader 中才行。
If you need to use shader defined in previous section, just set Sprite#effect_name and Viewport#effect_name to our pass names (like AlphaBlend2). But you need to pass parameters in your shader if you are going to implement some complicated effects.
在 shader 第一部分的函数上方,我们可以自定义一些全局变量,比如:
On the first part of shader, we can define some global variables. For example:
1 2 3 4 5 6 7 8 9 | int myparam_ia; float myparam_fb; texture myparam_tex; sampler2D mySampler = sampler_state { Texture = <myparam_tex>; AddressU = Wrap; AddressV = Wrap; }; |
其中定义 texture 的方式比较复杂。首先需要定义一个纹理资源 texture myparam_tex; ,然后定义一个 sampler 在它的上面采样。sampler_state中可以设置纹理的采样方式,比如 AddressU = Wrap 意味着如果纹理坐标超出了0到1,就会通过循环的方式回到0到1的范围,利用 Wrap 可以做出远景图循环等效果。
Here the definition of texture is a bit complicated. First we create a texture resource myparam_tex, then define a sampler to sample on it. Sampling methods are defined in sampler_state. AddressU = Wrap means texture coordinates will return to the range of 0 to 1 in cycle if it exceeds the range. You can use Wrap to obtain parallax looping effect.
这些参数一旦设置,就可以在自定义的函数中使用了。但为了设置这些参数,在 Sprite 和 Viewport 中,需要调用 set_effect_param,方式如下:
These parameters can be used in custom functions as long as they are set. But you still need set_effect_param to pass value into these parameters:
1 2 3 4 | mysprite.set_effect_param("myparam_ia", 20); mysprite.set_effect_param("myparam_fb", 3.5); mybitmap = Bitmap.new(150, 150); mysprite.set_effect_param("myparam_tex", mybitmap); |
只要保证第一个名字参数和变量名一样,第二个参数符合变量类型,就没问题了。
You only need to ensure that the first parameter is variable name, and the second parameter fits your variable type.
一些内置 shader 的可用内容 / Some Useful Contents in Built-in Shader
这部分介绍定义在内置 shader 中(但并不是 HLSL 语言特性)的一些变量和函数。它们是 RGD 代码实现的。
This part introduces some built-in variables and functions of default shader (but not a part of HLSL feature). They are implemented in RGD source code.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 | // ===================================== sampler2D spriteSampler; // 精灵、视窗纹理的采样器。 // 使用 tex2D 在上面获取颜色。 // Sampler for sprite and viewport textures. // Use tex2D to get color on it. // ===================================== sampler2D transitionSampler; // 渐变图纹理的采样器。 // 使用 tex2D 在上面获取颜色。 // Sampler for transition textures. // Use tex2D to get color on it. // ===================================== float sampWidth; // 1px 宽度在纹理坐标中对应的数值。 // 纹理坐标的 x 值除以 sampWidth // 可以转化为 x 方向的像素数。 // Width of 1px in texture coordinate unit. // Divide texture coordinate x by sampWidth // to get pixel numbers in x direction. // ===================================== float sampHeight; // 1px 高度在纹理坐标中对应的数值。 // 纹理坐标的 y 值除以 sampHeight // 可以转化为 y 方向的像素数。 // Height of 1px in texture coordinate unit. // Divide texture coordinate y by sampHeight // to get pixel numbers in y direction. // ===================================== float4 blendColor; // 精灵和视窗的颜色属性。 // Blend color for sprites and viewports. // ===================================== float4 tone; // 精灵的色调属性。 // Blend tone for sprites. // ===================================== float2 texcoordScale; // 纹理坐标的缩放值。 // 在处理 Plane 的纹理坐标时使用。 // Scale of texture coordinate. // Used in plane texture coordinates. // ===================================== float2 texcoordOffset; // 纹理坐标的偏移量。 // 在处理 Plane 的纹理坐标时使用。 // Offset of texture coordinate. // Used in plane texture coordinates. // ===================================== static const float PI = 3.14159265f; // 常数 PI。 // Constant value PI. // ===================================== float4 samp(float2 texcoord); // 带有矫正的采样函数。 // 矫正包括 textureScale,、textureOffset, // 以及关于波动的一些参数。 // 如果不需要上述功能并且要减少指令数提升效率, // 可以使用 tex2D。 // Sampling function with modifications, // including textureScale, textureOffset, // and some parameters on sprite waving. // Use tex2D for reducing operation numbers // and get higher performance if you do not // need those modifications. // ===================================== float4 ColorMap(float4 origin); // 把 blendColor 混合到原始颜色上。 // Blend the variable blendColor // onto original color. // ===================================== float4 ToneMap(float4 origin); // 使用 tone 调整给定颜色的色调。 // Use tone variable to adjust the tone of // original color. // ===================================== |
兼容性 / Compatibility
已知有一些情况会导致 RGD 不能正常运行,请参考下列方式调整:
- RGSS300.dll 不受到 RGD 支持。请使用 RGSS301 或更新的版本。
- 因为硬件设备支持的纹理尺寸各不相同,太大的图片可能会在载入后自动缩小或出现崩溃等其他问题,所以请确保图片资源大小在 2048×2048 以下。如果需要大幅图片,请把它分割成多张图使用。
- AMD 显卡环境下可能会导致出错,这一点还未确定是不是 DirectX9 与 AMD 的兼容性问题或是其他原因,暂时没有解决的办法。
Ruby 脚本方面,RGD 保证和 RGSS3 的行为几乎一致,绝大多数第三方脚本不会引起兼容性问题。
一些第三方脚本使用内存地址等方式对 Bitmap 等对象进行处理,在直接使用 RGD 时可能会遇到兼容性问题。在这里列举一些可能有帮助的解决方法,希望它们不会成为制作游戏的阻碍。
- 使用 RGD 内置的功能,如 Font.pixel和Mouse模块,能替代一些特定功能的脚本(如利用半生的文字描绘扩展做像素字体效果,和一些鼠标脚本系统)。
- 使用 Bitmap#process_color 处理图片颜色。一些脚本(比如截图存档)会利用内存地址访问位图的数据,但是纹理的数据必须经过 lock 的过程才能编辑,因此建议使用 process_color。
- 尽量多使用精灵,并且把特效转移到 shader 中。一些脚本过度依赖位图操作,甚至每一帧都会修改图片,导致性能下降;RGD 的精灵以及 shader 开销都非常小,请尽量使用。
- 把一些 Sprite 设置为正确的 Viewport。因为跨图层叠加的行为和 RGSS3 存在差异,所以把带有合成效果的 Sprite 都放在同一 Viewport 内,比如 Scene_Map 的 @viewport1。
如果出现其他兼容性相关问题,会陆续补充到此处。
Some known factors may cause RGD not start properly. Please refer to the following solutions:
- RGSS300.dll is not supported in RGD. Please use RGSS301 or newer versions of DLL.
- Different hardware may support different texture size, while images with too large size may be automatically resized or cause other problems. Make sure the size of your image resources is smaller than 2048×2048. You may divide large images into multiple partitions if necessary.
- Crashes may happen on AMD graphic cards when running RGD. It is still unknown whether the crashes are caused by incompatibility of DirectX9 and AMD graphics. There is no solution for this issue at present.
RGD keeps all the behavior almost the same as RGSS3. Most third-party scripts do not cause any compatibility problems with RGD.
In Ruby scripts, some third-party scripts use memory address to handle Bitmap and other objects. This may cause compatibility problems when they are combined with RGD. Here are some solutions which may help you solve the problems and remove the obstructions when making your game.
- Use built-in functions of RGD, like Font.pixel and module Mouse. This replaces some scripts with specific functions (such as pixelated font from tktkgame bitmap extension, and some mouse input systems).
- Use Bitmap#process_color to process bitmap colors. Some scripts (such as snapshot on savefile) may use memory address on bitmap to access data. However the bitmap data in RGD is in form of textures and lock/unlock must be used to modify data. So the process_color is recommended here.
- Use sprite combinations instead of bitmap processing, while move special effects into shaders. Some third-party scripts rely on bitmap processing too much, even modify bitmaps at each frame, which may cause poor performance. The cost for RGD sprites and effects are greatly reduced. Please make use of them.
- Set the viewport of sprites properly. Because of the difference on cross viewport blending with RGSS3, it is helpful to put sprites in one viewport, such as @viewport1 in Scene_Map, if they have blending effects.
Other compatibility solutions will be updated here if new problems are found and solved.
使用约定 / Terms of Use
- RGDirect 可以在 RPG Maker VX Ace 制作的非商业或商业游戏中使用。
- 请勿用于违反相关国家法律法规的用途,请勿用于伤害他人的合理合法权益。
- 请勿以制作者之外的其他名义二次发布 RGDirect。
- RGDirect 的开发者不对使用过程中和使用后的任何问题负责。
- 如果出现任何冲突,以相关法律法规、Enterbrain 公司的官方规定为准。
- RGDirect is permitted to use in non-commercial or commercial games made with RPG Maker VX Ace.
- Do not use RGDirect in violating the laws and regulations of related countries, and do not use it to harm the legitimate rights and interests of other people.
- Do not republish RGDirect outside the name of the developers.
- Developers on RGDirect are not responsible for any problems during and after use.
- In the event of any conflict, laws and regulations of related countries, and the official instructions from Enterbrain Corporation shall prevail.
更新记录 / Update Log
- 2021/3/22 – 1.6.1
- 回滚到默认Audio,重写的Audio可以在Game.ini使用“OverwriteAudio=1”开启。
- 修正了绘制和测量文字时间距不正确的错误。
- 2020/9/15 – 1.6
- 重写Audio模块,增加若干功能。
- 增加对Cubism Live2D的支持。
- 增加对Spine的支持。
- 2020/7/12 – 1.5.4
- 修复当Sprite作为child时的visible问题。
- 修复Sprite在带有children时释放崩溃的问题。
- 修正了地图循环显示不正确的问题。
- 控制台输入支持多行。
- 修复Tilemap没有正确释放导致内存泄漏问题。
- 2020/5/13 – 1.5.3
- 修复Font.clone和dup的崩溃问题。
- 2020/5/12 – 1.5.2
- 修正background_exec的in_focus和out_focus。
- 修正tilemap柜台遮挡错误的问题。
- 修复了blur的实现方式。
- 修正了color在Font、Viewport、Plane等地方的复制错误问题。
- 2020/3/20 – 1.5.1
- 修复Tilemap写入数据崩溃的问题。
- 2020/3/17 – 1.5
- 启用了控制台的输入功能。
- 提升Tilemap的性能。
- 修复了一些图块意外出现在阴影上方的问题。
- 修复了Bitmap#clear_rect的问题。
- 2019/12/31 – 1.4.1
- 修复 BUG。
- 2019/12/27 – 1.4
- 增加 Sprite#shear_x 和 shear_y 来进行精灵扭曲。
- 增加 Sprite#add_child 和相关的方法。
- 修复 BUG。
- 2019/1/9 – 1.3.2
- 修复 BUG。
- 2018/12/28 – 1.3.1
- 修复 BUG。
- 2018/12/22 – 1.3
- 重制 Input 模块并把 Controller 放入 Input 中。(Controller.update也被包括在了Input)
- 提供游戏设置的自定义脚本,可代替原版 RGSS3 的 F1 选单。
- 修复大量 BUG。
- 2018/9/2 – 1.2.1
- 增加 Controller 模块识别 XInput(XBOX360) 手柄操作。
- 修复一些 BUG。
- 2018/8/29 – 1.2
- 增加了Geometry的z和w坐标,以及shader功能。
- 窗口焦点触发事件改为RGD.focus_in和RGD.focus_out,取消窗口关闭事件。
- 性能优化。
- 修复大量 BUG。
- 2018/7/24 – 1.1.2
- 修复一些 BUG。
- 2018/7/1 – 1.1.1
- 增加Graphics.resize_window功能,直接缩放游戏窗口尺寸。
- 修复一些 BUG。
- 2018/6/7 – 1.1
- 增加了窗口获得焦点、失去焦点、关闭时的回调。
- 增加了Geometry的图片功能。
- 增加了调整窗口大小功能。
- 修复大量 BUG。
- 2018/5/12 – 1.0.2
- 增加了 Geometry 类,可以用于在屏幕上直接绘制三角形。
- 增加了 Viewport 的快速绘制层的功能,便于制作粒子特效等批量精灵效果。
- 2018/5/9 – 1.0.1
- 修正了包括文字描绘、图像缩放等方面的大量BUG。
- 增加了使用 Symbol 访问鼠标状态的方式。
- 2018/5/4 – 1.0
- 初版发布。
- Mar 22, 2021 – 1.6.1
- Rollbacked to default Audio. The new audio module can be enabled using “OverwriteAudio=1” in Game.ini.
- Fixed the bug of incorrect spacing when drawing or measuring texts.
- Sep 15, 2020 – 1.6
- Re-implemented Audio module and added several functions.
- Cubism Live2D support.
- Spine support.
- Jul 12, 2020 – 1.5.4
- Fixed sprite visibility as a child.
- Fixed a crash on disposing a sprite when it has any children.
- Fixed incorrect display on looped tilemap.
- Console now supports multiple line input.
- Fixed a memory leak on incorrect Tilemap disposal.
- May 13, 2020 – 1.5.3
- Fixed crashing on Font.clone and Font.dup.
- May 12, 2020 – 1.5.2
- Fixed in_focus and out_focus when background_exec.
- Fixed counter layering bug in Tilemap.
- Fixed blur implementation in Bitmap.
- Fixed incorrect copy of color in Font, Viewport and Plane.
- Mar 20, 2020 – 1.5.1
- Fixed a crashing bug when setting data to Tilemap.
- Mar 17, 2020 – 1.5
- Enabled input for debug console.
- Enhanced performance for Tilemap.
- Fixed a bug that some tiles are accidentally above the shadow.
- Fixed a bug on Bitmap#clear_rect.
- Dec 31, 2019 – 1.4.1
- Fixed some bugs.
- Dec 27, 2019 – 1.4
- Added Sprite#shear_x and shear_y for sprite shearing.
- Added Sprite#add_child and some related funtions.
- Fixed some bugs.
- Jan 9, 2019 – 1.3.2
- Fixed some bugs.
- Dec 28, 2018 – 1.3.1
- Fixed some bugs.
- Dec 22, 2018 – 1.3
- Remake Input module and move Controller into it. (Controller.update is also automatically executed by Input module.)
- Published a new script for replacing F1 menu of original RGSS3.
- Fixed lots of bugs.
- Sep 2, 2018 – 1.2.1
- Added Controller module to receive XInput(XBOX360) game controller input.
- Fixed some bugs.
- Aug 29, 2018 – 1.2
- Added z and w coordinates and shaders for Geometry.
- Window events of getting and losing focus changed to RGD.focus_in and RGD.focus_out. Removed window close event.
- Performance optimization.
- Fixed lots of bugs.
- Jul 24, 2018 – 1.1.2
- Fixed some bugs.
- Jul 1, 2018 – 1.1.1
- Added Graphics.resize_window to resize game window directly.
- Fixed some bugs.
- Jun 7, 2018 – 1.1
- Added callback on window getting focus, losing focus and closing.
- Added bitmap on Geometry.
- Added resizing window function.
- Fixed lots of bugs.
- May 12, 2018 – 1.0.2
- Added Geometry class, which is used for drawing triangles on screen.
- Added fast drawing layers on Viewport for batch sprites like particles.
- May 9, 2018 – 1.0.1
- Fixed lots of bugs related to text drawing, image scaling and more.
- Added Symbol parameters on mouse state functions.
- May 4, 2018 – 1.0
- RGDirect released.
Graphics里resize_window方法出现了两次(
感谢报告。
能否加下qq联系方式。想有偿使用RGD。可以谈谈吗。
已经联系~
所以源码呢?
这样搞已经违反用户协议了吧
没有违反用户协议的,在RMW已经和官方的人联系过,没有问题。
源码暂时不打算公开,因为可能比较乱,自己也暂时继续维护着,等没有精力更新了再公开吧。
发现换用后会导致地图上第二层开始那些本来显示在玩家角色下方的图块变成覆盖玩家角色(没有其他任何脚本和修改)。
典型的比如一棵树、一个高塔的下半部分。原版exe的话一棵树下半部分(通行X)会被玩家角色覆盖,而上半部分(通行☆)会覆盖玩家角色
而换用新exe后只要位于第二层(B)以上的图块就会覆盖玩家角色。
这个BUG已经发现了,会在下个版本修正。
Using hundreds of activities accessible, there is
certain to be every form of game for also one of
the most critical player.
请问作者知道一个项目吗?https://forum.chaos-project.com/index.php/topic,12899.0.html
用XP编辑器,Ace的内核来处理游戏内容,请问能否通过一些小更改使得XP的内容可以在大大的项目上运行呢?
不是伸手党,正在尝试中,感觉光影那个实在是太厉害了,看到了一丝八方旅人的素质。
不过看了代码感觉又不大可能在RMXP的编辑器下实现,好恨……
直接的话小修改程度的可能不行,毕竟XP和VA区别挺大了……
各种XP转VA工程的项目,应该也只是在“最终”环节才转成VA,并不能一边用XP编辑器一边写RGD代码。
所以这样看下来可能真的无解。唯一的方法是把素材都丢到VA里然后用VA做吧,基本上XP的功能是VA的子集。唯一XP有优势的地方三层地图,如果使用ULDS或者Overlay这些远景地图的情况下,应该也就不会影响太大啦。
明白啦,XPA的原理的确是在最后将XP里基础的内容转换掉,包括window这些,测试里面光window初始化就有50%的崩溃几率,难受……
主要还是搬运数据到RMVA里会比较麻烦,还有不熟悉VA的地图绘制。不过看到这么好的性能感觉也不是太大的代价了23333感谢大大造的轮子
不过light那个范例1070显卡计算量消耗35%会不会有点过分了……
那个XP编辑器Ave内核的脚本每次运行到dll就会出错……这个问题实在超出了能力范围……
Hello! I love what you did here. I just have a quick question:
How do you implement the mouse feature?
Thank you!
I use Windows API to implement the mouse feature. For example, I use GetCursorPos to get mouse position, and GetAsyncKeyState to get stats of mouse buttons.
您好,请问有Geometry对象具体的使用范例或者说明/参考吗?没有特别搞懂这个东西怎么绘制三角形,想做几个位图在同一个的3D透视面上的表现效果~
暂时没有更详细的说明……以后Geometry可能会继续更新。要做位图的透视效果需要改w,x y z w是经过变换矩阵变换后的结果(里面还有一些directx的约定我自己也记得不是很清楚)
您好!请问能够开源吗?我想要移植到linux平台上,建立一个vulkan版本。希望能够开放源代码,或者邮箱联系。谢谢!
抱歉,暂时没有开源的打算,之后如果开源会随时更新的。
我也是想做linux的移植,经过一段时间研究我有的疲惫了,于是来这里看看有没有开源,不如你留下邮箱我跟你交流一下?
不知道你是做x86/x64架构的还是arm,x86/x64有现成方案。 我是苦苦研究arm无果。
不好意思暂时不打算开源,等之后停止维护或者稳定了再开源吧。
可否在p1论坛私信我联系?ID是 坏数据
您好!请问这个可以使用于18禁作品上吗?非常感谢您的贡献!
RGD不限制使用的题材。不过在制作和发布的时候请遵守相关地区法律法规,RGD不对任何作品发生的问题负责。
可不可以做一个像XP一样可以通过重定义Kernel.exit来控制X掉游戏后执行代码的功能
比如为exit设置条件分歧满足条件才关闭游戏窗体,不满足则return
而不是像VA一样,点击关闭按钮/(或ALT+F4)就无论如何会关闭窗体
有点麻烦,可能暂时不加这个
你好,我发现使用了这个exe后,游戏内容的分辨率就固定了,改变窗口大小只会拉伸窗口内容。有什么办法能取消掉这个效果吗?因为我想改变游戏内容的分辨率
用Graphics.resize_screen就可以
冒昧打搅,作者似乎许久没有登陆P1论坛了所以到Blog下面来请教了。
请问有什么办法可以在Shader里用在Viewport上采样然后把结果输出到另一个Sprite或者Geometry上吗?若能回复感激不尽。
可以用Viewport#snap_to_bitmap保存成bitmap
在实际使用的时候因为游戏类型需求的原因,我的游戏分辨率是1920*1080,FPS被设置成了120,这个Viewport尺寸又很大,Geometry又需要实时和Viewport同步刷新,结果一秒需求实时描绘了120次尺寸很大的Bitmap,电脑配置差一点的话FPS就掉光了,所以来问一下是否有什么比如依靠Shader的开销更小的解决办法~
汇报一个BUG
Viewport的snap_to_bitmap功能,只有和屏幕大小相同的viewport能正常生成图片
最近又发现了几个新BUG:
1、生成的时候,visible=false的Sprite和Window也会被截进去
2、透明部分的截图有问题。比如透明度为0.5的图片snap_to_bitmap之后透明度会变成0.25,也就是平方了一次。
查了一下,不太确定viewport的截图的具体问题,看看是不是因为用了上一帧viewport的数据?
前两个问题(rect不为(0, 0, Graphics.width, Graphics.height)的Viewport截图后生成空图片, 截图时没有检测WIndow和Sprite的visible属性)我测试了很多次,是确实存在的。
透明部分的截图问题应该是在获取颜色的时候,rgb数据多乘了一次透明度的缘故。
也就是说viewport里原本颜色为(r, g, b, a)的像素,被截图后颜色就变成了(r*a, g*a, b*a, a)
好的,我稍后去测试
编辑:我大概懂了,这个是viewport预乘alpha通道的缘故, 应该无解了(为了最终渲染结果的正确性)
报告一个不知是否是bug的问题:win32api图片反色导致程序崩溃。
范例游戏《丝丝和条条》在使用RGD1.61后,只要使用“反色”有关的方法,就会崩溃。具体在“QQEat_Bitmap”条目下“Bitmap”类的“invert”方法前后出现的问题。将此方法内容注释掉,就无崩溃情况出现了。
范例游戏地址:https://rpg.blue/thread-410703-1-1.html
你看看有没有用外部的dll,如果用了外部处理bitmap的dll估计是不兼容的。
可以用RGD的process_color来做反色。