lctseng / RGSS

存放各式RGSS3腳本原始碼
Apache License 2.0
8 stars 3 forks source link

想問"立繪系統"使用方式 #1

Closed silvermirror10343 closed 8 years ago

silvermirror10343 commented 8 years ago

大大你好,我下載了你的範例專案想看看你的立會系統到底如何使用 但遭遇了兩個困難

  1. 範例是RPGVXAce,但我是RMXP。故無法研究具體的使用方式,不知道能不能截圖或者筆述設置方式?
  2. 因為範例是RPGVXAce,不知道這邊的腳本是否也能讓RMXP使用?
lctseng commented 8 years ago

Hi, 1、這個功能要用描述的方式應該是不太容易,通常是由你自己摸索會比較快。但如果你沒有VA編輯器導致無法開啟VA專案,我可以把事件內的設定截圖出來給你看。你應該可以執行VA遊戲吧?我記得執行遊戲不需要編輯器。如此一來,你便可以用事件內容的設定截圖比照遊戲中看到的效果。 事件截圖如下:

  1. 基本上腳本在不同系統中是不能共用的。必須有對兩個系統架構都熟知的腳本師進行修改。
silvermirror10343 commented 8 years ago

好的,謝謝大大的截圖和說明。 不過exe也是不能執行的,目前給出的訊息是要裝VXAce的RTP。但沒關係,看大大錄好的影片應該也是可以get資訊的。

