如何出色的研究 RGSS3 (三) 形式的调整的细节
在一個我們研究了添加到窗體方法的選擇,這個問題來研究窗體類的細節。
所有形式的父類的?Window_Base 四個參數需要初始化。
#--------------------------------------------------------------------------# ● 初始化對象#--------------------------------------------------------------------------def initialize(x, y, width, height)superself.windowskin = Cache.system("Window")update_paddingupdate_tonecreate_contents@opening = @closing = falseend這四個參數表示窗體左上角的橫縱坐標以及窗體的寬度與高度。
Window_Base 中還提供了繪制窗體的一整套方法。
比方說繪制文本(draw_text)、?繪制值槽(draw_gauge)、繪制圖標(draw_icon)、繪制角色肖像圖(draw_face)等等。
Window_Selectable 是擁有光標移動、滾動功能的窗體的父類。
當中定義了一些獲得窗體中的繪制項目所需信息的方法。
比方獲取列數(col_max)、獲取行間距的寬度(spacing)、獲取項目的寬度(item_width)等等。
Window_Selectable 類中還定義了處理光標在項目中移動以及選擇的方法。
比方處理光標的移動(process_cursor_move)、“確定”和“取消”的處理(process_handling)等等。
Window_Command 的用法上一期已經講過了。它另一個子類。Window_HorzCommand 表示能夠橫向選擇的指令窗體。
僅僅要是繼承自?Window_HorzCommand 的指令裝口就是橫向選擇的。
我們發現盡管指令窗體能夠橫向選擇,可是?Window_Selectable 的子類卻僅僅能縱向選擇。
所以如今參照?Window_HorzCommand?寫一個?Window_HorzSelectable 來處理橫向選擇的窗體。
#encoding:utf-8 #============================================================================== # ■ Window_HorzSelectable #------------------------------------------------------------------------------ # 擁有橫向光標移動、滾動功能的窗體 #==============================================================================class Window_HorzSelectable < Window_Selectable橫向與縱向的窗體差別有:縱向窗體使用上下鍵切換選項;橫向窗體使用左右鍵切換選項。
選項數量超過一頁能顯示的最大數量時。縱向窗體的上下邊界會有三角箭頭,而橫向窗體的左右邊界有三角箭頭。
縱向窗體的選項是從起點向下繪制的;橫向窗體的選項是從起點向右繪制的。
參考 Window_HorzCommand??將?Window_Selectable 中與以上三種差別有關的方法挑選出來在?Window_HorzSelectable 中重寫。
#--------------------------------------------------------------------------# ● 獲取列數#--------------------------------------------------------------------------def col_maxreturn 4end#--------------------------------------------------------------------------# ● 獲取行間距的寬度#--------------------------------------------------------------------------def spacingreturn 8end#--------------------------------------------------------------------------# ● 獲取首列位置#--------------------------------------------------------------------------def top_colox / (item_width + spacing)end#--------------------------------------------------------------------------# ● 設置首列位置#--------------------------------------------------------------------------def top_col=(col)col = 0 if col < 0col = col_max - 1 if col > col_max - 1self.ox = col * (item_width + spacing)end#--------------------------------------------------------------------------# ● 獲取尾列位置#--------------------------------------------------------------------------def bottom_coltop_col + col_max - 1end#--------------------------------------------------------------------------# ● 設置尾列位置#--------------------------------------------------------------------------def bottom_col=(col)self.top_col = col - (col_max - 1)end#--------------------------------------------------------------------------# ● 確保光標在畫面范圍內滾動#--------------------------------------------------------------------------def ensure_cursor_visibleself.top_col = index if index < top_colself.bottom_col = index if index > bottom_colend#--------------------------------------------------------------------------# ● 計算窗體內容的寬度#--------------------------------------------------------------------------def contents_width(item_width + spacing) * item_max - spacingend#--------------------------------------------------------------------------# ● 計算窗體內容的高度#--------------------------------------------------------------------------def contents_heightitem_heightend#--------------------------------------------------------------------------# ● 獲取項目的繪制矩形#--------------------------------------------------------------------------def item_rect(index)rect = superrect.x = index * (item_width + spacing)rect.y = 0rectend#--------------------------------------------------------------------------# ● 光標向下移動#--------------------------------------------------------------------------def cursor_down(wrap = false)end#--------------------------------------------------------------------------# ● 光標向上移動#--------------------------------------------------------------------------def cursor_up(wrap = false)end#--------------------------------------------------------------------------# ● 光標移至下一頁#--------------------------------------------------------------------------def cursor_pagedownend#--------------------------------------------------------------------------# ● 光標移至上一頁#--------------------------------------------------------------------------def cursor_pageupendend盡管 Window_Selectable 默認的是縱向選擇的窗體,可是實際上當中定義了上下左右四個鍵的行為,并用?row_max 與 col_max 方法來控制行數與列數,?僅僅要改變這兩個值就能夠將它擴展為n*m的隨意選擇的窗體。
index 是用來表示選項編號的變量,它能夠通過非常easy的公式與選項的行列號進行換算。
col = inex %?col_max、row = index / col_max
這里我們設置一行最多4列,當索引超出當前的4列時。就須要 ensure_cursor_visible 方法來改變首列和尾列。使光標在畫面范圍內滾動。
top_col=(col) 等方法事實上非常坑,重載的=操作符改變了參數index的值。這不符合常理。
最后我們用空的方法替換了光標上下移動以及翻頁的方法。這樣就僅僅能用左右鍵來切換選項了。
最后來把游戲菜單畫面改為橫向吧。
這是默認的菜單畫面:
Scene_Menu 中有三個窗體,排除金幣窗體,菜單畫面中顯示指令的窗體與顯示隊伍成員狀態的窗體都能夠改為橫向。
Window_MenuCommand 繼承自?Window_Command。如今把它的父類改為?Window_HorzCommand。
然后改動一下?Window_MenuCommand 的窗體大小。
#--------------------------------------------------------------------------# ● 獲取列數#--------------------------------------------------------------------------def col_maxreturn 7end#--------------------------------------------------------------------------# ● 獲取窗體的高度#--------------------------------------------------------------------------def window_heightreturn 48end#--------------------------------------------------------------------------# ● 獲取窗體的寬度#--------------------------------------------------------------------------def window_widthreturn Graphics.widthend將窗體寬度改為與游戲窗體的寬度同樣,高度為48,考慮到共同擁有7個選項。將最大列數設為7。
Window_MenuStatus 原本是?Window_Selectable 的子類。如今它的父類改為?Window_HorzSelectable。
接下來還是改動窗體的寬度與高度。
盡管?Window_MenuStatus 的大小正確了,可是它的起點不正確。
在?Scene_Menu 把窗體的起始坐標初始化成正確的值。
#--------------------------------------------------------------------------# ● 生成狀態窗體#--------------------------------------------------------------------------def create_status_window@status_window = Window_MenuStatus.new(0, 48)end如今總體窗體框架已經正確。可是狀態窗體中角色屬性的繪制還沒有變。 #--------------------------------------------------------------------------# ● 繪制項目#--------------------------------------------------------------------------def draw_item(index)actor = $game_party.members[index]enabled = $game_party.battle_members.include?(actor)rect = item_rect(index)draw_item_background(index)draw_actor_face(actor, rect.x, rect.y, enabled)draw_actor_name(actor,rect.x, rect.y+96)draw_actor_class(actor,rect.x, rect.y+96+line_height*1)draw_actor_icons(actor,rect.x,rect.y+96+line_height*2)draw_actor_level(actor,rect.x, rect.y+96+line_height*2)draw_actor_hp(actor,rect.x, rect.y+96+line_height*3)draw_actor_mp(actor,rect.x,rect.y+96+line_height*4)draw_actor_tp(actor,rect.x,rect.y+96+line_height*5)end用 Window_Base 中提供的工具繪制角色的屬性。
最后調整一些細節參數。
終于成品:
版權聲明:本文博主原創文章,博客,未經同意不得轉載。
總結
以上是生活随笔為你收集整理的如何出色的研究 RGSS3 (三) 形式的调整的细节的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 两款高性能并行计算引擎Storm和Spa
- 下一篇: 【动态规划】leetcode - Max