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

Project1

 找回密码
 注册会员
搜索
楼主: guoxiaomi
打印 上一主题 下一主题

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

[复制链接]

Lv4.逐梦者

梦石
0
星屑
7921
在线时间
1049 小时
注册时间
2012-4-3
帖子
1271

开拓者

101
发表于 2023-8-6 21:59:33 | 只看该作者
请问一下郭兄,主楼提到的“worker 以多线程或者协程的方式合作”,其中的多线程是正常玩家理解的那个东西(如cpu4核8线程、8核16线程等)么?

本来还写了一段关于线程处理的构想,避免歧义,还是先问清楚再说。
热爱生命,相信未来。
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
380
在线时间
53 小时
注册时间
2023-7-16
帖子
19
102
发表于 2023-8-7 14:52:33 | 只看该作者
本帖最后由 zlyl_wiley 于 2023-8-8 14:46 编辑

本来只想改一下天气随屏幕大小调整,结果捉到一只BUG,就是屏幕跟窗口大小不一致的情况下,画面冻结和过渡时会瞬间缩小的问题
目前解决方法就是自行Graphics#resize_screen一下
看config.rb里面似乎并没有读取屏幕的宽高,不清楚是在哪里读取的,郭大修一下吧

然后天气稍微改动了一下,根据屏幕大小,按原来的比例调整天气的范围和数量
没什么技术含量的东西,应该出不了什么问题

-----------
更新一下脚本:

RUBY 代码复制
  1. # 屏幕大小改动过的话,目前需要先手动更新一下
  2. Graphics.resize_screen(960, 720)


RUBY 代码复制
  1. # -------------------------------------------------------------------------------------------------
  2. # RPG::Weather
  3. # -------------------------------------------------------------------------------------------------
  4. module RPG
  5.   class Weather
  6.     MULTIPLE = (Graphics.width * Graphics.height) / 307200.0 # (640 * 480.0)
  7.     PW = Graphics.width - 640
  8.     PH = Graphics.height - 480
  9.     SPRITE_MAX = (40 * MULTIPLE).to_i
  10.     def initialize(viewport = nil)
  11.       @type = 0
  12.       @max = 0
  13.       @ox = 0
  14.       @oy = 0
  15.       color1 = Color.new(255, 255, 255, 255)
  16.       color2 = Color.new(255, 255, 255, 128)
  17.       @rain_bitmap = Bitmap.new(7, 56)
  18.       (0..6).each do |i|
  19.         @rain_bitmap.fill_rect(6 - i, i * 8, 1, 8, color1)
  20.       end
  21.       @storm_bitmap = Bitmap.new(34, 64)
  22.       (0..31).each do |i|
  23.         @storm_bitmap.fill_rect(33 - i, i * 2, 1, 2, color2)
  24.         @storm_bitmap.fill_rect(32 - i, i * 2, 1, 2, color1)
  25.         @storm_bitmap.fill_rect(31 - i, i * 2, 1, 2, color2)
  26.       end
  27.       @snow_bitmap = Bitmap.new(6, 6)
  28.       @snow_bitmap.fill_rect(0, 1, 6, 4, color2)
  29.       @snow_bitmap.fill_rect(1, 0, 4, 6, color2)
  30.       @snow_bitmap.fill_rect(1, 2, 4, 2, color1)
  31.       @snow_bitmap.fill_rect(2, 1, 2, 4, color1)
  32.       @sprites = []
  33.       (1..SPRITE_MAX).each do |_i|
  34.         sprite = Sprite.new(viewport)
  35.         sprite.z = 1000
  36.         sprite.visible = false
  37.         sprite.opacity = 0
  38.         @sprites.push(sprite)
  39.       end
  40.     end
  41.  
  42.     def dispose
  43.       @sprites.each do |sprite|
  44.         sprite.dispose
  45.       end
  46.       @rain_bitmap.dispose
  47.       @storm_bitmap.dispose
  48.       @snow_bitmap.dispose
  49.     end
  50.  
  51.     def type=(type)
  52.       return if @type == type
  53.  
  54.       @type = type
  55.       bitmap = case @type
  56.                when 1
  57.                  @rain_bitmap
  58.                when 2
  59.                  @storm_bitmap
  60.                when 3
  61.                  @snow_bitmap
  62.                end
  63.       (1..SPRITE_MAX).each do |i|
  64.         sprite = @sprites[i]
  65.         unless sprite.nil?
  66.           sprite.visible = (i <= @max)
  67.           sprite.bitmap = bitmap
  68.         end
  69.       end
  70.     end
  71.  
  72.     def ox=(ox)
  73.       return if @ox == ox
  74.  
  75.       @ox = ox
  76.       @sprites.each do |sprite|
  77.         sprite.ox = @ox
  78.       end
  79.     end
  80.  
  81.     def oy=(oy)
  82.       return if @oy == oy
  83.  
  84.       @oy = oy
  85.       @sprites.each do |sprite|
  86.         sprite.oy = @oy
  87.       end
  88.     end
  89.  
  90.     def max=(max)
  91.       return if @max == max
  92.       @max = ([[max, 0].max, 40].min * MULTIPLE).to_i
  93.       (1..SPRITE_MAX).each do |i|
  94.         sprite = @sprites[i]
  95.         sprite.visible = (i <= @max) unless sprite.nil?
  96.       end
  97.     end
  98.  
  99.     def update
  100.       return if @type == 0
  101.       (1..@max).each do |i|
  102.         sprite = @sprites[i]
  103.         break if sprite.nil?
  104.  
  105.         if @type == 1
  106.           sprite.x -= 2
  107.           sprite.y += 16
  108.           sprite.opacity -= 8
  109.         end
  110.         if @type == 2
  111.           sprite.x -= 8
  112.           sprite.y += 16
  113.           sprite.opacity -= 12
  114.         end
  115.         if @type == 3
  116.           sprite.x -= 2
  117.           sprite.y += 8
  118.           sprite.opacity -= 8
  119.         end
  120.         x = sprite.x - @ox
  121.         y = sprite.y - @oy
  122.         next unless (sprite.opacity < 64) || (x < -50) || (x > 750 + PW) || (y < -300) || (y > 500 + PH)
  123.  
  124.         sprite.x = rand(-50..(749 + PW)) + @ox
  125.         sprite.y = rand(-200..(599 + PH)) + @oy
  126.         sprite.opacity = 255
  127.       end
  128.     end
  129.     attr_reader :type, :max, :ox, :oy
  130.   end
  131. end




