小屋創作

日誌2014-01-19 19:24

[RMXP RGSS] 共通存檔

作者:未来ずら


比方說破關後在某段劇情會多出什麼新事件之類的,這是RM2k時代的硬傷,要做到這個...應該只能把主程式魔改了吧,不過主程式魔改了還叫2k嗎?呃、你說明明就很多2k的遊戲都有破關要素啊?這位太太,你換個存檔就神馬都沒有了,2k頂多就N週目吧,標題多個回顧選項都沒辦法

同時,2k也不能跳劇情,相信很多時候有這種狀況:
BOSS戰前會跑一段很長的劇情,這很好,我愛看劇情。但接下來就開戰了、然後又不小心爆炸了,耶,罰你重看,就算是好片強迫你連續看個10來次你也會受不了。比較貼心的作者會在開打前讓你存個檔或是一開始就有跳過的選項,雖然突兀但這也是沒辦法的事

多結局的更不用講了,這裏指的是那種一定要破過某些結局才能看True End的類型,短篇還好,長篇......喔對,之前的BOSS戰劇情也要重☆來☆一☆遍  

額好,在RMXP以後導入了RGSS編輯器,這問題就能確實解決,不過還是一堆作品都沒出現,我覺得這是必備系統啊,尤其一堆遊戲都在搞破關要素

怎麼做呢?
1.上網搜尋"RMXP/VX/ACE  二週目(←大部分會做成共通存檔)"
2.找到腳本
3.套進自己的專案
4.等燈~

゚Å゚) < 城鎮中心就遭到攻擊了!
⊂彡#))
д´).; ''.' .


嘛,要快就這樣
因為我不希望RGSS只是套套樂,所以在我這很難有一套就有效果的腳本
自己動手☆快樂無窮 (有嗎)


因為下面內容需要點基礎知識,
如果還不懂Class、Object、變量的關係,這裏進行不負責任簡單說明:
Object:
遊戲中的任何東西,就叫物件。人物、特效、場景、阿貓阿狗.....
其他名稱還有實體、實例、對像等等...
Class:
物件的設計圖。所有物件都需要一個設計圖才能做成,設計圖有各種定義讓物件可以做什麼事(也就是方法),物件生成後,只要物件(的變量).方法名稱就能執行設計圖定義的動作
變量:
物件的活動空間,對人來說算是給物件一個識別的名稱。
必須先宣告一個變量才能做出物件(a = People.new),
也至少要有一個變量才能讓物件做事(a.say_hello)
物件沒變量的話就可以當做它不存在了,連確認它的死活都沒辦法。
一個物件可以同時有多個變量,但注意代表的都是同個物件。
※如果上面說明有誤歡迎指證




額好,扯了老半天還是沒進入重點
共通存檔要做也不難,只因為它是有RGSS才能做到的事,人對未知的事物總是充滿恐懼
所以要學會怎麼自己建立一份獨立的存檔和讀檔


那麼就是腳本範例(事前準備:遊戲主目錄做成一個名稱為 Save 的資料夾):

#==============================================================================
# ■ 共通變數
#------------------------------------------------------------------------------
#  建立公共變數
#  適用跳過攏長的戰前劇情這類會影響「所有存檔(含新遊戲)」的事件處理
#
#  操作變量後,用 $game_config.system_save 儲存變量
#==============================================================================
class Game_GolbalConfig
  #--------------------------------------------------------------------------
  # ● 變量公開
  #--------------------------------------------------------------------------
  attr_accessor :cleared                 # 破關判定
  attr_accessor :scenario_schedule      # 故事進度
  attr_accessor :version                # 版本
  attr_accessor :bgm_rate            # BGM控制
  attr_accessor :se_rate                # SE控制
  #--------------------------------------------------------------------------
  # ● 物件初始化
  #--------------------------------------------------------------------------
    def initialize
      @cleared = false
      @scenario_schedule = 0
      @version = 1
      @bgm_rate = 10
      @se_rate = 10
    end
  #--------------------------------------------------------------------------
  # ● 儲存變量
  #--------------------------------------------------------------------------    

   def system_save
     save_data($game_config, "Save/config.rxdata")
   end
   #--------------------------------------------------------------------------
   # ● 重置
   #--------------------------------------------------------------------------    
   def reset
     initialize
     system_save
     p "系統變數已重置"
   end
