设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
12
返回列表 发新帖
楼主: zh99998
打印 上一主题 下一主题

[RMVX发布] RPGVX -> RGE 兼容层【用RGE来运行VX工程】(2011-6-18更新)

[复制链接]

Lv2.观梦者 (管理员)

八云紫的式神

梦石
0
星屑
609
在线时间
1243 小时
注册时间
2008-1-1
帖子
4282

烫烫烫

11
 楼主| 发表于 2011-6-11 14:42:19 | 只看该作者
一箭烂YiJL 发表于 2011-6-11 13:56
最初我是常驻VX,于是我放出几个我写的出来:
1. zh,我电脑那个 dll 无效...= =RGE 的 Bitmap 结构特殊, ...

首先感谢您认真看我的帖子并进行修改

1. DLL那个方式我也表示很不爽...所以也没塞进RGE文件夹里而是丢在外面,准备换的,你这个帮了我大忙了
不过RGE还有个Bitmap.mem_new可以直接从内存地址读bitmap,然后字符串里也有个获取内存地址的方法,如果可能的话试试不使用临时文件?

2.字体阴影我挂了一个XP的,效果可以,只是跟VX不完全相同就是了

3.thanks

4.修正按键的话,ABC应该读注册表的,所有RMVX游戏共用那一套,读注册表的函数在RTP那个里面有,可以用一下
rm for linux(wine)制作中,期待夏娜SAMA能实现到webrm上
回复 支持 反对

使用道具 举报

Lv4.逐梦者

弓箭手?剑兰

梦石
0
星屑
5459
在线时间
833 小时
注册时间
2010-11-17
帖子
1140
12
发表于 2011-6-11 15:23:31 | 只看该作者
zh99998 发表于 2011-6-11 14:42
首先感谢您认真看我的帖子并进行修改

1. DLL那个方式我也表示很不爽...所以也没塞进RGE文件夹里而是丢在 ...

表示用字符串的方法之后读取有点问题= =,用 RtlMoveMemory 来取内存的,
先是有关这个函数的用法:http://rpg.blue/blog-115768-8486.html(前部分)

然后我偶尔发现了它的指针位置是 object_id * 2 偏移 12 的,比如:
  1. RtlMoveMemory_pi = Win32API.new("kernel32", "RtlMoveMemory", "pii", "i")
  2. zh = "zh99998"
  3. address = "xxxx"
  4. RtlMoveMemory_pi.call(address, zh.object_id * 2 + 12, address.size)
  5. address = address.unpack("L")[0]   # 这个就是内存位置的开头
  6. buff = " " * zh.size               # 将成为 "zh99998" 的复制本
  7. RtlMoveMemory_pi.call(buff, address, zh.size)
  8. p buff
复制代码
但是一旦用了在 Bitmap.mem_new 出错,我也不知道为啥~...这个加载办法我还是第一次尝试的。

点评

还有 RTP 哪里有 ABC 键?  发表于 2011-6-11 15:24
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
462 小时
注册时间
2007-7-30
帖子
643
13
发表于 2011-6-11 16:27:57 | 只看该作者
zh99998 发表于 2011-6-11 14:42
首先感谢您认真看我的帖子并进行修改

1. DLL那个方式我也表示很不爽...所以也没塞进RGE文件夹里而是丢在 ...

