楼主: guoxiaomi

[原创发布] 【RGM】RGModern 1.0.4 - RMXP新runtime

[复制链接]
梦石
1
星屑
24088
在线时间
3339 小时
注册时间
2011-7-8
回帖
3862

开拓者

 楼主| 发表于 2023-5-30 21:51:04 | 显示全部楼层
本帖最后由 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中实现。
熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复

使用道具 举报

梦石
0
星屑
15041
在线时间
2230 小时
注册时间
2019-1-24
回帖
964

R考场第七期纪念奖

发表于 2023-5-31 17:09:40 | 显示全部楼层
guoxiaomi 发表于 2023-5-30 21:51
1.0.3已更新,主要添加了鼠标功能。注意Graphics.set_title和Graphics.set_fullscreen已经移除,相关代码移 ...

范例里面鼠标功能如何开启?

点评

对的,只是提供了鼠标的功能  发表于 2023-6-5 23:05
我怎么打开范例鼠标没反应操作游戏?还得需要写脚本吗?  发表于 2023-6-1 07:51
默认就是开启的,直接调用RGM::Ext::Mouse里的方法就行。  发表于 2023-5-31 22:09
回复

使用道具 举报

梦石
1
星屑
24088
在线时间
3339 小时
注册时间
2011-7-8
回帖
3862

开拓者

 楼主| 发表于 2023-5-31 22:17:10 | 显示全部楼层
本帖最后由 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行)。
[pre lang="ruby"]#===============================================================================
# ● 【简易坑爹系列】武器、装备与状态的附加特技
#===============================================================================
class Game_Actor
  WEAPON_SKILLS = {}
  ARMOR_SKILLS = {}
  STATE_SKILLS = {}
  #----------------------------------------------------#
  # 设置区域
  #
  # 设置方法:STATE_SKILLS[状态id] = [特技id]
  #           WEAPON_SKILLS 与 ARMOR_SKILLS 同理
  #           当特技id为负值时则删减该技能
  #           不论顺序,删减技能一并落后处理
  #----------------------------------------------------#

  WEAPON_SKILLS[5] = [5] # 匕首 致命一击

  ARMOR_SKILLS[63] = [4] # 软木盾 盾防

  # STATE_SKILLS[74] = [23]#鱼人仿息  悬浮水膜

  #----------------------------------------------------#
  alias _origin_skills skills

  def skills
    output = _origin_skills | (WEAPON_SKILLS[@weapon_id] || [])
    [@armor1_id, @armor2_id, @armor3_id, @armor4_id].each { |a| output |= ARMOR_SKILLS[a] || [] }
    @states.each { |s| output |= STATE_SKILLS || [] }
    output.each do |s|
      if s < 0
        output.delete(s.abs)
        output.delete(s)
      end
    end
    output.sort
  end

  def skill_learn?(skill_id)
    skills.include?(skill_id)
  end
end
[/pre]

点评

蟹蟹加菲!!!!  发表于 2023-6-6 14:48
呼!谢谢大大~~第一个脚本是完整的,【简易坑爹系列】的好像都是这么写的,很短,但是O.o我改都改不来~~  发表于 2023-6-1 10:45

评分

参与人数 1赞 +1 收起 理由
纯属小虫 + 1 塞糖

查看全部评分

熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复

使用道具 举报

梦石
0
星屑
4549
在线时间
1923 小时
注册时间
2010-8-16
回帖
786

短篇八RM组季军

发表于 2023-6-4 15:46:31 | 显示全部楼层
掌握了RGM就是掌握了毁灭宇宙的终极力量!但这一切都在一只可爱极致的加菲猫先生手上!!!
Steam页面:
http://store.steampowered.com/app/486850
https://store.steampowered.com/app/865180/
志同道合QQ&E-mail:707429539@qq.com
回复

使用道具 举报

梦石
1
星屑
24088
在线时间
3339 小时
注册时间
2011-7-8
回帖
3862

开拓者

 楼主| 发表于 2023-6-6 02:08:39 | 显示全部楼层
本帖最后由 guoxiaomi 于 2023-6-6 02:18 编辑
RTCanwind 发表于 2023-5-30 01:49
感谢~~
单独运行确实是到Animations.rxdata这步,不过在工程里运行时还有一些脚本报错,如
- 013_Pictur ...


做了大概13处修改了吧,大的bug没有了,可以正常进入到游戏里。
Screenshot 2023-06-06 020849.png

其实有很多功能是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.log1. ArgumentError
- O:/Pokemon Essentials v18.1 RGM/src/script/builtin.rb:183:in `set'
- O:/Pokemon Essentials v18.1 RGM/src/script/builtin.rb:178:in `initialize'
- 013_PictureEx.rb:114:in `new'
- 013_PictureEx.rb:114:in `initialize'

Data\Scripts\009_Objects and windows\013_PictureEx.rb的114行:
```ruby
@src_rect      = Rect.new(0,0,-1,-1)
```
改为
```ruby
@src_rect      = Rect.new(0,0,0,0)
```

2. no implicit conversion of nil into Integer
- O:/Pokemon Essentials v18.1 RGM/src/script/win32api.rb:41:in `initialize'
- O:/Pokemon Essentials v18.1 RGM/src/script/win32api.rb:41:in `new'
- O:/Pokemon Essentials v18.1 RGM/src/script/win32api.rb:41:in `initialize'
- 001_PSystem_Controls.rb:4:in `new'
- 001_PSystem_Controls.rb:4:in `pbSameThread'

修改所有的 `'%w()'` 格式的字符串。包括:
- 008_Audio\003_Audio_Utilities.rb
- 010_Scenes\006_Scene_Movie.rb
- 020_System and utilities\001_PSystem_Controls.rb
- 020_System and utilities\005_PSystem_Utilities.rb

3. undefined method `critical' for Thread:Class
- 001_BitmapCache.rb:86:in `__setobj__'
- 001_BitmapCache.rb:70:in `initialize'

