楼主: guoxiaomi

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

[复制链接]
梦石
0
星屑
8026
在线时间
1051 小时
注册时间
2012-4-3
回帖
1270

开拓者

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

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

使用道具 举报

梦石
0
星屑
410
在线时间
60 小时
注册时间
2023-7-16
回帖
17
发表于 2023-8-7 14:52:33 | 显示全部楼层
本帖最后由 zlyl_wiley 于 2023-8-8 14:46 编辑

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

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

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

[pre lang="ruby"]# 屏幕大小改动过的话,目前需要先手动更新一下
Graphics.resize_screen(960, 720) [/pre]

[pre lang="ruby"]# -------------------------------------------------------------------------------------------------
# RPG::Weather
# -------------------------------------------------------------------------------------------------
module RPG
  class Weather
    MULTIPLE = (Graphics.width * Graphics.height) / 307200.0 # (640 * 480.0)
    PW = Graphics.width - 640
    PH = Graphics.height - 480
    SPRITE_MAX = (40 * MULTIPLE).to_i
    def initialize(viewport = nil)
      @type = 0
      @max = 0
      @ox = 0
      @oy = 0
      color1 = Color.new(255, 255, 255, 255)
      color2 = Color.new(255, 255, 255, 128)
      @rain_bitmap = Bitmap.new(7, 56)
      (0..6).each do |i|
        @rain_bitmap.fill_rect(6 - i, i * 8, 1, 8, color1)
      end
      @storm_bitmap = Bitmap.new(34, 64)
      (0..31).each do |i|
        @storm_bitmap.fill_rect(33 - i, i * 2, 1, 2, color2)
        @storm_bitmap.fill_rect(32 - i, i * 2, 1, 2, color1)
        @storm_bitmap.fill_rect(31 - i, i * 2, 1, 2, color2)
      end
      @snow_bitmap = Bitmap.new(6, 6)
      @snow_bitmap.fill_rect(0, 1, 6, 4, color2)
      @snow_bitmap.fill_rect(1, 0, 4, 6, color2)
      @snow_bitmap.fill_rect(1, 2, 4, 2, color1)
      @snow_bitmap.fill_rect(2, 1, 2, 4, color1)
      @sprites = []
      (1..SPRITE_MAX).each do |_i|
        sprite = Sprite.new(viewport)
        sprite.z = 1000
        sprite.visible = false
        sprite.opacity = 0
        @sprites.push(sprite)
      end
    end

    def dispose
      @sprites.each do |sprite|
        sprite.dispose
      end
      @rain_bitmap.dispose
      @storm_bitmap.dispose
      @snow_bitmap.dispose
    end

    def type=(type)
      return if @type == type

      @type = type
      bitmap = case @type
               when 1
                 @rain_bitmap
               when 2
                 @storm_bitmap
               when 3
                 @snow_bitmap
               end
      (1..SPRITE_MAX).each do |i|
        sprite = @sprites
        unless sprite.nil?
          sprite.visible = (i <= @max)
          sprite.bitmap = bitmap
        end
      end
    end

    def ox=(ox)
      return if @ox == ox

      @ox = ox
      @sprites.each do |sprite|
        sprite.ox = @ox
      end
    end

    def oy=(oy)
      return if @oy == oy

      @oy = oy
      @sprites.each do |sprite|
        sprite.oy = @oy
      end
    end

    def max=(max)
      return if @max == max
      @max = ([[max, 0].max, 40].min * MULTIPLE).to_i
      (1..SPRITE_MAX).each do |i|
        sprite = @sprites
        sprite.visible = (i <= @max) unless sprite.nil?
      end
    end

    def update
      return if @type == 0
      (1..@max).each do |i|
        sprite = @sprites
        break if sprite.nil?

        if @type == 1
          sprite.x -= 2
          sprite.y += 16
          sprite.opacity -= 8
        end
        if @type == 2
          sprite.x -= 8
          sprite.y += 16
          sprite.opacity -= 12
        end
        if @type == 3
          sprite.x -= 2
          sprite.y += 8
          sprite.opacity -= 8
        end
        x = sprite.x - @ox
        y = sprite.y - @oy
        next unless (sprite.opacity < 64) || (x < -50) || (x > 750 + PW) || (y < -300) || (y > 500 + PH)

        sprite.x = rand(-50..(749 + PW)) + @ox
        sprite.y = rand(-200..(599 + PH)) + @oy
        sprite.opacity = 255
      end
    end
    attr_reader :type, :max, :ox, :oy
  end
end[/pre]

1.jpg