end  


可以看到這裏定義一個新的Class,然後有一些變量,然後有定義儲存方法,然後就沒了,耶
總之重點就是要有一個裝共通變量的Class,然後能存取

接下來是初始化和讀取,基本上要讓它一啟動遊戲就載入,所以請到Main腳本開頭追加條件分歧:

  # 載入設定檔
  if FileTest.exist?("Save/Config.rxdata")
     $game_config = load_data("Save/config.rxdata")
   else
    # 檔案不存在時,重新建立
     $game_config = Game_GolbalConfig.new
     $game_config.system_save
   end

紅字為載入,藍字為檔案不存在(第一次玩遊戲)時做成一個新存檔
變量保存在 Save\Config.rxdata ,載入時用 $game_config 這個變量代入,因為要在每個地方都能用所以要用全域變量


準備工作就完成了,剩下就是操作變量了
如果你會使用 $game_variables[變量編號] = n ,那這個絕對沒問題
看Class有什麼變量,在事件編輯器的「腳本」指令使用 $game_config.變量名 = xxx 並且儲存就可以了,變量有需要就自己加,剩下全部都是條件分歧


操作範例:
# 「故事進度」變量加 1
$game_config.scenario_schedule += 1
$game_config.system_save
覺得每次都要調用存檔語句太麻煩,可以自己在 Game_GolbalConfig 加個方法像是:
#--------------------------------------------------------------------------
# ● 增減「故事進度」變量
# n:只要是數字,都可以
#--------------------------------------------------------------------------
def scenario_schedule_plus(n)
@scenario_schedule += n
system_save
end
這樣就能在事件編輯器用 scenario_schedule_plus(數值) 增減@scenario_schedule (減少用負數),而且會馬上儲存


判斷範例(如果「故事進度」變量在1以上):
條件分歧:腳本: $game_config.scenario_schedule >= 1
    (跳過劇情選項)
不符合條件的情況
   (劇情)
分歧結束
(劇情後的事件)


添加變量範例:
initialize中加入 @變量名稱 = 值
之後在變量公開那一區加入attr_accessor :變量名稱
值全看用途而定,大部分是數字或是否(true / false)的判斷,請自行決定
添加完後請記得把已生成的config.rxdata存檔移除讓遊戲再生成


注意:
發布遊戲前請確定變量不會再追加,否則就只能再另外做一個Class存取新變量
並記得把config.rxdata移除,不然玩家就會看到全破狀態的遊戲了




嗯,大概就這樣囉,用這個條件分歧要很熟練,不然很容易亂掉

XP使用範例(mega):
https://mega.nz/#!MUZ3jbZJ!2vzgs0uWG7Euaq0zAiBJZOdQBpYdDHFZYdP4wCABA44





Q.所以我能做N週目囉?
A.
要做也可以啦,不過週目記錄我覺得不是共通變量在做的事,這樣我用一個破關前的記錄一直洗不就好了嗎?嗯,的確是有防洗的方法,不過那和直接保存在事件變量有什麼差別呢?
你想說的應該是「破關後的新要素」,而這新要素可能分A、B、C、D...好幾個,
然後又是在具備 A 的情況下才能取得 B 這種設定...嗯...嘛...這要做多少變量判斷看人囉

當然週目數也可以當成一種成就,某存檔過關時判斷已重玩10次以上,某個要素開放......



Q.為什麼不直接用$開頭的全域變量就好,還要額外做個Class?
A.第一美觀乾淨,第二未來新增其他共通變數時也不用回頭修改存檔的部分


Q.會不會衝突?只能在XP用嗎?
A.理論上沒衝突,各版本適用


結果還是打了一大串

5

10

LINE 分享

相關創作

【輕調查】暗雷遇敵真的過時了嗎?

【其他】炫耀回音周邊

【RM開發日誌 】基因戰爭 - 徵人內部測試

留言

開啟 APP

face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】