Project1

标题: 如何在菜单中增加选项 [打印本页]

作者: ws333    时间: 2009-4-5 00:04
标题: 如何在菜单中增加选项
想制作一个任务制游戏,随着任务完成数增加会获得一些称号如赏金王、见义勇为等。
我目前是用新建不能使用的特技来在菜单中显示特技的,但感觉很变扭同时影响正常技能的使用。因此,想在菜单的特技栏下方增加“称号”栏,然后使不能使用的特技(即称号)能自动归入这一栏。求高人讲解。
PS:我发的前一帖“诅咒装备系统的设计问题”谁能帮忙解答,急用啊{/dk} [LINE]1,#dddddd[/LINE]版务信息:本贴由楼主自主结贴~
作者: 静·界    时间: 2009-4-5 00:07
提示: 作者被禁止或删除 内容自动屏蔽
作者: ws333    时间: 2009-4-5 08:15
感谢楼上,不过那个只是任务系统,与我的目的差太多,我不知该参考些什么
作者: 玄月    时间: 2009-4-5 09:44
100分LZ你觉得会有扛这担子的人出现么?
好吧,不打击你,这里人很现实的
作者: ws333    时间: 2009-4-5 15:37
听取LS意见改为200分悬赏,这样行了吧?
作者: 我来也    时间: 2009-4-6 00:55
称号为什么做在特技栏里?
直接改变职业不就行了?
作者: ws333    时间: 2009-4-6 02:41
我需要同时能拥有多个称号以便今后能触发高级任务,改职业只能一个个换
作者: kula1900    时间: 2009-4-9 22:36
看看我这个行不行吧~~
http://rpg.blue/upload_program/d/kula1900_Project1_119716556.rar
作者: ws333    时间: 2009-4-10 00:56
楼上很抱歉,你这个只是用事件分歧来变更文字显示,也是只能一个个换,而且状态栏也反映不出,还不如更换职业。我要的是同时能在状态栏显示多个称号的功能。
作者: 迅雷進    时间: 2009-4-10 01:12
老实说,
你的问题小弟到现在还没搞懂,
能再详细说明吗?
可以的话请附上截图。
作者: ws333    时间: 2009-4-10 12:32
嗯......能出图的话也就会做这个系统,我就不用求了。
说详细点就是使用更改数据特技最大值能创造新的特技,我利用此做了一些无效果的特技做为称号,如赏金王等,然后利用事件设置通过完成某些任务来取得称号,而一些称号的取得是上级任务出现的条件。问题是用此方法做的称号是显示在角色菜单的特技一栏里的,感觉很怪。所以想在菜单栏里增加“称号”这一选项将称号归入。......我觉得和发帖里说的一样啊(汗)
作者: 紫苏    时间: 2009-4-10 15:41
给你个范例,参考着修改吧~
使用方法:在数据库特技名称中加入 "[称号]",则表示这个技能实际上是一个称号

为了方便起见,选项添加在了菜单最后,否则装备、状态等窗口退出的时候返回的菜单索引都要改……
红色部分是在原脚本基础上新增/改动的内容,绿色是新建的类,绿色中加粗的是重要的语句~
#==============================================================================
# ■ Window_Skill
#------------------------------------------------------------------------------
#  特技画面、战斗画面、显示可以使用的特技浏览的窗口。
#==============================================================================

class Window_Skill < Window_Selectable
  def refresh
    if self.contents != nil
      self.contents.dispose
      self.contents = nil
    end
    @data = []
    for i in [email protected]
      skill = $data_skills[@actor.skills]
      # 如果技能名称不包含 "[称号]" 就显示技能
      if skill != nil && !(/\[称号\]/ === skill.name)
        @data.push(skill)
      end
    end
    # 如果项目数不是 0 就生成位图、重新描绘全部项目
    @item_max = @data.size
    if @item_max > 0
      self.contents = Bitmap.new(width - 32, row_max * 32)
      for i in 0...@item_max
        draw_item(i)
      end
    end
  end
end

#==============================================================================
# ■ Window_PlayerTitle
#------------------------------------------------------------------------------
#  显示同伴称号的窗口。
#==============================================================================