自己刻的Shadow 应该VX一样
  1. class Font
  2.   #設定預設值
  3.   @default_shadow = true
  4.   @shadow = @default_shadow
  5.   def default_shadow
  6.     @default_shadow = true if @default_shadow == nil
  7.     return @default_shadow
  8.   end
  9.   def default_shadow=(shadow)
  10.     @default_shadow = shadow
  11.   end
  12.   def shadow
  13.     @shadow = self.default_shadow if @shadow == nil
  14.     return @shadow
  15.   end
  16.   def shadow=(shadow)
  17.     @shadow = shadow
  18.   end
  19. end

  20. class Bitmap
  21.   if $bitmap_drawtext_wrote == nil
  22.     alias old_draw_text draw_text
  23.     $bitmap_drawtext_wrote = true
  24.   end
  25.   def draw_text(*args)
  26.     shadow = false
  27.     shadow = true if (self.font.shadow == true)
  28.     if args.size < 4
  29.       args[2] = 0 if args.size == 2
  30.       if shadow == true
  31.         args[0].x += 1
  32.         args[0].y += 1
  33.         color = Color.new(self.font.color.red, self.font.color.green, self.font.color.blue, self.font.color.alpha)
  34.         self.font.color.set(0, 0, 0, self.font.color.alpha)
  35.         old_draw_text(args[0], args[1], args[2])
  36.         args[0].x -= 1
  37.         args[0].y -= 1
  38.         self.font.color = color
  39.       end
  40.       old_draw_text(args[0], args[1], args[2])
  41.     else
  42.       self.font.shadow = false
  43.       args[5] = 0 if args.size == 5
  44.       if shadow == true
  45.         args[0] += 1
  46.         args[1] += 1
  47.         color = Color.new(self.font.color.red, self.font.color.green, self.font.color.blue, self.font.color.alpha)
  48.         self.font.color.set(0, 0, 0, self.font.color.alpha)
  49.         old_draw_text(args[0], args[1], args[2], args[3], args[4], args[5])
  50.         args[0] -= 1
  51.         args[1] -= 1
  52.         self.font.color = color
  53.       end
  54.       old_draw_text(args[0], args[1], args[2], args[3], args[4], args[5])
  55.       self.font.shadow = true
  56.     end
  57.   end
  58. end
复制代码
Bitmap#blur
  1. #===============================================================#
  2. #   ●RGSS2_bitmap_xp ver 1.02
  3. #===============================================================#
  4. class Bitmap
  5.    
  6. def blur(times=1,during =1,blur=1)
  7.    #blur(重做模糊次数,经历帧数,分散半径)
  8.    for i in 1..times
  9.      blur_r(blur)
  10.      for j in 1..during
  11.        Graphics.update if i > 1 and during >1
  12.      end     
  13.    end   
  14. end
  15. #----------------------------------------------------------------
  16. def blur_r(radius = 2)
  17.     #blur_r(分散半径)
  18.     radius = 1 if radius <= 1 or radius == nil #值的修正
  19.     src_bitmap = self
  20.     rect = self.rect
  21.    
  22.     ta_l = 1+radius*2
  23.     ta = Table.new(ta_l,ta_l)  #过滤器

  24.     for i in 0..ta_l-1
  25.       for j in 0..ta_l-1
  26.         ta[i,j] = 1
  27.       end
  28.     end

  29.       ta[((ta.xsize+1)/2)-1,((ta.xsize+1)/2)-1] = 2**(1+radius)
  30.       main = ta[((ta.xsize+1)/2)-1,((ta.xsize+1)/2)-1]#找到中心点

  31.       nn = 2;j = ((ta.xsize+1)/2)-1;line =[]#主干道
  32.       for i in 0..((ta.xsize+1)/2)-2
  33.         ta[i,j] = nn
  34.         ta[j,i] = nn
  35.         ta[ta.xsize-1-i,j] = nn
  36.         ta[j,ta.xsize-1-i] = nn
  37.         line.push ta[i,((ta.xsize+1)/2)-1]
  38.         nn = nn * 2
  39.       end
  40.    
  41.     for j in 0..line.size-1
  42.        for i in 0..((ta.xsize+1)/2)-2
  43.         line[j] = line[j]/2
  44.         if line[j] == 1
  45.           break
  46.         else
  47.           ta[((ta.xsize+1)/2)-2-i,j] = line[j]
  48.           ta[((ta.xsize+1)/2)+i,j] = line[j]
  49.           ta[((ta.xsize+1)/2)-2-i,ta.xsize-1-j] = line[j]
  50.           ta[((ta.xsize+1)/2)+i,ta.xsize-1-j] = line[j]
  51.         end
  52.       end
  53.     end
  54.     key_a = [];key_p = main
  55.     for i in 1..main
  56.       if key_p == 1
  57.         key_a.push main
  58.         break
  59.       else
  60.       key_p = key_p/2
  61.       key_a.push key_p
  62.       end
  63.     end
  64.     key_k = 0
  65.     for i in 0..key_a.size-1
  66.       key_k = key_k + key_a[i]
  67.     end
  68.     key = 255/key_k
  69.     key = 1 if key <= 0  #值的修正

  70.    for i in 0..ta.xsize-1
  71.         for j in 0..ta.ysize-1
  72.             key_main = key*ta[i,j]
  73.             key_main = 255 if key_main > 255 ; key_main = 1 if key_main < 0  #值的修正
  74.             self.blt(i-(((ta.xsize+1)/2)-1),j-(((ta.xsize+1)/2)-1),src_bitmap,rect,key_main)
  75.         end
  76.     end
  77.   end
  78. end  
