赞 | 0 |
VIP | 10 |
好人卡 | 49 |
积分 | 10 |
经验 | 22958 |
最后登录 | 2020-8-1 |
在线时间 | 2161 小时 |
Lv3.寻梦者 酱油的
- 梦石
- 0
- 星屑
- 1020
- 在线时间
- 2161 小时
- 注册时间
- 2007-12-22
- 帖子
- 3271
|
這個是禾西的算法,不知道有沒有跟你的有多大差異==a
以分類物品界面爲例:
- #------------------------------------------------------------------------------
- # 確認鼠標是否在點擊範圍之內
- #------------------------------------------------------------------------------
- def compare(pos, area)
- area.size.times do |i|
- ox = area[i][0]
- oy = area[i][1]
- lx = ox + area[i][2]
- ly = oy + area[i][3]
- if (ox..lx) === pos[0] and (oy..ly) === pos[1]
- index = i
- return index
- end
- end
- return false
- end
- #------------------------------------------------------------------------------
- # 取得當前點擊窗口範圍
- #------------------------------------------------------------------------------
- def get_warea(window)
- x = window.x
- y = window.y
- w = window.width
- h = window.height
- return [x,y,w,h]
- end#==============================================================================
- # ■ Scene_Base
- #------------------------------------------------------------------------------
- # 模仿 VX 寫的游戲界面超級類
- #==============================================================================
- class Scene_Base
- #--------------------------------------------------------------------------
- # ● 主處理
- #--------------------------------------------------------------------------
- def main
- Input.update #刷新「輸入信息」
- @wins = Hash.new #生成窗口儲存
- @active_window = nil#初始化窗口激活指令
- start #生成窗口
- Graphics.transition #執行過渡
- loop do
- loop_do #主循環
- #如果切換畫面就中斷循環
- break if $scene != self
- end
- Graphics.freeze #準備過渡
- # 釋放所有窗口
- @wins.each_value{|i|i.dispose if i != nil}
- terminate #結束行爲
- end
- #--------------------------------------------------------------------------
- # ● 主循環
- #--------------------------------------------------------------------------
- def loop_do
- Input.update #刷新「輸入信息」
- Graphics.update #刷新「游戏畫面」
- mouse #鼠標刷新
- update #刷新畫面
- end
- #--------------------------------------------------------------------------
- # ● 鼠標刷新
- #--------------------------------------------------------------------------
- def mouse
- #==============================================================================
- if @active_window != nil #截獲激活指令
- @wins.each_value{|i|i.active = false if i.active} #凍結所有窗口
- @wins[@active_window].active = true #激活指定窗口
- if defined? @wins[@active_window].mouse_area #如果指定窗口存在鼠標感應範圍
- @index_window = @wins[@active_window] #監視鼠標活動
- else #否則
- @index_window = nil #取消鼠標監視
- end
- @active_window = nil #銷毀激活指令
- end
- #==============================================================================
- @clicked = false if @clicked #初始化鼠標點擊
- if Input.click?(Input::Mouse_Left) #如果鼠標進行點擊行動
- @clicked = true #點擊爲眞
- return if @index_window == nil #如果不存在感應範圍,結束
- index = compare(Mouse.mouse_pos, @index_window.mouse_area) #確定鼠標是否在感應範圍
- return if index == false #如果否,結束
- @index_window.index = index #否則,修正index
- Input.push(Input::C) #鼠標擊中爲眞
- return #過程結束
- end
- #==============================================================================
- end
- #--------------------------------------------------------------------------
- # ● 生成主要窗口
- #--------------------------------------------------------------------------
- def start
- end
- #--------------------------------------------------------------------------
- # ● 刷新畫面
- #--------------------------------------------------------------------------
- def update
- end
- #--------------------------------------------------------------------------
- # ● 釋放
- #--------------------------------------------------------------------------
- def terminate
- end
- end
- #==============================================================================
- # ■ Window_Item
- #------------------------------------------------------------------------------
- # 顯示瀏覽物品的窗口(分類)
- #==============================================================================
- class Window_Item < Window_Selectable
- #--------------------------------------------------------------------------
- # ● 幫助文本
- #--------------------------------------------------------------------------
- def update_help
- if defined? new_help
- new_help
- else
- @help_window.set_text(self.item == nil ? "" : self.item.description)
- end
- end
- attr_reader :data
- attr_accessor :hindex
- def new_help
- if @hindex == nil
- @help_window.set_text(nil)
- else
- @help_window.set_text(@data[@hindex])
- #校正帮助窗口位置
- @help_window.set_pos(self.x,self.y,self.width,self.oy,@hindex,@column_max)
- end
- end
- end
- #==============================================================================
- # ■ Scene_Item
- #------------------------------------------------------------------------------
- # 物品界面的类。
- #==============================================================================
- class Scene_Item < Scene_Base
- #-----------------------
- # 返回菜單的 index 位置:
- #-----------------------
- ReturnIndex = 1
- #--------------------------------------------------------------------------
- # ● 生成主要窗口
- #--------------------------------------------------------------------------
- def start
- #----------------------------
- # 背景圖(地圖畫面)
- #----------------------------
- @spriteset = Spriteset_Map.new
- #----------------------------
- # 生成指令窗口
- #----------------------------
- @wins[:command] = Window_Item_Commands.new
- #----------------------------
- # 生成幫助窗口
- #----------------------------
- @wins[:help] = Window_Help.new
- @wins[:help].visible = false
- #----------------------------
- # 生成物品窗口
- #----------------------------
- @wins[:items] = Window_Item.new
- @wins[:items].visible = false
- @wins[:items].index = 0
- @wins[:items].help_window = @wins[:help]
- @help_area = []
- @help_area << get_warea(@wins[:items])
- #----------------------------
- # 生成使用目標窗口 (设置为不可见・不活动)
- #----------------------------
- @wins[:target] = Window_Target.new
- @wins[:target].visible = false
- #----------------------------
- # 激活指定窗口
- #----------------------------
- @active_window = :command
- #----------------------------
- # 鼠標停留計數
- #----------------------------
- @pos =[Mouse.mouse_pos,Mouse.mouse_pos,Mouse.mouse_pos,Mouse.mouse_pos]
- end
- #--------------------------------------------------------------------------
- # ● 刷新画面
- #--------------------------------------------------------------------------
- def update
- # 刷新窗口
- @wins[:help].update
- mouse_help
- if @wins[:command].active
- @wins[:command].update
- (command_Input(:C);return) if Input.trigger?(Input::C)
- (command_Input(:B);return) if Input.trigger?(Input::B)
- return
- end
- if @wins[:items].active
- @wins[:items].update
- (items_Input(:C);return) if Input.trigger?(Input::C)
- (items_Input(:B);return) if Input.trigger?(Input::B)
- return
- end
- if @wins[:target].active
- @wins[:target].update
- (target_Input(:C);return) if Input.trigger?(Input::C)
- (target_Input(:B);return) if Input.trigger?(Input::B)
- return
- end
- end
- #--------------------------------------------------------------------------
- # ● 隨著鼠標移動的幫助
- #--------------------------------------------------------------------------
- def mouse_help
- if compare(Mouse.mouse_pos, @help_area)
- index = compare(Mouse.mouse_pos, @wins[:items].mouse_area)
- if index
- if @pos[0] != Mouse.mouse_pos or
- @pos[1] != Mouse.mouse_pos or
- @pos[2] != Mouse.mouse_pos or
- @pos[3] != Mouse.mouse_pos
- @pos.shift
- @pos << Mouse.mouse_pos
- elsif @wins[:items].hindex != index
- @wins[:items].hindex = index
- end
- else
- @wins[:items].hindex = nil if @wins[:items].hindex != nil
- end
- else
- @wins[:items].hindex = nil if @wins[:items].hindex != nil
- end
- end
- #--------------------------------------------------------------------------
- # ● [指令窗口]下的輸入反應(鍵位)
- #--------------------------------------------------------------------------
- def command_Input(key)
- case key
- when :C
- # 命令窗口光标位置分支
- @wins[:items].refresh(@wins[:command].index) # 刷新物品窗口
- @wins[:items].visible = true # 打開物品窗口
- @wins[:items].index = 0 # 初始化光標
- @wins[:items].update # 更新物品窗口一次
- @active_window = :items # 激活指定窗口
- when :B
- $game_system.se_play($data_system.cancel_se) # 演奏取消 SE
- $scene = Scene_Menu.new(ReturnIndex) # 切換到菜單畫面
- return
- end
- end
- #--------------------------------------------------------------------------
- # ● [物品窗口]下的輸入反應(鍵位)
- #--------------------------------------------------------------------------
- def items_Input(key)
- case key
- when :C
- #----------------------------
- # 获取物品窗口当前选中的物品数据
- #----------------------------
- @item = @wins[:items].item
- #----------------------------
- # 不使用物品的情况下
- #----------------------------
- unless @item.is_a?(RPG::Item)
- # 演奏冻结 SE
- $game_system.se_play($data_system.buzzer_se)
- return
- end
- #----------------------------
- # 不能使用的情况下
- #----------------------------
- unless $game_party.item_can_use?(@item.id)
- # 演奏冻结 SE
- $game_system.se_play($data_system.buzzer_se)
- return
- end
- # 演奏确定 SE
- $game_system.se_play($data_system.decision_se)
- #----------------------------
- # 效果范围是我方的情况下
- #----------------------------
- if @item.scope >= 3
- # 激活目標窗口
- @wins[:target].x = 0#(@wins[:items].index + 1) * 304
- @wins[:target].visible = true
- @active_window = :target # 激活指定窗口
- # 设置效果范围 (单体/全体) 的对应光标位置
- if @item.scope == 4 || @item.scope == 6
- @wins[:target].index = -1
- else
- @wins[:target].index = 0
- end
- #----------------------------
- # 效果在我方以外的情况下
- #----------------------------
- else
- # 公共事件 ID 有效的情况下
- if @item.common_event_id > 0
- # 预约调用公共事件
- # 演奏物品使用时的 SE
- $game_temp.common_event_id = @item.common_event_id
- $game_system.se_play(@item.menu_se)
- # 消耗品的情况下
- if @item.consumable
- # 使用的物品数减 1
- # 再描绘物品窗口的项目
- $game_party.lose_item(@item.id, 1)
- @wins[:items].draw_item(@wins[:items].index)
- end
- $scene = Scene_Map.new
- #--->切換回地圖畫面
- return
- end
- end
- when :B
- $game_system.se_play($data_system.cancel_se) # 演奏取消 SE
- @wins[:items].visible = false # 關閉物品窗口
- @wins[:items].refresh(6) # 重新刷新物品窗口
- @wins[:items].index = 0 # 初始化物品窗口的光標
- @wins[:help].visible = false # 關閉幫助窗口
- @active_window = :command # 激活指定窗口
- end
- end
- #--------------------------------------------------------------------------
- # ● [使用目標窗口]下的輸入反應(鍵位)
- #--------------------------------------------------------------------------
- def target_Input(key)
- case key
- when :C
- #----------------------------
- # 如果物品用完的情况下
- #----------------------------
- if $game_party.item_number(@item.id) == 0
- # 演奏冻结 SE
- $game_system.se_play($data_system.buzzer_se)
- return
- end
- #----------------------------
- # 目标是全体的情况下
- #----------------------------
- if @wins[:target].index == -1
- # 对同伴全体应用物品使用效果
- used = false
- $game_party.actors.each do |i| used |= i.item_effect(@item) end
- end
- #----------------------------
- # 目标是单体的情况下
- #----------------------------
- if @wins[:target].index >= 0
- # 对目标角色应用物品的使用效果
- target = $game_party.actors[@wins[:target].index]
- used = target.item_effect(@item)
- end
- #----------------------------
- # 使用物品的情况下
- #----------------------------
- if used
- # 演奏物品使用时的 SE
- $game_system.se_play(@item.menu_se)
- # 消耗品的情况下
- if @item.consumable
- # 使用的物品数减 1
- $game_party.lose_item(@item.id, 1)
- # 再描绘物品窗口的项目
- @wins[:items].draw_item(@wins[:items].index)
- end
- # 再生成目标窗口的内容
- @wins[:target].refresh
- # 全灭的情况下
- if $game_party.all_dead?
- $scene = Scene_Gameover.new
- #--->切換回遊戲結束畫面
- return
- end
- # 公共事件 ID 有效的情况下
- if @item.common_event_id > 0
- # 预约调用公共事件
- $game_temp.common_event_id = @item.common_event_id
- $scene = Scene_Map.new
- #--->切換回地圖畫面
- return
- end
- #----------------------------
- # 重刷新物品欄
- #----------------------------
- @wins[:items].refresh(@wins[:command].index)
- end
- #----------------------------
- # 无法使用物品的情况下
- #----------------------------
- unless used
- # 演奏冻结 SE
- $game_system.se_play($data_system.buzzer_se)
- end
- when :B
- $game_system.se_play($data_system.cancel_se) # 演奏取消 SE
- #----------------------------
- # 由于物品用完而不能使用的场合
- #----------------------------
- unless $game_party.item_can_use?(@item.id)
- # 再次生成物品窗口的内容
- if Input.trigger?(Input::C)
- @wins[:items].refresh(@wins[:command].index)
- end
- end
- @wins[:target].visible = false # 關閉目標窗口
- @active_window = :items # 激活指定窗口
- end
- end
- #--------------------------------------------------------------------------
- # ● 釋放
- #--------------------------------------------------------------------------
- def terminate
- @spriteset.dispose
- end
- end
复制代码 |
|