Thread#critical方法在高版本ruby中已经移除了,改用abort_on_exception。批量替换以下文件内容:
- 008_Audio\001_Audio.rb
- 009_Objects and windows\001_BitmapCache.rb

从这里开始就不是RGM的错误了,继续排查 errorlog.txt。

4. Exception: RuntimeError
Message: Expected a section at the beginning of the file.
File PBS/types.txt, line 1
Backtrace:
002_Compiler_PBS.rb:368:in `block in pbCompileTypes'
001_Compiler.rb:266:in `block (2 levels) in pbCompilerEachCommentedLine'
001_Compiler.rb:260:in `each_line'

这是BOM头判断错误,定义函数:
```ruby
def check_utf8_bom(line); line.start_with?("\xEF\xBB\xBF") end
```
替换相应代码。并尽量把所有txt文件都保存成utf8格式。

5. Exception: NoMethodError
Message: undefined method `each' for nil:NilClass
Backtrace:
003_Intl_Messages.rb:27:in `pbSetTextMessages'
001_Compiler.rb:1248:in `pbCompileAllData'

RGM未定义 $RGSS_SCRPITS,这里使用load_data代替。

6. Exception: ArgumentError
Message: wrong number of arguments (given 3, expected 4)

Backtrace:
O:/Pokemon Essentials v18.1 RGM/src/script/builtin.rb:112:in `initialize'
004_SpriteWindow.rb:132:in `new'
004_SpriteWindow.rb:132:in `initialize'

RGM的bug,需要给tone增加默认的gray参数。

7. Exception: NoMethodError
Message: undefined method `exist?' for Font:Class

Backtrace:
002_MessageConfig.rb:33:in `block in pbTryFonts'

RGM的bug,需要给Font添加exist?方法。

8. 补充 config.ini 中的字体设置。

9. 移除 class GifBitmap 中错误调用的 load 函数。在文件 009_Objects and windows\008_AnimatedBitmap.rb 中。
此时已经能进入标题画面。

10. no implicit conversion from nil
- O:/Pokemon Essentials v18.1 RGM/src/script/decorator.rb:104:in `drawable_dispose'
- O:/Pokemon Essentials v18.1 RGM/src/script/decorator.rb:104:in `dispose'
- 009_Planes.rb:43:in `dispose'
- 009_Planes.rb:198:in `dispose'

不知道为什么LargePlane继承自Plane,移除此继承关系。

11. 进入配置画面OK。进入新游戏,报错
O:/Pokemon Essentials v18.1 RGM/src/script/bitmap.rb:75: [BUG] Segmentation fault
ruby 3.2.2 (2023-03-30 revision e51014f9c0) [x64-mingw-ucrt]

-- Control frame information -----------------------------------------------
c:0042 p:---- s:0230 e:000229 CFUNC  :bitmap_create
c:0041 p:0068 s:0223 e:000222 METHOD O:/Pokemon Essentials v18.1 RGM/src/script/bitmap.rb:75
c:0040 p:0008 s:0216 e:000215 METHOD 001_BitmapCache.rb:302 [FINISH]
c:0039 p:---- s:0211 e:000210 CFUNC  :new
c:0038 p:0070 s:0206 e:000205 METHOD 001_BitmapCache.rb:366

RGM的bug,Finder不能返回一个directory。

12. Error occurs when load Data/Scripts.rxdata.
Is a directory @ rb_sysopen - Graphics/Characters/
- 001_FileTests.rb:377:in `initialize'

给pbGetFileChar(file)添加了 directory? 的判断

13. private method `pbShowCommands' called for Kernel:Module
- 011_Messages.rb:1264:in `block in pbMessage'
- 011_Messages.rb:1232:in `pbMessageDisplay'

这个已经不是兼容性的问题了。将此行的 `Kernel.pbShowCommands` 改成 `pbShowCommands`。

点评

好耶  发表于 2023-6-8 01:27
熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复

使用道具 举报

梦石
2
星屑
13779
在线时间
2319 小时
注册时间
2011-6-4
回帖
586
发表于 2023-6-6 07:26:17 | 显示全部楼层
移植的时候发现的,图块素材,文件名使用中文会报错。
无标题.png

ERROR档下附
[pre lang="ruby"]2023-06-06 07:22:49 +0800
Error occurs when load Data/Scripts.rxdata.
incompatible character encodings: UTF-8 and ASCII-8BIT
- eval:80:in `expand_path'
- eval:80:in `block (2 levels) in find'
- eval:79:in `each'
- eval:79:in `block in find'
- eval:78:in `each'
- eval:78:in `find'
- eval:42:in `initialize'
- eval:74:in `new'
- eval:74:in `make_tileset'
- eval:66:in `tileset'
- Spriteset_Map:21:in `initialize'
- Scene_Map:13:in `new'
- Scene_Map:13:in `main'
- Main:16:in `block in rgss_main'
- eval:31:in `eval'
- eval:31:in `block in rgss_main'
- eval:27:in `each'
- eval:27:in `rgss_main'
- eval:55:in `load_script'
- eval:23:in `load_script'
- eval:23:in `load_script'
- eval:71:in `<main>'
- ruby:in `load_script'[/pre]

点评

问题已经解决了,感谢猫佬  发表于 2023-6-8 07:29
我试了一下必须工程路径也是中文才有这个报错,不过都修复了,你试一下最新的范例吧  发表于 2023-6-8 00:43
好的,那我顺便把所有素材的中文名都再测测  发表于 2023-6-6 20:05
BUG反馈请加QQ 529283039
水友群 917854767

回复

使用道具 举报

梦石
1
星屑
24088
在线时间
3339 小时
注册时间
2011-7-8
回帖
3862

开拓者

 楼主| 发表于 2023-6-8 00:41:35 | 显示全部楼层
本帖最后由 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。
熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复

使用道具 举报

梦石
0
星屑
801
在线时间
86 小时
注册时间
2020-12-15
回帖
22
发表于 2023-6-8 02:42:35 | 显示全部楼层
本帖最后由 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.怀疑与第五步修改有关系。
回复