复制代码
RGE这万年大坑 啥时填起来@@

回复 支持 反对

使用道具 举报

Lv4.逐梦者

弓箭手?剑兰

梦石
0
星屑
5459
在线时间
833 小时
注册时间
2010-11-17
帖子
1140
14
发表于 2011-6-11 16:40:11 | 只看该作者
david50407 发表于 2011-6-11 16:27
自己刻的Shadow 应该VX一样Bitmap#blur

其实 @default_shadow 应否用类变量呢?(貌似会省下一些内存...不知道= =)
Bitmap 貌似是这个:
  1. http://rpg.blue/article-40940.html
复制代码
是吗?

Bitmap.mem_new 不知为啥会出错,看 12 楼那个无误获取字符串内存地址的办法,
我(Vista)出错,RGE::BaseError   Create bitmap error with(Address:0x???????, Length:905216),
脚本如下(呼叫zh来看= =):
  1. #==============================================================================
  2. # ■ Graphics
  3. #------------------------------------------------------------------------------
  4. #  进行有关全体图像处理的模块。
  5. #   RGE 的 Graphics.snap_to_bitmap。(和 XP 版有分别)
  6. #==============================================================================
  7. module Graphics
  8.   #--------------------------------------------------------------------------
  9.   # ● API 函数
  10.   #--------------------------------------------------------------------------
  11.   CreateDC = Win32API.new("gdi32", "CreateDC", "pppl", "l")
  12.   CreateCompatibleBitmap = Win32API.new("gdi32", "CreateCompatibleBitmap", "lll", "l")
  13.   CreateCompatibleDC = Win32API.new("gdi32", "CreateCompatibleDC", "l", "l")
  14.   SelectObject = Win32API.new("gdi32", "SelectObject", "ll", "l")
  15.   BitBlt = Win32API.new("gdi32", "BitBlt", "lllllllll", "l")
  16.   GetBitmapBits = Win32API.new("gdi32", "GetBitmapBits", "llp", "l")
  17.   ScreenToClient = Win32API.new("user32", "ScreenToClient", "ip", "i")
  18.   DeleteDC = Win32API.new("gdi32", "DeleteDC", "l", "l")
  19.   DeleteObject = Win32API.new("gdi32", "DeleteObject", "l", "l")
  20.   SRCCOPY = 0xCC0020
  21.   RtlMoveMemory_pi = Win32API.new("kernel32", "RtlMoveMemory", "pii", "i")
  22.   HWnd = Win32API.new("user32", "GetActiveWindow", nil, 'l').call
  23.   DwCount = (Frame.width * Frame.height * 4)# * 2
  24.   @@lpBits = "\000" * DwCount
  25.   #--------------------------------------------------------------------------
  26.   # ● snap_to_bitmap (RGE版)
  27.   #--------------------------------------------------------------------------
  28.   def self.snap_to_bitmap
  29.     hScrDC = CreateDC.call("DISPLAY", "", "", 0)
  30.     hMemDC = CreateCompatibleDC.call(hScrDC)
  31.     hBitmap = CreateCompatibleBitmap.call(hScrDC, width, height)
  32.     hOldBitmap = SelectObject.call(hMemDC, hBitmap)
  33.     win_pos = "\0\0\0\0\0\0\0\0"
  34.     ScreenToClient.call(HWnd, win_pos)
  35.     win_pos = win_pos.unpack("LL")
  36.     BitBlt.call(hMemDC, win_pos[0], win_pos[1], width*2, height*2, hScrDC, 0, 0, SRCCOPY)
  37.     hBitmap2 = SelectObject.call(hMemDC, hOldBitmap)
  38.     GetBitmapBits.call(hBitmap2, DwCount, @@lpBits)
  39.     # 释放所有东西
  40.     DeleteDC.call(hScrDC)
  41.     DeleteDC.call(hMemDC)
  42.     DeleteObject.call(hBitmap)
  43.     DeleteObject.call(hOldBitmap)
  44.     DeleteObject.call(hBitmap2)
  45.     rgbs = @@lpBits
  46.     len = width * 4
  47.     for y in 0...height
  48.       break if 2 * y >= height - 1
  49.       nth1 = y * len
  50.       nth2 = (height - 1 - y) * len
  51.       tStr = rgbs[nth1,len]
  52.       rgbs[nth1, len] = rgbs[nth2, len]
  53.       rgbs[nth2, len] = tStr
  54.     end
  55.     # 找 String 的内存地址
  56.     rgbs_address = "xxxx"    # 分配指针 4 个字节
  57.     RtlMoveMemory_pi.call(rgbs_address, rgbs.object_id * 2 + 12, 4)
  58.     rgbs_address = rgbs_address.unpack("L")[0]
  59.     bitmap = Bitmap.mem_new(rgbs_address, Frame.width * Frame.height * 4)
  60.     return bitmap
  61.   end
  62. end
