Project1

标题: 如何让你的rgss上浏览器 [打印本页]

作者: 玻璃柿子    时间: 2023-2-19 05:59
标题: 如何让你的rgss上浏览器
        首先,浏览器的运行机制和pc不一样,浏览器采用的是异步调用模式,并且是单线程的,所以不能像windows那样,通过消息循环来刷新游戏画面和处理游戏中的一些时间。
        在网页js中的循环,通常需要定义一个回调函数,将这个回调函数通过一定的途径注册到系统中去,然后让系统自动去调用,如下所示,我们定义main_update_loop为回调函数:

$prev_scene = nil
def main_update_loop
  if $scene != nil
    if $scene != $prev_scene
      if $prev_scene != nil
              $prev_scene.dispose
      end
      $scene.main
      $prev_scene = $scene
    end
    # Update game screen
    Graphics.update
    # Update input information
    Input.update
    # Frame update
    $scene.update
  else
    raise "END"
  end
end

在rgss脚本,main模块中,移除如下代码:
  while $scene != nil
    $scene.main
  end

此外,每一个场景(scene)里面,都会有一个循环更新的代码模块:
    loop do
      Graphics.update
      Input.update
      update
      if $scene != self
        break
      end
    end
        我们将这段模块移除,直接用end结尾,剩余部分再定义成另一个函数,给main_update_loop调用,
其模板如下所示:
class Scene_XXX
    ...
    def main
        ...
        Graphics.transition
                # 这里的loop语句块被直接移除,并使用end结尾
    end

        # 余下代码,重新定义成dispose函数
    def dispose
        Graphics.freeze
        ...
    end

    def update
        ...
    end
end

        最后是关于存储问题,由于浏览器不能直接访问计算机的文件,我们将游戏的记录保存再浏览器的缓存中,由于上面说到,浏览器的事件处理都是异步的,所以我们还需要再存储文件的地方加一段这样的代码:
class Scene_Save < Scene_File
    ...

    def on_decision(filename)
        ...

        file = File.open(filename, "wb")
        write_save_data(file)
        file.close

                # 这是额外加出的操作
        save_file_async(filename)

        ...
    end

    def write_save_data(file)
        ...
        Marshal.dump(characters, file)
        ...
        Marshal.dump($game_player, file)
        …
                # 这是额外加出的操作
        Marshal.dump(1, file)
    end
end

完成以上操作后,还需要为rgss配置资源预加载表,操作如下:

从百度网盘下载打包工具,并将其解压
链接:https://pan.baidu.com/s/1xQh4tXwRzItGjWC21OAl9Q
提取码:h2m6

安装msys2-x86_64-latest

安装完毕后,打开msys2,并运行命令安装ruby:
pacman -S ruby

将你游戏目录下所有的文件复制到gameasync

运行游戏目录下make_mapping.sh脚本

执行以下脚本:
for f in Data/*
do
        ./dump.sh “$f”
        echo “Processed file: $f”
done

将生成的preload文件夹移动到web-rgss同一层目录下

        最后一步,将打包工具下,除msys2-x86_64-latest以外的所有其他文件和文件夹放到你http服务器的目录下,你的游戏就能在网页上面运行了。
作者: 小怪兽奇奇侠    时间: 2023-2-19 10:26
我去,vx也能在线玩?这么厉害
作者: 玻璃柿子    时间: 2023-2-19 10:59
小怪兽奇奇侠 发表于 2023-2-19 10:26
我去,vx也能在线玩?这么厉害

忘记放示例了
http://124.70.196.6:8000/
由于买的服务器带宽不够,同时游戏引擎5m多,可能需要等一会儿
作者: y967    时间: 2023-2-19 16:43
厉害,玩了下,效果十分棒,加载有点慢,这个是单机网页版,还是可以在线交互,说话什么的?
作者: 玻璃柿子    时间: 2023-2-19 18:24
y967 发表于 2023-2-19 16:43
厉害,玩了下,效果十分棒,加载有点慢,这个是单机网页版,还是可以在线交互,说话什么的? ...

可以在线交互,说话,本身支持这个接口,但这个游戏里面没有,因为这个游戏我是拿别人做的游戏改的。
作者: 玻璃柿子    时间: 2023-2-19 18:40
附带下改过的游戏下载地址,要改可以自己加
该功能目前还在测试中,可能存在bug
链接:https://pan.baidu.com/s/1rumPPrLnf4AHxtfJkOC4Pw
提取码:66l4

GET请求:
response = HTTPLite.get("网址")
if response[:status] == 200
    # 成功,打印结果
    p response[:body]
else
    # 失败,打印错误信息
    p response[:status]
end

# POST请求
# 定义请求参数
postdata = {
    "key1" => "value1",
    "key2" => "value2"
}
#发送请求
response = HTTPLite.post("网址", postdata)
# 解析返回值
postdata = HTTPLite::JSON.stringify(postdata)

目前没有更复杂的接口,也没有支持websocket




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1