使用道具 举报

梦石
24
星屑
8942
在线时间
248 小时
注册时间
2020-12-4
回帖
259

极短24获奖极短23获奖极短22获奖

发表于 2023-6-8 13:17:40 | 显示全部楼层
本帖最后由 纯属小虫 于 2023-6-8 13:24 编辑

试了下窗口放大,特别完美!
应该能够完全平替之前用过的一个画面放大脚本了。
原画面放大脚本1[pre lang="ruby"]# Win32Tools by Fux2
# 欢迎访问rpg.blue获取更多RPG Maker资源
# 发布、转载时请保留此处文字

class String
  def address
    [self].pack("p").unpack("L").first
  end
  def byte_length
    ret = 0
    each_byte{ret+=1}
    ret
  end
end

module Fux2

  module Win32Tools
   
    WriteProcessMemoryR = Win32API.new('kernel32','WriteProcessMemory','lplll','i')
    WriteProcessMemoryW = Win32API.new('kernel32','WriteProcessMemory','llpll','i')
    GetModuleHandle = Win32API.new('kernel32','GetModuleHandle','p','l')
    VirtualProtect = Win32API.new('kernel32','VirtualProtect','lllp','l')
    GetProcAddress = Win32API.new('kernel32','GetProcAddress','lp','l')

    CallWindowProc = Win32API.new('user32','CallWindowProc','ppll','v')
    MoveWindow = Win32API.new('user32','MoveWindow','llllll','v')
    GetSystemMetrics = Win32API.new('user32','GetSystemMetrics','l','l')
    GetWindowRect = Win32API.new('user32','GetWindowRect','lp','v')
    GetWindowLong = Win32API.new('user32','GetWindowLong','ll','l')
    FindWindow = Win32API.new('user32','FindWindow','pp','l')
    AdjustWindowRectEx = Win32API.new('user32','AdjustWindowRectEx','plll','l')
    GetDC = Win32API.new('user32','GetDC','L','L')

    def self.readmem(buf,addr,len)
      WriteProcessMemoryR.call(-1,buf,addr,len,0)
    end
   
    def self.writemem(addr,buf,len)
      WriteProcessMemoryW.call(-1,addr,buf,len,0)
    end
   
    def self.nop(addr,len)
      buf = "\x90" * len
      writemem(addr,buf,len)
    end
   
    def self.read_ptr_value(addr,*stacks)
      rem = "\0"*4
      value = addr
      stacks.each do |offset|
        readmem(rem,value+offset,4)
        value = rem.unpack("L")[0]
      end
      return value
    end
   
    def self.get_proc_addr(module_name,proc_name)
      mod = GetModuleHandle.call(module_name)
      raise 'getprocaddress faild' if mod==0
      ret = GetProcAddress.call(mod,proc_name)
      raise 'getprocaddress faild' if ret==0
      ret
    end
   
    def self.unprotect(addr,len)
      VirtualProtect.call(addr,len,0x40,"\0"*4)
    end
   
    def self.init
      @@hModule = GetModuleHandle.call("RGSS103J.dll")
      raise 'wrong dll file' if @@hModule==0
      @@window_hWnd = read_ptr_value(module_handle+0x12B6C4,0,8)
      @@hook_contents = {}
    end
   
    def self.module_handle
      @@hModule
    end
   
    def self.window_hwnd
      @@window_hWnd
    end

    def self.callfunc(funcstr,args)
      CallWindowProc.call(funcstr,args,0,0)
    end
   
    def self.set_window_size(x,y,w,h)
      MoveWindow.call(@@window_hWnd,x,y,w,h,1)
    end
   
    def self.get_desktop_size
      [GetSystemMetrics.call(0),GetSystemMetrics.call(1)]
    end
   
    def self.get_window_hdc
      GetDC.call(window_hwnd)
    end

    def self.get_window_size
      rem = "\0"*16
      GetWindowRect.call(@@window_hWnd,rem)
      l,t,r,b = *rem.unpack("l*")
      ret = [l,t,r-l,b-t]
      return ret
    end
   
    def self.get_tray_size
      hwnd = FindWindow.call("Shell_TrayWnd","")
      rem = "\0"*16
      GetWindowRect.call(hwnd,rem)
      l,t,r,b = *rem.unpack("l*")
      ret = [l,t,r-l,b-t]
      return ret
    end
   
    def self.get_window_size_with_client(width,height)
      style = GetWindowLong.call(@@window_hWnd,-16)
      exStyle = GetWindowLong.call(@@window_hWnd,-20)
      rcClient = [0,0,width,height].pack("l*")
      AdjustWindowRectEx.call(rcClient, style, 0, exStyle)
      size = rcClient.unpack("l*")
      [size[2]-size[0],size[3]-size[1]]
    end

    def self.hook(name,addr,len,code,*args)
      if @@hook_contents[name]
        raise 'hooked function'
      else
        @@hook_contents[name] = Hooker.new(addr,0,len,code,*args)
        @@hook_contents[name].prepare
      end
    end
   
    def self.hook_head(name,addr,len,code,*args)
      if @@hook_contents[name]
        raise 'hooked function'
      else
        @@hook_contents[name] = Hooker.new(addr,1,len,code,*args)
        @@hook_contents[name].prepare
      end
    end
   
    def self.get_hooker(name)
      @@hook_contents[name]
    end
   
    init
   
    class Hooker
      
      JUMP_TYPE = [0xE8,0xE9]
      
      def initialize(addr,type,len,code,*vars)
        @addr = addr
        @count = len
        @type = type
        @code = code
        @vars = vars
        @ptrs = "\x0"
        @rem = "\x0"*@count
        @hook_code = "\x0"*@count
        @asm_code = "\x0"
        @is_turn_on = false
      end
      
      def calc_asm_code
        asm_code = []
        @ptrs = @vars.pack("L*")
        ptr_vars = @ptrs.address
        @code.each do |byte|
          if byte<0
            addr = ptr_vars+(byte.abs-1)*4
            asm_code.push(*[addr].pack("L").unpack("C*"))
          elsif byte>=1000
            index = byte/1000-1
            asm_code.push(*[@vars[index]].pack("L").unpack("C*"))
          else
            asm_code << byte
          end
        end
        @asm_code = asm_code.pack("C*")
      end
      
      def prepare
        Win32Tools.readmem(@rem,@addr,@count)
        calc_asm_code
        addr_code = @asm_code.address
        hook_code = [JUMP_TYPE[@type],addr_code-@addr-5]+[0x90]*(@count-5)
        @hook_code = hook_code.pack("CLC*")
        Win32Tools.unprotect(addr_code,@asm_code.byte_length)
      end
      
      def turn_on
        return if @is_turn_on
        Win32Tools.writemem(@addr,@hook_code,@count)
        @is_turn_on = true
      end

      def turn_off
        return unless @is_turn_on
        Win32Tools.writemem(@addr,@rem,@count)
        @is_turn_on = false
      end
      
      def get_var(index)
        ret = "\0"*4
        Win32Tools.readmem(ret,@ptrs.address+index*4,4)
        ret.unpack("L").first
      end
      
      def get_var_addr(index)
        @ptrs.address+index*4
      end

    end

  end
  
  module RGSS3Runtime
    ADDR_EVAL = Win32Tools.module_handle + 0x3C10
  end
  