复制代码

点评

blur是之前用的 已经忘记是哪位大神写的了  发表于 2011-6-11 22:16
嗯@default_shadow是应该用@@才对  发表于 2011-6-11 22:16
回复 支持 反对

使用道具 举报

Lv4.逐梦者

弓箭手?剑兰

梦石
0
星屑
5459
在线时间
833 小时
注册时间
2010-11-17
帖子
1140
15
发表于 2011-6-13 19:42:37 | 只看该作者
连个帖,发布完成了的(话说zh你的头像....):
  1. #==============================================================================
  2. # ■ Graphics
  3. #------------------------------------------------------------------------------
  4. #  进行有关全体图像处理的模块。
  5. #   RGE 的 Graphics.snap_to_bitmap。(RGE版)
  6. #==============================================================================
  7. module Graphics
  8.   #--------------------------------------------------------------------------
  9.   # ● API 函数
  10.   #--------------------------------------------------------------------------
  11.   CreateDC = Win32API.new("gdi32", "CreateDC", "pppl", "l")
  12.   CreateCompatibleBitmap = Win32API.new("gdi32", "CreateCompatibleBitmap", "lll", "l")
  13.   CreateCompatibleDC = Win32API.new("gdi32", "CreateCompatibleDC", "l", "l")
  14.   SelectObject = Win32API.new("gdi32", "SelectObject", "ll", "l")
  15.   BitBlt = Win32API.new("gdi32", "BitBlt", "lllllllll", "l")
  16.   GetBitmapBits = Win32API.new("gdi32", "GetBitmapBits", "llp", "l")
  17.   ScreenToClient = Win32API.new("user32", "ScreenToClient", "ip", "i")
  18.   DeleteDC = Win32API.new("gdi32", "DeleteDC", "l", "l")
  19.   DeleteObject = Win32API.new("gdi32", "DeleteObject", "l", "l")
  20.   HWnd = Win32API.new("user32", "GetActiveWindow", nil, 'l').call
  21.   DwCount = (Frame.width * Frame.height * 4)# * 2
  22.   #--------------------------------------------------------------------------
  23.   # ● 值
  24.   #--------------------------------------------------------------------------
  25.   @@lpBits = "\000" * DwCount
  26.   SRCCOPY = 0xCC0020
  27.   #--------------------------------------------------------------------------
  28.   # ● snap_to_bitmap (RGE版)
  29.   #--------------------------------------------------------------------------
  30.   def self.snap_to_bitmap
  31.     hScrDC = CreateDC.call("DISPLAY", "", "", 0)
  32.     hMemDC = CreateCompatibleDC.call(hScrDC)
  33.     hBitmap = CreateCompatibleBitmap.call(hScrDC, width, height)
  34.     hOldBitmap = SelectObject.call(hMemDC, hBitmap)
  35.     win_pos = "\0\0\0\0\0\0\0\0"
  36.     ScreenToClient.call(HWnd, win_pos)
  37.     win_pos = win_pos.unpack("LL")
  38.     BitBlt.call(hMemDC, win_pos[0], win_pos[1], width*2, height*2, hScrDC, 0, 0, SRCCOPY)
  39.     hBitmap2 = SelectObject.call(hMemDC, hOldBitmap)
  40.     GetBitmapBits.call(hBitmap2, DwCount, @@lpBits)
  41.     # 释放所有东西
  42.     DeleteDC.call(hScrDC)
  43.     DeleteDC.call(hMemDC)
  44.     DeleteObject.call(hBitmap)
  45.     DeleteObject.call(hOldBitmap)
  46.     DeleteObject.call(hBitmap2)
  47.     rgbs = @@lpBits
  48.     len = width * 4
  49.     for y in 0...height
  50.       break if 2 * y >= height - 1
  51.       nth1 = y * len
  52.       nth2 = (height - 1 - y) * len
  53.       tStr = rgbs[nth1,len]
  54.       rgbs[nth1, len] = rgbs[nth2, len]
  55.       rgbs[nth2, len] = tStr
  56.     end
  57.     size = 54 + Frame.width * Frame.height * 4
  58.     chunk1 = "BM" + [size].pack("L") + "\0\0\0\0\x36\0\0\0"
  59.     chunk2 = "\x28\0\0\0" + [Frame.width, Frame.height].pack("L2") +
  60.     "\1\0\x20\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
  61.     rgbs = chunk1 + chunk2 + rgbs
  62.     bitmap = Bitmap.mem_new(rgbs.maddr, rgbs.size)
  63.     return bitmap
  64.   end
  65. end