class Window_PlayerTitle < Window_Skill
  def refresh
    if self.contents != nil
      self.contents.dispose
      self.contents = nil
    end
    @data = []
    for i in [email protected]
      skill = $data_skills[@actor.skills]
      # 如果技能名称包含 "[称号]" 就显示称号
      if skill != nil && /\[称号\]/ === skill.name
        @data.push(skill)
      end
    end
    # 如果项目数不是 0 就生成位图、重新描绘全部项目
    @item_max = @data.size
    if @item_max > 0
      self.contents = Bitmap.new(width - 32, row_max * 32)
      for i in 0...@item_max
        draw_item(i)
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● 描绘项目
  #     index : 项目编号
  #--------------------------------------------------------------------------
  def draw_item(index)
    skill = @data[index]
    if @actor.skill_can_use?(skill.id)
      self.contents.font.color = normal_color
    else
      self.contents.font.color = disabled_color
    end
    x = 4 + index % 2 * (288 + 32)
    y = index / 2 * 32
    rect = Rect.new(x, y, self.width / @column_max - 32, 32)
    self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
    bitmap = RPG::Cache.icon(skill.icon_name)
    opacity = self.contents.font.color == normal_color ? 255 : 128
    self.contents.blt(x, y + 4, bitmap, Rect.new(0, 0, 24, 24), opacity)
    self.contents.draw_text(x + 28, y, 204, 32,
      skill.name.gsub(/\[称号\]/, '')
)
    # self.contents.draw_text(x + 232, y, 48, 32, skill.sp_cost.to_s, 2)
  end
end


#==============================================================================
# ■ Scene_Menu
#------------------------------------------------------------------------------
#  处理菜单画面的类。
#==============================================================================

class Scene_Menu
  #--------------------------------------------------------------------------
  # ● 主处理
  #--------------------------------------------------------------------------
  def main
    # 生成命令窗口
    s1 = $data_system.words.item
    s2 = $data_system.words.skill
    s3 = $data_system.words.equip
    s4 = "状态"
    s5 = "存档"
    s6 = "结束游戏"
    s7 = "称号"
    @command_window = Window_Command.new(160, [s1, s2, s3, s4, s5, s6, s7])
    @command_window.index = @menu_index
    @command_window.height = 32 * 7
    # 同伴人数为 0 的情况下
    if $game_party.actors.size == 0
      # 物品、特技、装备、状态无效化
      @command_window.disable_item(0)
      @command_window.disable_item(1)
      @command_window.disable_item(2)
      @command_window.disable_item(3)
      @command_window.disable_item(6)
    end
    # 禁止存档的情况下
    if $game_system.save_disabled
      # 存档无效
      @command_window.disable_item(4)
    end
    # 生成游戏时间窗口
    @playtime_window = Window_PlayTime.new
    @playtime_window.x = 0
    @playtime_window.y = 224
    # 生成步数窗口
    @steps_window = Window_Steps.new
    @steps_window.x = 0
    @steps_window.y = 320
    # 生成金钱窗口
    @gold_window = Window_Gold.new
    @gold_window.x = 0
    @gold_window.y = 416
    # 生成状态窗口
    @status_window = Window_MenuStatus.new
    @status_window.x = 160
    @status_window.y = 0
    # 执行过渡
    Graphics.transition
    # 主循环
    loop do
      # 刷新游戏画面
      Graphics.update
      # 刷新输入信息
      Input.update
      # 刷新画面
      update
      # 如果切换画面就中断循环
      if $scene != self
        break
      end
    end
    # 准备过渡
    Graphics.freeze
    # 释放窗口
    @command_window.dispose
    @playtime_window.dispose
    @steps_window.dispose
    @gold_window.dispose
    @status_window.dispose
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面 (命令窗口被激活的情况下)
  #--------------------------------------------------------------------------
  def update_command
    # 按下 B 键的情况下
    if Input.trigger?(Input::B)
      # 演奏取消 SE
      $game_system.se_play($data_system.cancel_se)
      # 切换的地图画面
      $scene = Scene_Map.new
      return
    end
    # 按下 C 键的情况下
    if Input.trigger?(Input::C)
      # 同伴人数为 0、存档、游戏结束以外的场合
      if $game_party.actors.size == 0 and (@command_window.index < 4 or @command_window.index == 6)
        # 演奏冻结 SE
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      # 命令窗口的光标位置分支
      case @command_window.index
      when 0           # 物品
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        # 切换到物品画面
        $scene = Scene_Item.new
      when 1, 2, 3, 6  # 特技,称号,装备,状态
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        # 激活状态窗口
        @command_window.active = false
        @status_window.active = true
        @status_window.index = 0
      when 4           # 存档
        # 禁止存档的情况下
        if $game_system.save_disabled
          # 演奏冻结 SE
          $game_system.se_play($data_system.buzzer_se)
          return
        end
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        # 切换到存档画面
        $scene = Scene_Save.new
      when 5           # 游戏结束
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        # 切换到游戏结束画面
        $scene = Scene_End.new
      end
      return
    end
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面 (状态窗口被激活的情况下)
  #--------------------------------------------------------------------------
  def update_status
    # 按下 B 键的情况下
    if Input.trigger?(Input::B)
      # 演奏取消 SE
      $game_system.se_play($data_system.cancel_se)
      # 激活命令窗口
      @command_window.active = true
      @status_window.active = false
      @status_window.index = -1
      return
    end
    # 按下 C 键的情况下
    if Input.trigger?(Input::C)
      # 命令窗口的光标位置分支
      case @command_window.index
      when 1  # 特技
        # 本角色的行动限制在 2 以上的情况下
        if $game_party.actors[@status_window.index].restriction >= 2
          # 演奏冻结 SE
          $game_system.se_play($data_system.buzzer_se)
          return
        end
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        # 切换到特技画面
        $scene = Scene_Skill.new(@status_window.index)
      when 2  # 装备
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        # 切换的装备画面
        $scene = Scene_Equip.new(@status_window.index)
      when 3  # 状态
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        # 切换到状态画面
        $scene = Scene_Status.new(@status_window.index)
      when 6  # 称号
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        # 切换到特技画面
        $scene = Scene_PlayerTitle.new(@status_window.index)

      end
      return
    end
  end