end[/pre]

原画面放大脚本2[pre lang="ruby"]# LargerWindow by Fux2
# 欢迎访问rpg.blue获取更多RPG Maker资源
# 发布、转载时请保留此处文字

module Fux2
  module GameResetController
   
    ADDR_UPDATE_PRESS = Win32Tools.module_handle + 0x278B

    def self.set_enable(flag)
      if flag
        Win32Tools.writemem(ADDR_UPDATE_PRESS,"\x7D",1)
      else
        Win32Tools.writemem(ADDR_UPDATE_PRESS,"\xEB",1)
      end
    end
  end
  
  module WindowManager
   
    ADDR_GRAPHICS_UPDATE = Win32Tools.module_handle + 0x15470
    ADDR_SWITCH_FULLSCREEN = Win32Tools.module_handle + 0x87720
    ADDR_FULLSCREEN_BACK = Win32Tools.module_handle + 0x30DC
    ADDR_WINDOW_STRUCT_BASE = Win32Tools.module_handle + 0x12B6C4

    ADDR_HOOK_GRAPHICS_UPDATE1 = Win32Tools.module_handle + 0x2AC2
    ADDR_HOOK_GRAPHICS_UPDATE2 = Win32Tools.module_handle + 0x2F0C
    ADDR_HOOK_GRAPHICS_UPDATE3 = Win32Tools.module_handle + 0x2F6A
    ADDR_HOOK_GAMEDRAW = Win32Tools.module_handle + 0x884DE
    ADDR_HOOK_FULLSCREEN = Win32Tools.module_handle + 0x30D7

    CODE_HOOK_GRAPHICS_UPDATE = [
      0x55,
      0x8B,0xEC,
      0x51,
      0xC6,0x05,-1,0x01,
      0xFF,0x75,0x0C,
      0xFF,0x75,0x08,
      0xFF,0x15,-2,
      0xC6,0x05,-1,0x00,
      0x8B,0xE5,
      0x5D,
      0xC2,0x08,0x00
    ]
   
    CODE_HOOK_GRAPHICS_UPDATE_DEC = [
      0x55,
      0x8B,0xEC,
      0x51,
      0xC6,0x05,1000,0x01,
      0xFF,0x75,0x0C,
      0xFF,0x75,0x08,
      0xFF,0x15,-2,
      0xC6,0x05,1000,0x00,
      0x8B,0xE5,
      0x5D,
      0xC2,0x08,0x00
    ]
   
    CODE_HOOK_GAMEDRAW = [
      0x55,
      0x8B,0xEC,
      0x80,0x3D,1000,0x00,
      0x74,0x37,
      0x8B,0x45,0x28,
      0x8B,0x4D,0x14,
      0x8B,0x55,0x24,
      0x50,
      0x8B,0x45,0x18,
      0x50,
      0x51,
      0x52,
      0x8B,0x55,0x20,
      0x52,
      0x8B,0x55,0x1C,
      0x52,
      0x8B,0x55,0x10,
      0x03,0xC0,
      0x50,
      0x03,0xC9,
      0x51,
      0x8B,0x4D,0x0C,
      0x8D,0x04,0x12,
      0x8B,0x55,0x08,
      0x50,
      0x51,
      0x52,
      0xFF,0x15,-3,
      0x5D,
      0xC2,0x24,0x00,
      0x5D,
      0xFF,0x25,-2
    ]

    CODE_HOOK_FULLSCREEN = [
      0x50,
      0x8B,0x44,0x24,0x04,
      0xA3,-1,
      0x58,
      0xFF,0x15,-2,
      0x60,
      0x68,3000,
      0xFF,0x15,-4,
      0x83,0xC4,0x04,
      0x61,
      0xFF,0x25,-5
    ]

    STR_FULLSCREEN_EVENT = 'Fux2::WindowManager.after_switch_fullscreen'
   
    DEFAULT_WIDTH = 640
    DEFAULT_HEIGHT = 480
   
    @@is_double = false
    @@screen_width_addr = 0
   
    def self.set_game_window_size(width,height)
      need_w,need_h = *Win32Tools.get_window_size_with_client(width,height)
      desktop_w,desktop_h = *Win32Tools.get_desktop_size
      if need_w<=desktop_w && need_h<=desktop_h
        new_x = (desktop_w-need_w)/2
        new_y = (desktop_h-need_h)/2
        Win32Tools.set_window_size(new_x,new_y,need_w,need_h)
        return true
      else
        return false
      end
    end

    def self.set_multiple(multiple,save=true)
      multiple = [[1,multiple].max,3].min
      if multiple==1
        set_game_window_size(DEFAULT_WIDTH,DEFAULT_HEIGHT)
        close_hooker
        @@is_double = false if save
      else
        tw = DEFAULT_WIDTH * multiple
        th = DEFAULT_HEIGHT * multiple
        if set_game_window_size(tw,th)
          Win32Tools.writemem(@@screen_width_addr,[tw].pack("L"),4)
          open_hooker
          @@is_double = true if save
        end
      end
      Graphics.update
    end
   
    def self.open_hooker
      return if is_fullscreen?
      Win32Tools.get_hooker('reUpdate1').turn_on
      Win32Tools.get_hooker('reUpdate2').turn_on
      Win32Tools.get_hooker('reUpdate3').turn_on
      Win32Tools.get_hooker('reDraw').turn_on
    end
   
    def self.close_hooker
      Win32Tools.get_hooker('reUpdate1').turn_off
      Win32Tools.get_hooker('reUpdate2').turn_off
      Win32Tools.get_hooker('reUpdate3').turn_off
      Win32Tools.get_hooker('reDraw').turn_off
    end
   
    def self.init
      @@screen_width_addr = Win32Tools.read_ptr_value(ADDR_WINDOW_STRUCT_BASE,0,0x134,0xB4,0x20)+0x4
      Win32Tools.hook('reUpdate1',ADDR_HOOK_GRAPHICS_UPDATE1,5,CODE_HOOK_GRAPHICS_UPDATE,1,ADDR_GRAPHICS_UPDATE)
      ptr_indraw_flag = Win32Tools.get_hooker('reUpdate1').get_var_addr(0)
      Win32Tools.hook('reUpdate2',ADDR_HOOK_GRAPHICS_UPDATE2,5,CODE_HOOK_GRAPHICS_UPDATE_DEC,ptr_indraw_flag,ADDR_GRAPHICS_UPDATE)
      Win32Tools.hook('reUpdate3',ADDR_HOOK_GRAPHICS_UPDATE3,5,CODE_HOOK_GRAPHICS_UPDATE_DEC,ptr_indraw_flag,ADDR_GRAPHICS_UPDATE)
      
      addr_bitblt = Win32Tools.get_proc_addr('gdi32','BitBlt')
      addr_sbitblt = Win32Tools.get_proc_addr('gdi32','StretchBlt')

      Win32Tools.hook('reDraw',ADDR_HOOK_GAMEDRAW,6,CODE_HOOK_GAMEDRAW,ptr_indraw_flag,addr_bitblt,addr_sbitblt)
      Win32Tools.hook_head('fullScreenSwitch',ADDR_HOOK_FULLSCREEN,5,CODE_HOOK_FULLSCREEN,0,ADDR_SWITCH_FULLSCREEN,STR_FULLSCREEN_EVENT.address,RGSS3Runtime::ADDR_EVAL,ADDR_FULLSCREEN_BACK)
      Win32Tools.get_hooker('fullScreenSwitch').turn_on
    end
   
    def self.after_switch_fullscreen
      muilt = (@@is_double && !is_fullscreen?) ? 2 : 1
      set_multiple(muilt,false)
    end

    def self.is_fullscreen?
      Win32Tools.get_hooker('fullScreenSwitch').get_var(0) == 1
    end
   
    def self.is_double?
      @@is_double
    end

    init
  end
  