我、我還是先貼上去看看會跳什麼錯誤訊息好了(希望沒有<欸

lctseng commented 8 years ago

Hi, RTP的安裝檔應該是隨手可得的才對, 這裡附上VXAceRTP的下載連結

silvermirror10343 commented 8 years ago

謝謝大大。

目前 只放"圖像精靈強化" 是可以繼續運行的,不過放了 "立繪系統"之後就開始各種錯誤訊息 然後我就照著錯誤訊息慢慢改,這是跟著訊息知道然後往裡加和修改的東西

  1. XP沒有 "Sprite_Base", "Scene_Base"腳本
  2. "Window_Message" 在XP是繼承自"Window_Selectable","Window_Selectable"再繼承"Window_Base"
  3. 因為沒有"Scene_Base",所以在XP,"Scene_Map"並非他的子類別。而VXAce的"Scene_Map",句我前往 orzFly/RPGMakerDefaultScripts/rpgmaker-vxace.en/Scene_Map.rb 查看,裡面的東西XP完全沒有(所以我就把他複製下來塞進去了)

以上處理好繼承和把沒有的東西塞進去後,可以直行到Title的畫面,接下來就出現了一個我還不清楚怎麼解決的地方

  1. "立繪系統"的957行(@stand_spriteset.update) 訊息顯示 undefined method update for nil::NilClass

這個部分好像是在重新定義"Scene_Base",但我"Scene_Base"是新放進來的腳本 努力追了下,這裡的update應該是來自489行自定義的 "Spriteset_Stand",裡面也有update

不知道這邊的錯誤該怎麼解決才好

lctseng commented 8 years ago

Hi, 其實這個立繪系統的code切割應該算是蠻乾淨的, Spriteset_Stand幾乎控制了整個立繪系統的運作, 他只需要在Scene中被建立(create)、更新(update)、中止處理(dispose)就可。 因此基本上只要讓SpritesetStand可以在Scene*中被正常使用就可。 通常只要包含了:

create_stand_spriteset
update_stand_spriteset
stand_terminate # 讓立繪在場景切換時飛出
dispose_stand_spriteset

應該就沒有問題。不必特別去複製整個Scene_Base,這沒意義。 (我這個腳本中基本上沒有使用到Scene_Base太多的method, 就是單純建立並更新Spriteset_Stand而已)

我會放在Scene_Base是因為我之前這個腳本是想要在所有Scene(包括選單)都可以使用立繪。 因為只有包含了Spriteset_Stand的Scene可以顯示出立繪。 如果妳只需要在地圖上顯示出立繪,那麼應該只要把這些控制Spriteset_Stand的部分加入到XP的SceneMap就好。

silvermirror10343 commented 8 years ago

只要把這些控制Spriteset_Stand的部分加入到XP的SceneMap就好

那我覺得這樣寫應該也是等價的意思 class Spriteset_Stand < SceneMap 但這樣會直接爆掉呢,不過我猜這是因為"Spriteset_Stand " 裡的function跟"SceneMap"有重複到所以掛了? (全文搜索過對比兩個class裡的def ,剛好就重複了update)

不知道"Spriteset_Stand "裡的重名我擅自改動,有沒有要特別注意相對改的地方呢?

lctseng commented 8 years ago

Hi, 這樣寫是不同的意思。 你用繼承的意思是代表子物件是父物件的一種,但顯然這個例子並不是。 Spriteset_Stand只是控制立繪的元件之一,他並不是Scene。 因為Scene_Map 控制整個畫面的顯示,其功能與Spriteset_Stand並不相同。

當然你也說對了一部分,會爆掉的原因是因為method名稱重複, 因為Spriteset_Stand設計的時候本來就是從一個獨立元件組的角度去設計的, 他沒有繼承的概念,你隨意更改繼承觀念會導致爆掉。

最佳的方式還是把Spriteset_Stand當作一個變數,放在Scene_Map裡面管理, 而不是變成Scene_Map的子類別。

silvermirror10343 commented 8 years ago

把Spriteset_Stand當作一個變數,放在Scene_Map裡面管理 這個有點想像不出來做法...會是這樣嗎: 在Scene_Map弄一個... @forexampleVariable = new Lctseng::Spriteset_Stand.new(nil) (原諒我剛剛才去查了RGSS裡變數的差別,不知道對不對 假如上面是對的...其實我總覺得上面的做法是錯的OTZ所以後面不知道還需要做什麼

剛剛try了把 < SceneMap 拿掉,先看看錯誤訊息是什麼 一樣是update是Nil的問題,從@stand_spriteset.update追回去 所以那來自於 @stand_spriteset = Lctseng::Spriteset_Stand.new(nil) 所以跑上去確認裡面是否有update,發現裡面的update去使喚update_sprites update_sprites使用了@left,@right,一路追到Sprite_Stand裡面也是有update 這樣他怎麼會覺得update是NilClass呢? 現在重新追一次,我就推翻了3天前的那個認為是Scene_Base的問題的說法。(完全無法回憶初3天前為什麼這樣覺得

我還注意到了 module Lctseng 這個東西,會不會有可能是他的問題呢? << 不過我完全不能懂這是啥,感覺他就是憑空出現,找不到根源

順帶一提,昨天事情太多,所以就...拖到今天邊看邊try :3

lctseng commented 8 years ago

Hi, 看來你對RGSS還沒有很熟,在Scene裡面用一個變數控制Spriteset應該是RGSS內的老手段。 看起來大概會是這樣

class Scene_Map

def start # 場景初始化
  ... # 原本start的內容還是要保留
  @sp_stand = Lctseng::Spriteset_Stand.new(nil)
end

def update # 更新畫面
  ... # 原本update內容
  @sp_stand.update
end

def terminate # 場景結束
  @sp_stand.dispose
  ... # 原本terminate內容
end

update是nil不是指update找不到,而是變數未宣告的問題。 例如:

@non_exist.update # 這行會出現update for Nil的問題

因為non_exist這個變數根本還沒被宣告。 因此通常會這樣:

@non_exist = Lctseng::Spriteset_Stand.new(nil)
@non_exist.update # 這行不會出錯

基本上你不需要追到Spriteset_Stand裡面太多的內容, 我寫的這個腳本不需要使用者太深追,只要你懂RGSS就知道他的用意。

最後,module Lctseng只是用來替class取名字而已,基本上不會造成甚麼太大的問題。

silvermirror10343 commented 8 years ago

在Scene_Map用一個變數new出Spriteset_Stand,再去各個方法之下呼叫? 原來的立繪系統使用到的部分應該沒有要刪掉? 並且把Scene_Map的 start, update, terminate 加上那些改動後還是會有同樣錯誤 是還要再對找著加什麼方法或者現在的加法有些順序問題? 我的順序問題指的是比方terminate 的地方,你放在了原本內容(super)之前 那start和update是不是也是同理呢?(我自己就把這兩個地方放在create_spriteset和@spriteset.update之前)

原來的方法也是new出來後再去呼叫方法,跟現在提出的改法有何不同呢? 原來的寫法我不懂為何會覺得update是沒有被宣告的 如之前追過去看的,明明update已經宣告了

@stand_spriteset.update 出問題 但上面產生立繪精靈有new出來 @stand_spriteset = Lctseng::Spriteset_Stand.new(nil) 再往上翻 class Spriteset_Stand 看到裡面的update使用了 update_sprites,裡面用的 @left.update, @right.update 在def create_sprites 也有對應new出來 怎麼會不存在呢?

是的,我對RGSS的經驗值都來自於使用別人寫好的腳本出問題或有需要加一些功能的時候進行改動 基本靠著別的程式語言寫專題或作業的經驗以及使用到的RGSS腳本寫法推測使用方式 不知道要刷RGSS的熟練有沒有什麼學習網站呢?還是應該要先熟練一下Ruby?

lctseng commented 8 years ago

Hi, 基本上都是放在super之後。 我想在正確地設置下,不應該有NilClass的問題, 這個問題我並沒有辦法詳細給你答覆,我想應該只是卡在一些小地方, 且跟RGSS應該沒有太大關聯,大概是Ruby不熟的關係。 很可惜並沒有找到甚麼RGSS的學習資源,基本上只有Ruby。 但你一定要把Ruby摸熟,包括Ruby的繼承、alias、super等RGSS內常用的手段。

原來的寫法我不懂為何會覺得update是沒有被宣告的

我想應該是你的變數還沒宣告導致變數是Nil, 而不是update函數本身的問題才對。 另外寫Ruby的new常用的語法是@var = ClassName.new 而不是@var = new ClassName.new,這反而像是Java或C#的寫法。

@stand_spriteset.update 出問題

你是指因為@stand_spriteset是nil而造成的問題, 還是@stand_spriteset內部的update中,因為@left或@right是nil造成的問題?

有些時候,RGSS會在start函數的最後一行馬上呼叫update, 這會造成你加在更後方的create_sprite會在update之後才被呼叫, 而update內直接呼叫@sprite.update而造成@sprite是nil的錯誤。

不過我想如果你能把Ruby摸熟,再回來看RGSS,應該會比較好理解它的架構。

silvermirror10343 commented 8 years ago

那我後面有空會去codecademy把裡面的ruby課程完成一遍,應該可以有些收穫

前幾天學校有些忙,現在還沒有往下try,抱歉這麼晚回復大大。 也謝謝大大之前的有問超詳細必答>"<

lctseng commented 8 years ago

Wish you have a good learning experience!