查看: 3378|回复: 16

[已经解决] 如何让游戏在按下红叉后不关闭?(已解决)

[复制链接]
梦石
0
星屑
3372
在线时间
1123 小时
注册时间
2015-12-24
回帖
236
发表于 2017-10-24 23:25:52 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
本帖最后由 翠靈月 于 2017-10-26 00:32 编辑

确切的说,是希望在按下红叉后弹窗,按是关闭,按否继续游戏


自己用多功能 DLL SiNova v10015脚本瞎JB捣鼓弄出来的结果是:
1回到游戏后画面刷新卡成狗
2直接卡死
3用各种开关条件瞎搞一波自己也不懂的骚操作,回到游戏后暂时没问题,但是再按一次红叉就会立刻直接关闭

请各位大佬指点正确的使用姿势

梦石
0
星屑
785
在线时间
59 小时
注册时间
2017-9-30
回帖
118
发表于 2017-10-25 08:15:29 | 显示全部楼层
  1. window.onbeforeunload=function(){
  2.     return '你确定要关闭游戏吗?';
  3. };
复制代码
回复

使用道具 举报

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

开拓者

发表于 2017-10-25 09:12:24 来自手机 | 显示全部楼层
alias _old_exit exit
def exit
...
回复

使用道具 举报

梦石
0
星屑
6375
在线时间
1473 小时
注册时间
2015-7-25
回帖
609

极短25参与开拓者

发表于 2017-10-25 12:29:49 | 显示全部楼层
先用黄鸡的脚本模板然后拿过来改一改
不过注意1点:
选择取消的时候(不退出游戏)你自己写,我这里只是强行来了遍rgss_main { SceneManager.run }而已(对这些不怎么了解所以这是目前想到的唯一方法,所以我只能改到这了)
[pre lang="ruby"]module MFXRB
MessageBoxW            = Win32API.new('user32', 'MessageBoxW',            'lppl',   'l')  
  def self.callMessageBoxW(hint, title, icon, button,hWnd = 0)
    MessageBoxW.call(hWnd, hint.u2w, title.u2w, icon | button)
  end
end
class String
  def w2u
    self.unpack("S*").pack("U*").sub(/\0+$/, '')
  end
  def u2w
    self.unpack("U*").pack("S*") + "\0\0"
  end
  def f_e
    self.force_encoding(__ENCODING__)
  end
      
      def byte_length
        ret = 0
        self.each_byte{ret+=1}
        ret
      end
      
      def address
        [self].pack("p").unpack("L")[0]
      end
      
    end

    module Fux2

      module Win32Tools
        RtlMoveMemoryLP = Win32API.new('kernel32','RtlMoveMemory','lpl','l')
        RtlMoveMemoryPL = Win32API.new('kernel32','RtlMoveMemory','pll','l')
        GetModuleHandle = Win32API.new('kernel32','GetModuleHandle','p','l')
        VirtualProtect = Win32API.new('kernel32','VirtualProtect','lllp','l')
      
        def self.readmem(buf,addr,len)
          RtlMoveMemoryPL.call(buf,addr,len)
        end
      
        def self.writemem(addr,buf,len)
          RtlMoveMemoryLP.call(addr,buf,len)
        end
      
        def self.unprotect(addr,len)
          VirtualProtect.call(addr,len,0x40,"\0"*4)
        end
      
        def self.init
          @@hModule = GetModuleHandle.call("RGSS300.dll")
        end
      
        def self.module_handle
          @@hModule
        end
      
        init
      end
      module Exit_Hook
      
        @@hwnd = 0
      
        Addr_Close_Catch = Win32Tools.module_handle+0x17F396
        Addr_Eval = Win32Tools.module_handle+0xC580
        Addr_Hwnd = Win32Tools.module_handle+0x25EB00
      
        Code_Close_Catch = "\x90"*23

        Str_Close_Catch = "Fux2::Exit_Hook.exit_func"
      
        def self.unprotectfunc(func)
          Fux2::Win32Tools.unprotect(func.address,func.byte_length)
        end
      
        def self.unprotect_all
          unprotectfunc(Code_Close_Catch)
        end
      
        def self.hook_exit
          cad = Code_Close_Catch.address
          cal = Code_Close_Catch.byte_length
          rem = "\0"*5
          Fux2::Win32Tools.readmem(rem,Addr_Close_Catch,5)
          rem = rem.unpack("C*")
          retn_addr = Addr_Close_Catch+5-cad-cal
          hook_addr = cad-Addr_Close_Catch-5
          Fux2::Win32Tools.writemem(Addr_Close_Catch,[0xE9,hook_addr].pack("CL"),5)
          eval_addr = Addr_Eval-cad-10
          hook_code = [0x68,Str_Close_Catch.address,0xE8,eval_addr,0x83,0xC4,0x4,*rem,0xE9,retn_addr].pack("CLCLCCCCCCCCCL")
          Fux2::Win32Tools.writemem(cad,hook_code,cal)
        end
      
        def self.get_hwnd
          rem = "\0"*4
          Fux2::Win32Tools.readmem(rem,Addr_Hwnd,4)
          base_addr = rem.unpack("L")[0]
          Fux2::Win32Tools.readmem(rem,base_addr+8,4)
          @@hwnd = rem.unpack("L")[0]
        end
      
        def self.hwnd
          @@hwnd
        end
      
        def self.exit_func
          if MFXRB.callMessageBoxW("确定关闭游戏吗?","",32,1) == 1
          exit
          else
          DataManager.save_game(0)
          rgss_main { SceneManager.run }
         
          end
        end
      
        hook_exit
      
      end
    end[/pre]