end

class << Input
  alias _fux_ud update unless $@
  def update
    _fux_ud
    if trigger?(Input::F5)
      if Fux2::WindowManager.is_double?
        Fux2::WindowManager.set_multiple(1)
      else
        Fux2::WindowManager.set_multiple(2) #双倍大小的窗口
      end
    end
  end
end

# 屏蔽F12按钮
Fux2::GameResetController.set_enable(false)[/pre]


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



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


Bitmap 追加 for 烛光[pre lang="ruby"]# coding: utf-8
=begin
= Bitmap類拡張 (DLL版)
RPGツクールXP/VX共用
添加功能 Bitmap 類。
- Marshaldump 啟用
- 保存為PNG文件
-色調變化
-馬賽克效果
-反相顏色
-模糊效果
-使用遮罩-切除
-混合

■ 注意
這個腳本需要"tktk_bitmap.dll"(ver0.1.2.6以上)。

Author::    半生
Date::      2010/12/13
Version::   0.1.2.6
URL::       http://www.tktkgame.com/

################更新########################
2010/12/13 ver 0.1.2.6
 dll名稱從"hn_rg_bitmap.dll"變更為"tktk_bitmap.dll"
 LARGE_BITMAP機能でメモリを確保できなかった場合の処理を追加
2010/10/12 ver 0.1.2.5(デンジャラスベータ版)
 大きいサイズのBitmapオブジェクトを機能を試験的に実装(危険)
2010/03/24 ver 0.1.2.2
 ブレンディング機能関連の軽量化。
 画像連結系メソッドの分離。
2010/03/24 ver 0.1.2.1
 ブレンディング機能関連のバグフィックス
2010/03/22 ver 0.1.2.0
 加算合成等のブレンディング機能の追加
2010/02/07 ver 0.1.1.0
 マーシャル化の処理の一部をDLLに移動
2010/01/17 ver 0.1.0.0
 dllの名称を"hn_rx_bitmap.dll"から"hn_rg_bitmap.dll"に変更
 モザイク効果・色反転・ぼかし効果の追加
############################################
=end