end

#==============================================================================
# ■ Scene_Skill
#------------------------------------------------------------------------------
#  处理称号画面的类。
#==============================================================================

class Scene_PlayerTitle
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #     actor_index : 角色索引
  #--------------------------------------------------------------------------
  def initialize(actor_index = 0)
    @actor_index = actor_index
  end
  #--------------------------------------------------------------------------
  # ● 主处理
  #--------------------------------------------------------------------------
  def main
    # 获取角色
    @actor = $game_party.actors[@actor_index]
    # 生成帮助窗口、状态窗口、特技窗口
    @help_window = Window_Help.new
    @status_window = Window_SkillStatus.new(@actor)
    @title_window = Window_PlayerTitle.new(@actor)
    # 关联帮助窗口
    @title_window.help_window = @help_window
    # 执行过渡
    Graphics.transition
    # 主循环
    loop do
      # 刷新游戏画面
      Graphics.update
      # 刷新输入信息
      Input.update
      # 刷新画面
      update
      # 如果画面切换的话就中断循环
      if $scene != self
        break
      end
    end
    # 准备过渡
    Graphics.freeze
    # 释放窗口
    @help_window.dispose
    @status_window.dispose
    @title_window.dispose
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面
  #--------------------------------------------------------------------------
  def update
    # 刷新窗口
    @help_window.update
    @status_window.update
    @title_window.update
    # 特技窗口被激活的情况下: 调用 update_skill
    if @title_window.active
      update_title
      return
    end
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面 (特技窗口被激活的情况下)
  #--------------------------------------------------------------------------
  def update_title
    # 按下 B 键的情况下
    if Input.trigger?(Input::B)
      # 演奏取消 SE
      $game_system.se_play($data_system.cancel_se)
      # 切换到菜单画面
      $scene = Scene_Menu.new(6)
      return
    end
    # 按下 R 键的情况下
    if Input.trigger?(Input::R)
      # 演奏光标 SE
      $game_system.se_play($data_system.cursor_se)
      # 移至下一位角色
      @actor_index += 1
      @actor_index %= $game_party.actors.size
      # 切换到别的特技画面
      $scene = Scene_PlayerTitle.new(@actor_index)
      return
    end
    # 按下 L 键的情况下
    if Input.trigger?(Input::L)
      # 演奏光标 SE
      $game_system.se_play($data_system.cursor_se)
      # 移至上一位角色
      @actor_index += $game_party.actors.size - 1
      @actor_index %= $game_party.actors.size
      # 切换到别的特技画面
      $scene = Scene_PlayerTitle.new(@actor_index)
      return
    end
  end
end
[LINE]1,#dddddd[/LINE]系统信息:本贴由楼主认可为正确答案,66RPG感谢您的热情解答~
作者: 迅雷進    时间: 2009-4-10 17:25
以下引用ws333于2009-4-10 4:32:34的发言:
嗯......能出图的话也就会做这个系统,我就不用求了。
小弟的意思是叫你画一个草图出来,
说明你所要加入的排版的位置。

为什么要那么复杂呢?
利用变量+开关不就可以了吗?
作者: ws333    时间: 2009-4-11 03:14
感谢紫苏,这个脚本应该能解决。我自己摸索一下





欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1