--------------
再来个变量版
这一版多了个resize(width, height)方法,在中途更改分辨率的时候,可以不中断天气地刷新天气的范围大小
经过频繁随机$game_screen.weather和resize测试,没测出毛病来,但对自己还是不太放心……
并且大概是在浪费时间,应该不会有人在游戏中途改分辨率吧!
[pre lang="ruby"]# -------------------------------------------------------------------------------------------------
# RPG::Weather
# -------------------------------------------------------------------------------------------------
module RPG
  class Weather
    def initialize(viewport = nil)
      @multiple = (Graphics.width * Graphics.height) / 307200.0 # (640 * 480.0)
      @pw = Graphics.width - 640
      @ph = Graphics.height - 480
      @max = (40 * @multiple).to_i
      @type = 0
      @ox = 0
      @oy = 0
      color1 = Color.new(255, 255, 255, 255)
      color2 = Color.new(255, 255, 255, 128)
      @rain_bitmap = Bitmap.new(7, 56)
      (0..6).each do |i|
        @rain_bitmap.fill_rect(6 - i, i * 8, 1, 8, color1)
      end
      @storm_bitmap = Bitmap.new(34, 64)
      (0..31).each do |i|
        @storm_bitmap.fill_rect(33 - i, i * 2, 1, 2, color2)
        @storm_bitmap.fill_rect(32 - i, i * 2, 1, 2, color1)
        @storm_bitmap.fill_rect(31 - i, i * 2, 1, 2, color2)
      end
      @snow_bitmap = Bitmap.new(6, 6)
      @snow_bitmap.fill_rect(0, 1, 6, 4, color2)
      @snow_bitmap.fill_rect(1, 0, 4, 6, color2)
      @snow_bitmap.fill_rect(1, 2, 4, 2, color1)
      @snow_bitmap.fill_rect(2, 1, 2, 4, color1)
      @sprites = []
      (1..@max).each do |_i|
        sprite = Sprite.new(viewport)
        sprite.z = 1000
        sprite.visible = false
        sprite.opacity = 0
        @sprites.push(sprite)
      end
    end

    def resize(width, height)
      @multiple = (width * height) / 307200.0 # (640 * 480.0)
      @pw = width - 640
      @ph = height - 480
      @max = (40 * @multiple).to_i
      if @max == @sprites.size
        return
      elsif @max < @sprites.size
        (@max...@sprites.size).each do |i|
          @sprites.visible = false
        end
      else
        bitmap = case @type
                 when 1
                   @rain_bitmap
                 when 2
                   @storm_bitmap
                 when 3
                   @snow_bitmap
                 end
        viewport = @sprites[0].viewport
        (@sprites.size..@max).each do |_i|
          sprite = Sprite.new(viewport)
          sprite.z = 1000
          sprite.bitmap = bitmap
          @sprites.push(sprite)
        end
      end
    end
   
    def dispose
      @sprites.each do |sprite|
        sprite.dispose
      end
      @rain_bitmap.dispose
      @storm_bitmap.dispose
      @snow_bitmap.dispose
    end

    def type=(type)
      return if @type == type
      @type = type
      bitmap = case @type
               when 1
                 @rain_bitmap
               when 2
                 @storm_bitmap
               when 3
                 @snow_bitmap
               end
      (0..[@max, @sprites.size].max).each do |i|
        sprite = @sprites
        unless sprite.nil?
          sprite.visible = (i <= @max)
          sprite.bitmap = bitmap
        end
      end
    end

    def ox=(ox)
      return if @ox == ox

      @ox = ox
      @sprites.each do |sprite|
        sprite.ox = @ox
      end
    end

    def oy=(oy)
      return if @oy == oy

      @oy = oy
      @sprites.each do |sprite|
        sprite.oy = @oy
      end
    end

    def max=(max)
      return if @max == (max * @multiple).to_i
      last = @max
      @max = ([[max, 0].max, 40].min * @multiple).to_i
      ([last, @max].min...@sprites.size).each do |i|
        @sprites.visible = (i <= @max)
      end
    end

    def update
      return if @type == 0
      (0..@max).each do |i|
        sprite = @sprites
        break if sprite.nil?

        if @type == 1
          sprite.x -= 2
          sprite.y += 16
          sprite.opacity -= 8
        end
        if @type == 2
          sprite.x -= 8
          sprite.y += 16
          sprite.opacity -= 12
        end
        if @type == 3
          sprite.x -= 2
          sprite.y += 8
          sprite.opacity -= 8
        end
        x = sprite.x - @ox
        y = sprite.y - @oy
        next unless (sprite.opacity < 64) || (x < -50) || (x > 750 + @pw) || (y < -300) || (y > 500 + @ph)

        sprite.x = rand(-50..(749 + @pw)) + @ox
        sprite.y = rand(-200..(599 + @ph)) + @oy
        sprite.opacity = 255
      end
    end
    attr_reader :type, :max, :ox, :oy
  end
end
[/pre]

点评

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

使用道具 举报

梦石
0
星屑
410
在线时间
60 小时
注册时间
2023-7-16
回帖
17
发表于 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一致,只是绘制的位置不同:
1.jpg

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

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

其它测试用的涂鸦:
4.jpg
5.jpg

点评

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

使用道具 举报

梦石
0
星屑
46
在线时间
6 小时
注册时间
2023-10-17
回帖
5
发表于 2023-10-18 12:43:17 | 显示全部楼层
感谢大佬
回复

使用道具 举报

梦石
0
星屑
65
在线时间
7 小时
注册时间
2019-4-21
回帖
1
发表于 2023-11-12 16:15:22 | 显示全部楼层
本帖最后由 正灌道长 于 2023-11-17 04:11 编辑

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

使用道具 举报

梦石
0
星屑
145
在线时间
11 小时
注册时间
2013-9-19
回帖
1
发表于 2023-12-17 15:39:38 | 显示全部楼层
编译出错,该怎么办?
sp231217_153445.png
回复

使用道具 举报

梦石
0
星屑
9160
在线时间
466 小时
注册时间
2015-5-8
回帖
704
发表于 2025-7-27 21:42:37 | 显示全部楼层
请问下这个RGModern还在更新嘛
回复

使用道具 举报

梦石
0
星屑
47
在线时间
5 小时
注册时间
2021-10-18
回帖
3
发表于 2026-7-13 22:55:44 | 显示全部楼层
请问up还看这个帖子吗?能否给个新的编译器的下载链接,之前的链接无法下载。
回复

使用道具 举报

梦石
0
星屑
47
在线时间
5 小时
注册时间
2021-10-18
回帖
3
发表于 2026-7-13 23:05:45 | 显示全部楼层
使用这个适配rmxp游戏,游戏过程中会有局部色块闪烁,然后就闪退
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部