--------------
再来个变量版
这一版多了个resize(width, height)方法,在中途更改分辨率的时候,可以不中断天气地刷新天气的范围大小
经过频繁随机$game_screen.weather和resize测试,没测出毛病来,但对自己还是不太放心……
并且大概是在浪费时间,应该不会有人在游戏中途改分辨率吧!
RUBY 代码复制
  1. # -------------------------------------------------------------------------------------------------
  2. # RPG::Weather
  3. # -------------------------------------------------------------------------------------------------
  4. module RPG
  5.   class Weather
  6.     def initialize(viewport = nil)
  7.       @multiple = (Graphics.width * Graphics.height) / 307200.0 # (640 * 480.0)
  8.       @pw = Graphics.width - 640
  9.       @ph = Graphics.height - 480
  10.       @max = (40 * @multiple).to_i
  11.       @type = 0
  12.       @ox = 0
  13.       @oy = 0
  14.       color1 = Color.new(255, 255, 255, 255)
  15.       color2 = Color.new(255, 255, 255, 128)
  16.       @rain_bitmap = Bitmap.new(7, 56)
  17.       (0..6).each do |i|
  18.         @rain_bitmap.fill_rect(6 - i, i * 8, 1, 8, color1)
  19.       end
  20.       @storm_bitmap = Bitmap.new(34, 64)
  21.       (0..31).each do |i|
  22.         @storm_bitmap.fill_rect(33 - i, i * 2, 1, 2, color2)
  23.         @storm_bitmap.fill_rect(32 - i, i * 2, 1, 2, color1)
  24.         @storm_bitmap.fill_rect(31 - i, i * 2, 1, 2, color2)
  25.       end
  26.       @snow_bitmap = Bitmap.new(6, 6)
  27.       @snow_bitmap.fill_rect(0, 1, 6, 4, color2)
  28.       @snow_bitmap.fill_rect(1, 0, 4, 6, color2)
  29.       @snow_bitmap.fill_rect(1, 2, 4, 2, color1)
  30.       @snow_bitmap.fill_rect(2, 1, 2, 4, color1)
  31.       @sprites = []
  32.       (1..@max).each do |_i|
  33.         sprite = Sprite.new(viewport)
  34.         sprite.z = 1000
  35.         sprite.visible = false
  36.         sprite.opacity = 0
  37.         @sprites.push(sprite)
  38.       end
  39.     end
  40.  
  41.     def resize(width, height)
  42.       @multiple = (width * height) / 307200.0 # (640 * 480.0)
  43.       @pw = width - 640
  44.       @ph = height - 480
  45.       @max = (40 * @multiple).to_i
  46.       if @max == @sprites.size
  47.         return
  48.       elsif @max < @sprites.size
  49.         (@max...@sprites.size).each do |i|
  50.           @sprites[i].visible = false
  51.         end
  52.       else
  53.         bitmap = case @type
  54.                  when 1
  55.                    @rain_bitmap
  56.                  when 2
  57.                    @storm_bitmap
  58.                  when 3
  59.                    @snow_bitmap
  60.                  end
  61.         viewport = @sprites[0].viewport
  62.         (@sprites.size..@max).each do |_i|
  63.           sprite = Sprite.new(viewport)
  64.           sprite.z = 1000
  65.           sprite.bitmap = bitmap
  66.           @sprites.push(sprite)
  67.         end
  68.       end
  69.     end
  70.  
  71.     def dispose
  72.       @sprites.each do |sprite|
  73.         sprite.dispose
  74.       end
  75.       @rain_bitmap.dispose
  76.       @storm_bitmap.dispose
  77.       @snow_bitmap.dispose
  78.     end
  79.  
  80.     def type=(type)
  81.       return if @type == type
  82.       @type = type
  83.       bitmap = case @type
  84.                when 1
  85.                  @rain_bitmap
  86.                when 2
  87.                  @storm_bitmap
  88.                when 3
  89.                  @snow_bitmap
  90.                end
  91.       (0..[@max, @sprites.size].max).each do |i|
  92.         sprite = @sprites[i]
  93.         unless sprite.nil?
  94.           sprite.visible = (i <= @max)
  95.           sprite.bitmap = bitmap
  96.         end
  97.       end
  98.     end
  99.  
  100.     def ox=(ox)
  101.       return if @ox == ox
  102.  
  103.       @ox = ox
  104.       @sprites.each do |sprite|
  105.         sprite.ox = @ox
  106.       end
  107.     end
  108.  
  109.     def oy=(oy)
  110.       return if @oy == oy
  111.  
  112.       @oy = oy
  113.       @sprites.each do |sprite|
  114.         sprite.oy = @oy
  115.       end
  116.     end
  117.  
  118.     def max=(max)
  119.       return if @max == (max * @multiple).to_i
  120.       last = @max
  121.       @max = ([[max, 0].max, 40].min * @multiple).to_i
  122.       ([last, @max].min...@sprites.size).each do |i|
  123.         @sprites[i].visible = (i <= @max)
  124.       end
  125.     end
  126.  
  127.     def update
  128.       return if @type == 0
  129.       (0..@max).each do |i|
  130.         sprite = @sprites[i]
  131.         break if sprite.nil?
  132.  
  133.         if @type == 1
  134.           sprite.x -= 2
  135.           sprite.y += 16
  136.           sprite.opacity -= 8
  137.         end
  138.         if @type == 2
  139.           sprite.x -= 8
  140.           sprite.y += 16
  141.           sprite.opacity -= 12
  142.         end
  143.         if @type == 3
  144.           sprite.x -= 2
  145.           sprite.y += 8
  146.           sprite.opacity -= 8
  147.         end
  148.         x = sprite.x - @ox
  149.         y = sprite.y - @oy
  150.         next unless (sprite.opacity < 64) || (x < -50) || (x > 750 + @pw) || (y < -300) || (y > 500 + @ph)
  151.  
  152.         sprite.x = rand(-50..(749 + @pw)) + @ox
  153.         sprite.y = rand(-200..(599 + @ph)) + @oy
  154.         sprite.opacity = 255
  155.       end
  156.     end
  157.     attr_reader :type, :max, :ox, :oy
  158.   end
  159. end

