找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6956|回复: 2

[教程] 防止游戲多開的一個簡明方案

[复制链接]
发表于 2018-10-21 22:09:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
或許你在調試的時候已經發現了Ren'Py編寫的游戲是可以同時運行多個的,甚至連Ren'Py引擎自身也是可以并發多個來運行的,效果如圖。

能夠多開的Ren'Py介面

能夠多開的Ren'Py介面

當然這在一般情況之下不會有什麽大問題,但是較爲專業的使用者就會瞭解到這樣很容易誘發檔案重寫入甚至是綫程爭用問題,例如兩個視窗同時選擇保存到同一個檔案位置,或者阻塞同一個綫程資源,這樣不僅會降低游戲體驗更爲嚴重的是會造成游戲不夠問題甚至發生游戲自身檔案損壞情況。

不過遺憾的是目前爲止Ren'Py官方并未提供有關的屬性變量或者是可以直接叫用的方法來防止這一情況。不過值得高興的是Python可以實現這一點,而且相對較爲輕鬆。此方法需要一個外部引用檔案(當然也可以内嵌):singleton.py,裏面包含了若干類和字段,具體内容可自行參看内容,而且本人也添加了許多注釋以使對Python沒有深入瞭解的人來閲讀。可以看出此方案是通過建立一個臨時檔案來判斷游戲的運行狀態的。實現方式有些類似C#的互斥,只不過不是基於綫程的而是基於檔案的而已。

singleton.zip (2.39 KB, 下载次数: 63)

使用方法也非常簡單,由於Ren'Py規定所有外部依賴程式碼檔案需要放在/game/python-packages/目錄當中,所以先建立該資料夾,然後將上方的程式碼檔案解壓縮,放置在其中即可,在這兒特別提示一下,雖然該檔案名稱為singleton,但是和pip中提供的singleton沒有任何關聯,所以不要企圖使用pip來擷取該檔案。

該程式碼的使用也十分簡單,只需要實例化其中的SingleInstance即可。

[RenPy] 纯文本查看 复制代码
python early:
    import singleton
    me = singleton.SingleInstance()

建議將此程式碼寫於/game/definitions.rpy當中。

當游戲多開的時候該過程就會由於寫入衝突而導致抛出SingleInstanceException錯誤從而終止運行。如果調試時打開控制臺輸出的話是可以捕捉到這一錯誤抛出的詳細訊息的。

此方法在DDLC(心跳文學社!)中有所應用,而且在其/game/python-packages/目錄當中也可發現該檔案。

--備注--

本文使用公開共享原則,任何人都可以無限制引用本文内容以及本文技術無論使用形式,在引用時可注明著作者本人。

本人常規公開社交媒體為Twitter,若有問題可在此提出:@rwfholme

本人常規使用語言為(從常用至罕用):台灣正體、大陸簡體、其他中文語系語言、通用英文。

本人為Wikipedia(維基百科)一員,故部分撰寫内容可能會同步提交至相關Wiki條目當中。


chrome_2018-10-21_20-52-35.jpg

评分

参与人数 2干货 +5 收起 理由
龙氏 + 2 版区有你更精彩(*^_^*)
BuErShen + 3 感谢分享!

查看全部评分

发表于 2018-10-22 07:39:24 来自手机 | 显示全部楼层
有意思,黑科技啊
回复 支持 1 抱歉 0

使用道具 举报

发表于 2019-7-29 10:38:57 | 显示全部楼层
帖子能收藏就好了
回复 支持 抱歉

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|RenPy中文空间 ( 苏ICP备17067825号|苏公网安备 32092302000068号 )

GMT+8, 2024-4-27 17:05 , Processed in 0.073601 second(s), 19 queries , File On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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