点评

和楼主一样……  发表于 2017-10-25 18:57
触触,你所留下的部分便是问题核心所在,我也不懂嘤嘤嘤  发表于 2017-10-25 18:52
笨肉包的游戏讨论群932812135 (实时更新) 喜欢的话欢迎加入~
目前的坑
??? #像素风OC游戏 准备中 短篇-约5小时
花城梦之心 #像素风OC游戏 系统开发+素材绘制中
【不可思议的迷宫】幽灵契约外传:歌莉娅 v0.4 游戏文件已更新
同时更新中~ (沉迷摸鱼中~更新速度较慢请见谅w)
这是属于笨肉包一个人的旅行~(这只肉包又在摸鱼!
旅途的最终目标~ ???(保密~
回复

使用道具 举报

梦石
0
星屑
3372
在线时间
1123 小时
注册时间
2015-12-24
回帖
236
 楼主| 发表于 2017-10-25 19:03:32 | 显示全部楼层
guoxiaomi 发表于 2017-10-25 09:12
alias _old_exit exit
def exit
...

虽然我知道应该还要再加些其他代码,不过能力不足就先直接添加了
添加后达成了不退出并进行游戏的目的
但又有了新问题
假如设为1号开关开启后按红叉不退出,之后即使1号开关关闭也一样无法退出
代换为主楼的情况就是第一次按否,之后再按是也关不了游戏
请大佬开示

回复

使用道具 举报

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

开拓者

发表于 2017-10-25 19:11:09 | 显示全部楼层
本帖最后由 guoxiaomi 于 2017-10-25 19:25 编辑
翠靈月 发表于 2017-10-25 19:03
虽然我知道应该还要再加些其他代码,不过能力不足就先直接添加了
添加后达成了不退出并进行游戏的目的
但 ...

可以理解为,按下X会调用Kernel#exit方法,所以这里把这个方法直接改写了,就无法退出了。

我不太熟悉win32api的功能,不知道怎么调出有选项的对话框,我的处理大概是这样:
  1. alias _old_exit exit
  2. def exit
  3.   w = Window_Exit.new
  4.   loop do
  5.     Graphics.update
  6.     Input.update
  7.     w.update
  8.     case w.choice
  9.     when 0
  10.       _old_exit
  11.     when 1
  12.        break
  13.     else
  14.     end
  15.   end
  16.   w.dispose
  17. end
复制代码

大概就是这种感觉吧?按下X之后打开一个(游戏里的)窗口,让玩家选择是否退出。

我好像理解了你的意思……要用开关控制对吧:
  1. alias _old_exit exit
  2. def exit
  3.   _old_exit if $game_variables[1]
  4. end
复制代码

点评

感谢各位大佬  发表于 2017-10-26 00:31
应该是成功了 不过这边的代码条件写成了1号变量  发表于 2017-10-26 00:30
回家后试试,先谢过大佬!弹窗倒是次要,例图已经实现了,大家不用在这上面特别着墨  发表于 2017-10-25 19:58
熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复

使用道具 举报

梦石
0
星屑
1592
在线时间
280 小时
注册时间
2017-10-17
回帖
70
发表于 2017-10-26 12:45:15 | 显示全部楼层
请问楼主如果解决问题,可以请你代码发一下吗,我可能也需要这个。:)

点评

现阶段仍不能完全阻止游戏关闭,因为按下红叉它会不断重复执行脚本的内容,一旦条件满足就关闭  发表于 2017-10-26 16:36
你需要的是和我一样+上弹窗询问,还是单纯让按x失去效果呢? 老实说我处理的并不是很完善,只是最低限度的达成我要的演出而已  发表于 2017-10-26 16:10
回复

使用道具 举报

梦石
0
星屑
1592
在线时间
280 小时
注册时间
2017-10-17
回帖
70
发表于 2017-10-26 17:34:16 | 显示全部楼层
没事的,怎么样都行,我也可以学习一下。
回复

使用道具 举报

梦石
0
星屑
3372
在线时间
1123 小时
注册时间
2015-12-24
回帖
236
 楼主| 发表于 2017-10-26 22:25:21 | 显示全部楼层
Lemax 发表于 2017-10-26 17:34
没事的,怎么样都行,我也可以学习一下。

即使看到很蠢的用法也求别笑

Project5.rar

1.52 MB, 下载次数: 71

点评

很强  发表于 2017-10-26 22:32
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部