点评

一般情况下只在游戏开始的时候改一下分辨率比较好,大部分游戏都是这样的,改变分辨率后要重启>_<。我先记下了,等1.1.0出来再统一改bug  发表于 2023-8-18 22:47
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
380
在线时间
53 小时
注册时间
2023-7-16
帖子
19
103
发表于 2023-9-16 00:40:29 | 只看该作者
本帖最后由 zlyl_wiley 于 2023-9-22 23:31 编辑

(编辑)好吧,把问题说出来之后我自己就理清楚思路了。。小黄鸭DEBUG了属于是,。。已经统一采用#text_size测量高度了,很抱歉冒昧打扰了,不知道该不该删帖,总之不看也罢。。
另外我在第十页最后一贴有一些关于RGM的使用反馈,可能刚好翻页大佬没看见,顺便再次请求简单回复一下,或者在1.1发布时再统一回复也好,我确定我会是比较重度的使用者,但属于人菜瘾大,所以今后大概还会时常需要大佬的技术支持,最近我也在造轮子,当然跟重写一个RT完全不在一个档次,但也体会到了个中的艰辛,真的很佩服各位大神,再次感谢!
-------

不好意思又是我
最近在写一个图文排版的脚本,并且目标是要兼容RGM、RGU和原版RT,然后出现了一个问题,就是三个RT对Font#size的表现各异,导致了相同的代码和文档在排版之后会呈现不同的效果
这个问题发生在高度大于宽度的字体上,原版RT的处理是将字体的长边限制在Font#size然后按比例缩小,而RGM和RGU是让短边等于Font#size,长边按比例放大,即Bitmap#text_size的height会大于Font#size,这样,将Font#size作为Bitmap#draw_text的height参数时,原版字体不会超出rect的范围,而两个第三方RT超出,但表现又不一样,RGU在绘制时会将字体居中于绘制框,这样字体上下两端会被截掉,而RGM是顶对齐,所以字体下方会被截掉,再一个,我现在碰到的出问题的字体,它上下超出的部分其实是空白的,所以RGU的表现其实刚刚好,比原版RT还完美,而RGM变成顶端留白下方缺失,效果比较难以接受,具体见下图
这个问题困扰了我很久,首先这应该不算是BUG,其次我不知道其它字体还有多少存在这种情况,它们超出部分是不是也是空白的,为了兼容各个RT,我已经在脚本里加了很多判断分歧,而这个问题牵涉比较广,再加恐怕代码会非常臃肿,而且频繁#text_size也实在是浪费,所以不得已来请教一下郭大的意见,我个人的想法是希望RGM能跟RGU一样居中,先不管其它字体是否还有隐患,但即使最终脚本仍然难逃大改,但至少两者效果能够统一肯定是好事