module TKTK_Bitmap
  LARGE_BITMAP = true # 是否使用大型點陣圖的功能
  DLL_NAME = 'tktk_bitmap'

  ERROR_ALLOCATE_FAILED = -110002

  @@png_save = Win32API.new(DLL_NAME, 'PngSaveA', 'p n i i', 'i')
  @@blur = Win32API.new(DLL_NAME, 'Blur', 'n i', 'i')
  @@change_tone = Win32API.new(DLL_NAME, 'ChangeTone', 'n i i i i', 'i')
  @@clip_mask = Win32API.new(DLL_NAME, 'ClipMask', 'n n i i i', 'i')
  @@invert = Win32API.new(DLL_NAME, 'InvertColor', 'n', 'i')
  @@mosaic = Win32API.new(DLL_NAME, 'Mosaic', 'n i i i i i i', 'i')
  @@address = Win32API.new(DLL_NAME, 'GetAddress', 'n', 'n')
  @@get_pixel_data = Win32API.new(DLL_NAME, 'GetPixelData', 'n p i', 'i')
  @@set_pixel_data = Win32API.new(DLL_NAME, 'SetPixelData', 'n p i', 'i')
  @@blend_blt = Win32API.new(DLL_NAME, 'BlendBlt', 'n i i n i i i i i i', 'i')
  #@@get_hwnd = Win32API.new(DLL_NAME, 'GetGameHWND', 'v', 'l')
  @@change_size = Win32API.new(DLL_NAME, 'ChangeSize', 'n i i', 'i')
  module_function

  # PNG形式儲存
  def png_save(bitmap,file_name,compression_level,filter)
    return @@png_save.call(file_name, bitmap.object_id, compression_level, filter)
  end

  # 模糊效果
  def blur(bitmap, r = 1)
    return @@blur.call(bitmap.object_id, r)
  end
  
  # 更改顏色平衡?
  def change_tone(bitmap, red = 0, green = 0, blue = 0, simplify = 1)
    return @@change_tone.call(bitmap.object_id, red, green, blue, simplify)
  end
# 剪貼蒙版圖像(α乘法)
  def clip_mask(g_bitmap, m_bitmap, x=0, y=0, outer=0)
    return @@clip_mask.call(g_bitmap.object_id, m_bitmap.object_id, x, y, outer)
  end

  # 色的反轉
  def invert(bitmap)
    return @@invert.call(bitmap.object_id)
  end

  # 馬賽克效果
  def mosaic(bitmap, msw=5, msh=5)
    return self.mosaic_rect(bitmap, bitmap.rect, msw, msh)
  end

  # 馬賽克效果(範圍指定)
  def mosaic_rect(bitmap, rect, msw=5, msh=5)
    return @@mosaic.call(bitmap.object_id,
    rect.x, rect.y, rect.width, rect.height, msw, msh)
  end

  # 獲取Bitmap資料位址
  def address(bitmap)
    return @@address.call(bitmap.object_id)
  end
  
  # 二進位資料獲取點Bitmap陣圖
  def get_pixel_data(bitmap)
    buffer = "bgra" * bitmap.width * bitmap.height
    @@get_pixel_data.call(bitmap.object_id, buffer, buffer.size)
    return buffer
  end
  
  #替換為Bitmap中的二進位資料
  def set_pixel_data(bitmap, data)
    return @@set_pixel_data.call(bitmap.object_id, data, data.size)
  end
  
  def blend_blt(dest_bmp, x, y, src_bmp, rect, blend_type=0, opacity=255)
    @@blend_blt.call(dest_bmp.object_id, x, y, src_bmp.object_id,
                rect.x, rect.y, rect.width, rect.height,
                blend_type, opacity)
  end

  # 改變Bitmap的大小(風險)
  def change_size(bitmap, new_width, new_height)
    return -1 if (new_width <=0 or new_height <= 0)
    result = @@change_size.call(bitmap.object_id, new_width, new_height)
    if result == ERROR_ALLOCATE_FAILED
      raise("tktk_bitmap:ERROR ALLOCATE FAILED")
    end
    return result
  end
  
end

class Font
  def marshal_dump;end
  def marshal_load(obj);end
end
class Bitmap
  # PNG 壓縮篩檢程式
  PNG_NO_FILTERS   = 0x00
  PNG_FILTER_NONE  = 0x08
  PNG_FILTER_SUB   = 0x10
  PNG_FILTER_UP    = 0x20
  PNG_FILTER_AVG   = 0x40
  PNG_FILTER_PAETH = 0x80
  PNG_ALL_FILTERS  = (PNG_FILTER_NONE | PNG_FILTER_SUB | PNG_FILTER_UP |
                      PNG_FILTER_AVG | PNG_FILTER_PAETH)

  # Marshal_dump
  def _dump(limit)
    return "" if self.disposed?
    data = TKTK_Bitmap.get_pixel_data(self)
    [width, height, Zlib::Deflate.deflate(data)].pack("LLa*") # ついでに圧縮
  end
  
  # Marshal_load
  def self._load(str)
    if str == ""
      b = Bitmap.new(1,1)
      b.dispose
      return b
    end
    w, h, zdata = str.unpack("LLa*"); b = new(w, h)
    TKTK_Bitmap.set_pixel_data(b, Zlib::Inflate.inflate(zdata))
    return b
  end  
  
  def address
    TKTK_Bitmap.address(self)
  end

  #         模糊效果
  def blur2(r=1)
    TKTK_Bitmap.blur(self, r)
  end

  # 色調變化
  def change_tone(red, green, blue, simplify = 1)
    TKTK_Bitmap.change_tone(self, red, green, blue, simplify)
  end
  
  # 剪切
  def clip_mask(bitmap, x=0, y=0, outer=0)
    TKTK_Bitmap.clip_mask(self, bitmap, x, y, outer)
  end

  # 反相顏色
  def invert
    TKTK_Bitmap.invert(self)
  end

  # 馬賽克效果
  def mosaic(msw=5, msh=5)
    TKTK_Bitmap.mosaic(self, msw, msh)
  end

  # 馬賽克效果 (指定區域)
  def mosaic_rect(rect=self.rect, msw=5, msh=5)
    TKTK_Bitmap.mosaic_rect(self, rect, msw, msh)
  end

  # 混合
  def blend_blt(x, y, src_bmp, rect, blend_type=0, opacity=255)
    return if opacity <= 0
    TKTK_Bitmap.blend_blt(self, x, y, src_bmp, rect, blend_type, opacity)
  end

  #Png 格式保存
  def png_save(outp, level = 9, filter = PNG_NO_FILTERS)
    if (TKTK_Bitmap.png_save(self, outp, level, filter) != 0)
      raise("Bitmap\#png_save failed")
    end
  end

  # 允許更大的 bitmap.new (危険)
  # 寬度 * 高度大約是1073741823
  if TKTK_Bitmap::LARGE_BITMAP
    class << self
      unless method_defined?(:_hn_large_bm__new)
        alias :_hn_large_bm__new :new
      end
      def new(*args)
        if args.size == 2 && args[0] * args[1] >= 4194304
          new_width = args[0]
          new_height = args[1]
          # 暫時以小尺寸作成
          bitmap = _hn_large_bm__new(16, 16)
          TKTK_Bitmap.change_size(bitmap, new_width, new_height)
          return bitmap
        else
          _hn_large_bm__new(*args)
        end
      end
    end # Bitmap.new
  end