复制代码

评分

参与人数 1星屑 +600 收起 理由
zh99998 + 600 thanks

查看全部评分

回复 支持 反对

使用道具 举报

Lv2.观梦者 (管理员)

八云紫的式神

梦石
0
星屑
609
在线时间
1243 小时
注册时间
2008-1-1
帖子
4282

烫烫烫

16
 楼主| 发表于 2011-6-18 18:03:55 | 只看该作者
6-18更新,感谢一箭烂YiJL 更新内容见顶楼

点评

其实还是有不完美的地方的 例如 选择 新的开始 后 会出现类似卡的问题(文字消失了,但没转到游戏地图上,也就是有延缓)  发表于 2011-7-20 19:25
rm for linux(wine)制作中,期待夏娜SAMA能实现到webrm上
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
83 小时
注册时间
2010-9-16
帖子
54
17
发表于 2011-7-20 19:31:44 | 只看该作者
有buy没处说,冒着被扣分的危险还是提交吧,想用点评的  但点评中只出现了一小部分文字,多余文字被系统屏蔽了?
在选择 新的游戏 后 标题换面并没有一下转到游戏地图(就是能控制小人在地图上来回跑的页面) 而是 文字消失了 延缓了一下才 转到开始页面

点评

好吧 ,我out了。。。  发表于 2011-7-20 19:41
好吧 ,我out  发表于 2011-7-20 19:41
发布区随便挖坟,不扣分= =  发表于 2011-7-20 19:36
回复 支持 反对

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-15 22:34

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表