RGM,字体大小与RGU一致,只是绘制的位置不同:


RGU,字体垂直居中,上下空白被截后,在Font#size为高度的绘制范围内刚好顶天立地:


原版,字体大小与第三方的两位不同,所以自动换行也不同,字体在Font#size为高度的绘制框中上下留有白边:


其它测试用的涂鸦:



点评

个人看法是,字超出框是ub,runtime想怎么实现都可以,不过确实可以增加一个设置,让它居中或者对齐吧  发表于 2023-9-30 22:51
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
31
在线时间
4 小时
注册时间
2023-10-17
帖子
5
104
发表于 2023-10-18 12:43:17 | 只看该作者
感谢大佬
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
65
在线时间
7 小时
注册时间
2019-4-21
帖子
2
105
发表于 2023-11-12 16:15:22 | 只看该作者
本帖最后由 正灌道长 于 2023-11-17 04:11 编辑

目前发现的一些问题:
1.原有的截图存档脚本里,将bitmap缓存进行marshal_dump处理的部分失效了,似乎是bitmap在内存中的格式发生了变化,目前不知道如何解决
2.窗口的contents内容绘制用的混合模式是减法,导致无法正常对该内容部分进行不透明度调整,同样不知道如何解决,只能暂时先放弃使用窗口内容透明的效果
3.现在处理玩家移动的DIR4的逻辑过于简单,导致移动手感很不妙,实质上的DIR4大致遵循如下算法:
①按照进入按下状态的方向键的先后顺序放入栈中,处于松开状态的按键会被移出栈
②如果一个按键和与其相反方向的按键同时在栈中,则将这两个按键忽略
③取未被忽略的栈顶按键作为最终移动方向
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
95
在线时间
8 小时
注册时间
2013-9-19
帖子
1
106
发表于 2023-12-17 15:39:38 | 只看该作者
编译出错,该怎么办?
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-4-27 23:45

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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