end # CLASS Bitmap
[/pre]



烛光[pre lang="ruby"]=begin
  HN_Light version 1.0.1.0 for VX Ace
        by 半生
http://www.tktkgame.com

  要HN_RG_BITMAP(ver 0.1.2.1以降)

2012/01/08 ver 1.0.1.2
 队列歩行の仲间に対応

2015/04/25 Xp移植(ver 1.0)
  By RyanBern
  
2015/12/20 ver 1.1
  Z 坐标修正 && 战斗测试 BUG 修复

2018/02/11 ver 1.2
  增加控制黑暗不透明度的变量

=end

# ----- 在这里设定-----
module HN_Light
  # 简略化0:(精细)~2:(粗暴,负荷轻)
  SIMPLIFY = 2
  
  # 表示黑暗处的不透明度的变量号码
  # 变量的数值为0-255,越大则不可见度越高
  DARK_OPACITY_VAR = 33
  
  # 玩家的烛光类型使用的变量号码
  PLAYER_LIGHT_TYPE = 32
  
  # 黑暗判断上使用的开关
  DARK_SWITCH = 19

  # 烛光事件识别用的正规表达式
  REGEX_LIGHT = /@LIGHT(\d+)/

  # 烛光图像的目录
  LIGHT_IMG_DIR = "Graphics/Pictures/"

  # 烛光Bitmap设定
  LIGHTS = [
  # [文件名  ,单元数, 放大率,  Y偏移值, 色相]
    ["light1",     1,    1.3,        0,    0],#1·提着灯
    ["light2",     1,    1.8,        0,    0],#2·暗了
    ["light1",     1,    0.6,        0,    0],#3·提着小灯
    ["light2",     1,    0.6,       -0,    0],#4·非常暗了
    ["light5",     1,    3.0,        0,    0],#5·火光
    ["light6",     1,    1.5,        0,    0],#6·存档光
    ["light3",     1,    0.6,       -0,    0],#7·小天井光
    ["light8",     1,    3.0,        0,    0],#8·淡蓝色灯光
    ["light5",     1,    1.5,      -23,    0],#9·火光(小)
    ["light5",     1,    3.0,      -25,    0],#10·高火光
    ["light8",     1,    3.0,        0,  100],#11·淡紫色灯光
  ]
end
#  ----- 在这里设定 -----

module HN_Light
  # 事件mix-in用
  module LightEvent
    attr_reader :light_type
    def initialize
      super()
      @light_type = 0
    end

    def check_light
      @light_type = 0
      return if @list.nil?
      @list.each do |command|
        break if @light_type > 0
        if command.code == 108 or command.code == 408
          command.parameters.each do |line|
            if line =~ REGEX_LIGHT
              @light_type = $1.to_i
              break
            end
          end
        end
      end # END @list.each
    end

  end # END module LightEvent


  class Light
    attr_reader :bitmap
    attr_reader :cells
    attr_reader :width
    attr_reader :height
    attr_reader :ox
    attr_reader :oy
    def initialize(light_type, s_zoom = 1)
      light = LIGHTS[light_type - 1]
      if light.nil?
        # 本来不应该来这里
        @bitmap = Bitmap.new(32, 32)
        @cells = 1
        @zoom = 1.0
        @oy = 16
        @ox = 16
        @width  = 32
        @height = 32
      else
        @bitmap = Bitmap.new(LIGHT_IMG_DIR + light[0])
        @bitmap.invert()
        @cells = light[1].to_i
        @cells = 1 if (@cells < 1 or @cells > @bitmap.width)
        @zoom = light[2].to_f
        @zoom = 1.0 if @zoom <= 0.0
        @zoom /= s_zoom
        @width  = @bitmap.width / @cells
        @height = @bitmap.height

        # 缩放处理
        if @zoom != 1.0
          new_width  = (@width * @zoom).round
          new_height = (@height * @zoom).round
          if new_width * new_height < 1
            @zoom = 1.0
          else
            @width = new_width
            @height = new_height
            new_bitmap = Bitmap.new(@width * @cells, @height)
            new_bitmap.stretch_blt(new_bitmap.rect,@bitmap, @bitmap.rect)
            @bitmap.dispose
            @bitmap = new_bitmap
          end
        end
        @ox = @width / 2
        @oy = @height / 2 - light[3].to_i / s_zoom

        # 色相変换
        if ( (hue = light[4].to_i) != 0)
          @bitmap.hue_change(hue)
        end
      end
    end # End def initialize

    # 色调转换
    def dispose
      @bitmap.dispose
      @bitmap = nil
    end
  end

end

class Game_Event
  include HN_Light::LightEvent
  alias :_hn_light__setup :refresh unless method_defined?(:_hn_light__setup)
  def refresh
    _hn_light__setup
    check_light()
  end
end

class Game_Player
  def light_type
    return $game_variables[HN_Light::PLAYER_LIGHT_TYPE]
  end
end

class Game_Map
  attr_reader :light_events

  # 更新烛光事件列表
  def refresh_lights
    @light_events = []
    @events.values.each do |event|
      if (event.light_type > 0)
        @light_events.push(event)
      end
    end
  end

  alias :_hn_light__setup_events :setup unless method_defined?(:_hn_light__setup_events)
  def setup(map_id)
    _hn_light__setup_events(map_id)
    refresh_lights() if @map_id > 0
  end

  alias :_hn_light__refresh :refresh unless method_defined?(:_hn_light__refresh)
  def refresh
    _hn_light__refresh()
    refresh_lights() if @map_id > 0
  end
end

class Sprite_Dark < Sprite
  @@base_color = Color.new(255,255,255,192)

  def initialize(viewport = nil)
    super(viewport)
    @width = 640
    @height = 480

    case HN_Light::SIMPLIFY
    when 1
      @zoom = 2
    when 2
      @zoom = 4
    else
      @zoom = 1
    end
    @width /= @zoom
    @height /= @zoom
    self.zoom_x = @zoom.to_f
    self.zoom_y = @zoom.to_f

    self.bitmap = Bitmap.new(@width, @height)
    self.bitmap.fill_rect(self.bitmap.rect, @@base_color)
    self.blend_type = 2 # 混合型(减算)
    self.z = 800
    self.visible = false
    @light_cache = {}
  end

  # 追加烛光
  def add_light(charactor)
    return if charactor.nil?
    light_type = charactor.light_type
    return if (light_type < 1 or light_type > HN_Light::LIGHTS.size)
    unless @light_cache.key?(light_type)
      @light_cache[light_type] = HN_Light::Light.new(light_type, @zoom)
    end
    light = @light_cache[light_type]

    # 画面外什麽都不做
    if @zoom == 1
      return if (charactor.screen_x < 0  - light.width + light.ox)
      return if (charactor.screen_x > @width + light.ox)
      return if (charactor.screen_y < 0 - light.height + light.oy)
      return if (charactor.screen_y > @height + light.oy)
    else
      return if (charactor.screen_x < 0  - (light.width + light.ox) * @zoom)
      return if (charactor.screen_x > (@width + light.ox)  * @zoom)
      return if (charactor.screen_y < 0 - (light.height + light.oy) * @zoom)
      return if (charactor.screen_y > (@height + light.oy) * @zoom)
    end

    # 动画判定
    if light.cells > 1
      index = (Graphics.frame_count / 4) % light.cells
      rect = Rect.new(index * light.width , 0, light.width, light.height)
    else
      rect = light.bitmap.rect
    end
    if @zoom != 1
      p_x = charactor.screen_x / @zoom - light.ox
      p_y = (charactor.screen_y - 16) / @zoom - light.oy
    else
      p_x = charactor.screen_x - light.ox
      p_y = charactor.screen_y - 16 - light.oy
    end

    # 乗算合成(3)
    self.bitmap.blend_blt(p_x, p_y, light.bitmap, rect, 3)
  end


  def refresh
    self.bitmap.fill_rect(self.bitmap.rect, @@base_color)
    $game_map.light_events.each do |event|
      next if HN_Light::LIGHTS[event.light_type - 1].nil?
      add_light(event)
    end
    add_light($game_player)
  end

  # 更新
  def update
    super
    @@base_color = Color.new(255, 255, 255, $game_variables[HN_Light::DARK_OPACITY_VAR])
    refresh()
  end

  #--------------------------------------------------------------------------
  # ● 解放
  #--------------------------------------------------------------------------
  def dispose
    self.bitmap.dispose
    @light_cache.values.each do |light|
      light.dispose
    end
    super
  end
end


class Spriteset_Map  
  # 动画判定
  def create_dark
    @dark_sprite = Sprite_Dark.new(@viewport1)
  end

  # 更新黑暗Sprite
  def update_dark
    if (@dark_sprite.visible = $game_switches[HN_Light::DARK_SWITCH])
      @dark_sprite.update
    end
  end

  # 破弃黑暗Sprite
  def dispose_dark
    @dark_sprite.dispose
  end

  # 初期化
  alias :_dark__initialize :initialize unless private_method_defined?(:_dark__initialize)
  def initialize
    _dark__initialize()
    create_dark()
    update_dark()
  end

  # 更新
  alias :_dark__update :update unless method_defined?(:_dark__update)
  def update
    _dark__update()
    update_dark() if !@dark_sprite.nil? and !@dark_sprite.disposed?
  end

  # 结束处理
  alias :_dark__dispose :dispose unless method_defined?(:_dark__dispose)
  def dispose
    dispose_dark()
    _dark__dispose()
  end
end[/pre]


【tktk_bitmap.dll】烛光效果相关的插件
tktk_bitmap.zip (88.68 KB, 下载次数: 5)

点评

↓估计不行,看上去得做分辨率适配。87楼的脚本估计是做了适配的,到时候我会移植此脚本到rgm的范例中。  发表于 2023-6-12 10:25
是能更改1024X576不出现黑边了吗  发表于 2023-6-12 00:38
ヾ(◍°∇°◍)ノ゙!!!  发表于 2023-6-9 11:04
你可以参照范例里扩展窗口的事件,用脚本修改窗口大小。在运行时修改config.ini,或者让用户自己改config.ini,重启游戏窗口就扩大了。  发表于 2023-6-8 22:20
tktk_bitmap.dll已经加入到todo,不过我近期有新的计划,这个等1.1.0发布后再做  发表于 2023-6-8 22:18
回复

使用道具 举报

梦石
0
星屑
26092
在线时间
1595 小时
注册时间
2016-1-6
回帖
3441

超评测参与极短28参与极短27参与极短26参与极短25参与

发表于 2023-6-8 15:53:05 | 显示全部楼层
我想问一下,最低配置是多少,比如说:CPU?内存?显卡?操作系统?等等。

点评

好的,谢谢。  发表于 2023-6-8 22:21
操作系统建议Win10,但是目前还是能支持Win7的。近期的电脑应该都够用,内存消耗比较高,一般得预留1G。  发表于 2023-6-8 22:11
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部