设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 20334|回复: 23
打印 上一主题 下一主题

[RMVX发布] 转职系统(测试版)

 关闭 [复制链接]

Lv2.观梦者

天仙

梦石
0
星屑
620
在线时间
184 小时
注册时间
2008-4-15
帖子
5023

贵宾

跳转到指定楼层
1
发表于 2008-12-7 09:28:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
先放个测试版出来
然後埋头继续写功课

设定方法看注释

调用转职介面:$scene = Scene_Class.new(角色)
或:$scene = Scene_Class.new(角色,菜单命令index)
第一个方法跳出时返回地图
第二个返回菜单

截图:


设定部分

  1. class RPG::Class
  2.   #=============================================================================
  3.   # 设定是否在描绘职业时显示等级
  4.   #=============================================================================
  5.   DRAW_LEVEL_WITH_CLASS = true
  6.   
  7.   #=============================================================================
  8.   # 设定每个职业的前置职业和前置职业等级,没有指定的默认为无。
  9.   # 格式:  
  10.   #     when 职业ID
  11.   #       prereq_class = {前置1=>等级1, 前置2=>等级2}
  12.   #
  13.   # 例如:prereq_class = {3=>2, 4=>5}
  14.   # 代表需要 3号职业2级 以及 4号职业5级
  15.   #=============================================================================
  16.   def prereq_class_id
  17.     prereq_class=0
  18.     case id
  19.     when 2
  20.       prereq_class = {1=>2, 3=>1}
  21.     when 5
  22.     else
  23.       prereq_class = 0
  24.     end
  25.     return prereq_class
  26.   end
  27.   #=============================================================================
  28.   # 设定每个职业的等级上限,没有指定的默认为 99
  29.   # 格式:  
  30.   #     when 职业ID
  31.   #       return 等级上限
  32.   #=============================================================================
  33.   def max_level
  34.     case id
  35.     when 1
  36.       return 5
  37.     when 2
  38.       return 10
  39.     else
  40.       return 99
  41.     end
  42.   end
  43. end
  44. #===============================================================================
  45. # ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
  46. #===============================================================================
  47. class Game_Actor < Game_Battler
  48.   #=============================================================================
  49.   # 设定角色可以转的职业,没有指定的默认可以转所有职业
  50.   # 格式:
  51.   #     when 角色ID
  52.   #       possible_class = [能够转职的职业]
  53.   #=============================================================================
  54.   def setup_possible_class
  55.     case @actor_id
  56.     # 格式:
  57.     # when 角色ID
  58.     #   possible_class = [能够转职的职业]
  59.     when 1
  60.       @possible_class = [1, 2, 5]   
  61.     else
  62.       # 默认返回全部职业
  63.       @possible_class = (1...$data_classes.size).to_a
  64.     end
  65.     # 初始化职业等级
  66.     initialize_class
  67.   end
  68. end
复制代码


主要部分

  1. class Game_Actor < Game_Battler
  2.   attr_reader :possible_class # 可以转职的职业
  3.   #--------------------------------------------------------------------------
  4.   # ● 设定角色
  5.   #--------------------------------------------------------------------------
  6.   alias setup_class_up setup
  7.   def setup(actor_id)
  8.     setup_class_up(actor_id)
  9.     setup_possible_class
  10.   end
  11.   #--------------------------------------------------------------------------
  12.   # ● 获取当前职业等级
  13.   #--------------------------------------------------------------------------
  14.   def current_class_level
  15.     return class_level(@class_id)
  16.   end
  17.   #--------------------------------------------------------------------------
  18.   # ● 获取职业等级
  19.   #     pcid : 指定的职业ID,默认为当前职业ID
  20.   #--------------------------------------------------------------------------
  21.   def class_level(pcid=@class_id)
  22.     pcid = @class_id unless p_class?(pcid)
  23.     return @class_level[pcid]
  24.   end
  25.   #--------------------------------------------------------------------------
  26.   # ● 设定职业等级
  27.   #     lv   : 等级数值
  28.   #     pcid : 指定的职业ID,默认为当前职业ID
  29.   #--------------------------------------------------------------------------
  30.   def set_class_level(lv, pcid=@class_id)
  31.     return unless lv.is_a?(Integer)
  32.     return if lv > $data_classes[@class_id].max_level
  33.     @class_level[pcid] = lv
  34.   end
  35.   #--------------------------------------------------------------------------
  36.   # ● 初始化职业
  37.   #--------------------------------------------------------------------------
  38.   def initialize_class
  39.     @class_level = {}
  40.     @possible_class.each{ |c|
  41.       @class_level[c] = 0
  42.       if c == $data_actors[@actor_id].class_id and @class_level[c] == 0
  43.         @class_level[c] = 1
  44.       end
  45.     }
  46.   end
  47.   #--------------------------------------------------------------------------
  48.   # ● 增加可转职的职业
  49.   #--------------------------------------------------------------------------
  50.   def add_possible_class(a_cid)
  51.     return if p_class?(a_cid)
  52.     @possible_class.push << a_cid
  53.     # 以下用来防错
  54.     @possible_class.compact! # 强制去除nil
  55.     @possible_class.uniq!    # 强制去除重复元素
  56.     @possible_class.sort!    # 强制排序
  57.   end
  58.   #--------------------------------------------------------------------------
  59.   # ● 移除可转职的职业
  60.   #--------------------------------------------------------------------------
  61.   def remove_possible_class
  62.     return unless p_class?(a_cid)
  63.     @possible_class.delete(a_cid)
  64.   end
  65.   #--------------------------------------------------------------------------
  66.   # ● 转职
  67.   #     c_cid : 指定的职业ID
  68.   #--------------------------------------------------------------------------
  69.   def change_class(c_cid)
  70.     return unless class_can_change?(c_cid)
  71.     @class_id = c_cid
  72.   end
  73.   #--------------------------------------------------------------------------
  74.   # ● 判定是否能转职
  75.   #     c_cid : 指定的职业ID
  76.   #  msg_show : 是否显示无法转职的讯息,默认为否
  77.   #--------------------------------------------------------------------------
  78.   def class_can_change?(c_id, msg_show=false)
  79.     if @class_level[@class_id] == $data_classes[@class_id].max_level
  80.       message("职业无法升级。\x00职业等级已达上限。") if msg_show
  81.       return false
  82.     end
  83.     # 不是能转职的职业
  84.     unless p_class?(c_id) # 无法转职
  85.       message("无法转职。") if msg_show
  86.       return false
  87.     end
  88.     prereq = $data_classes[c_id].prereq_class_id
  89.     return true if prereq == 0 # 不需要前置职业
  90.     unless prereq.keys.all?{|pq| p_class?(pq)}
  91.       message("无法转职。\x00未习得前置职业。") if msg_show
  92.       return false
  93.     end
  94.     prereq.each{|pq, pqlv|
  95.       if @class_level[pq] < pqlv
  96.         message("无法转职。\x00前置职业等级不足。") if msg_show
  97.         return false
  98.       end
  99.     }
  100.     return true
  101.   end
  102.   #--------------------------------------------------------------------------
  103.   # ● 判断是否为可以转职的职业
  104.   #     p_cid : 指定的职业ID
  105.   #--------------------------------------------------------------------------
  106.   def p_class?(p_cid)
  107.     return @possible_class.include?(p_cid)
  108.   end
  109.   #--------------------------------------------------------------------------
  110.   # ● 弹出信息
  111.   #     text : 指定的文字
  112.   #--------------------------------------------------------------------------
  113.   def message(text)
  114.     $game_message.texts.push(text)
  115.   end
  116. end
复制代码


介面部分

  1. class Scene_Class < Scene_Base
  2.   def initialize(actor, return_scene=nil)
  3.     @actor = actor
  4.     @return_scene = return_scene
  5.   end
  6.   def start
  7.     command = []
  8.     @actor.possible_class.each{|i| command << $data_classes[i].name}
  9.     @class_window = Window_Command.new(120, command)
  10.     @class_window.x = 76
  11.     @class_window.y = 76
  12.     @class_window.height = 264
  13.     @class_window.create_contents
  14.     command.size.times{|i|
  15.     @class_window.draw_item(i, @actor.class_can_change?(@actor.possible_class[i]))}
  16.    
  17.     @prereq_window = Window_Prereq.new(@actor)
  18.     @prereq_window.refresh
  19.     create_menu_background
  20.   end
  21.   def return_scene
  22.     $scene = @return_scene ? Scene_Menu.new(@return_scene) : Scene_Map.new
  23.   end
  24.   def terminate
  25.     dispose_menu_background
  26.     @class_window.dispose
  27.     @prereq_window.dispose
  28.   end
  29.   def update
  30.     update_menu_background
  31.     @class_window.update
  32.     @prereq_window.update
  33.     if Input.trigger?(Input::UP) or Input.trigger?(Input::DOWN)
  34.       @prereq_window.s_class_id = 1+ @class_window.index
  35.       @prereq_window.refresh
  36.     elsif Input.trigger?(Input::B)
  37.       return_scene
  38.     elsif Input.trigger?(Input::C)
  39.       cid = @actor.possible_class[@class_window.index]
  40.       # 判断能否转职
  41.       if @actor.class_can_change?(cid)
  42.         Sound.play_decision
  43.         # 判断是升级还是转职
  44.         if @actor.class_id == cid
  45.           @actor.set_class_level(@actor.class_level + 1)
  46.         else
  47.           @actor.change_class(cid)
  48.           @actor.set_class_level(1) if @actor.class_level == 0
  49.         end
  50.         # 刷新窗口
  51.         @prereq_window.refresh
  52.         @class_window.draw_item(@class_window.index,@actor.class_can_change?(cid))
  53.       else
  54.         Sound.play_buzzer
  55.         return
  56.       end
  57.     end
  58.   end
  59. end
  60. class Window_Prereq < Window_Base
  61.   attr_accessor :s_class_id
  62.   def initialize(actor)
  63.     @actor = actor
  64.     @s_class_id = @actor.possible_class[0]
  65.     super(196, 76, 272, 264)
  66.   end
  67.   def refresh
  68.     self.contents.clear
  69.     @s_class = $data_classes[@s_class_id]
  70.     actor_class = $data_classes[@actor.class_id]
  71.     self.contents.font.color = normal_color
  72.     self.contents.draw_text(0, 0, 120, WLH, "当前职业:")
  73.     self.contents.draw_text(48, 24, 120, WLH, "#{actor_class.name} #{@actor.current_class_level}级")
  74.     self.contents.draw_text(0, 48, 120, WLH, "履历:")
  75.     @y = 0
  76.     @actor.possible_class.each{|i|
  77.       text = $data_classes[i].name
  78.       if @actor.class_level(i) > 0
  79.         self.contents.draw_text(48, 72+WLH*@y, 120, WLH, "#{text} #{@actor.class_level(i)}级")
  80.         @y += 1
  81.       end
  82.     }   
  83.     self.contents.draw_text(0, 72+WLH*@y, 120, WLH, "前置职业:")
  84.     @y += 1
  85.     prereq = @s_class.prereq_class_id
  86.     if prereq != 0
  87.       prereq.keys.size.times{|i|
  88.         pq = prereq.keys[i]
  89.         pqclass = $data_classes[pq].name
  90.         pqlv = prereq[pq]
  91.         enabled = (@actor.p_class?(pq) and @actor.class_level(pq) > pqlv)
  92.         self.contents.font.color = enabled ? normal_color : knockout_color
  93.         self.contents.draw_text(48, 72+WLH*(@y+i), 120, WLH, "#{pqclass} #{pqlv}级")
  94.       }
  95.     else
  96.       self.contents.draw_text(48, 72+WLH*@y, 120, WLH, "无")
  97.     end
  98.   end
  99. end
  100. class Window_Base < Window
  101.   #--------------------------------------------------------------------------
  102.   # ● 绘制角色职业
  103.   #--------------------------------------------------------------------------
  104.   alias change_class_draw_actor_class draw_actor_class
  105.   def draw_actor_class(actor, x, y)
  106.     if RPG::Class::DRAW_LEVEL_WITH_CLASS
  107.       self.contents.font.color = normal_color
  108.       text = actor.class.name + " #{actor.class_level}级"
  109.       self.contents.draw_text(x, y, 108, WLH, text)
  110.     else
  111.       change_class_draw_actor_class(actor, x, y)
  112.     end
  113.   end
  114. end
复制代码

点评

直接做个事件来转不就得了?要这么麻烦吗?  发表于 2010-7-30 10:15
VA脚本开工中...
偷窃脚本1.0 - 已完成

Lv2.观梦者

天仙

梦石
0
星屑
620
在线时间
184 小时
注册时间
2008-4-15
帖子
5023

贵宾

2
 楼主| 发表于 2008-12-7 09:29:06 | 只看该作者
沙发充公
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-12-7
帖子
18
3
发表于 2008-12-7 17:27:25 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-12-3
帖子
93
4
发表于 2008-12-7 19:28:53 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-12-3
帖子
93
5
发表于 2008-12-7 20:06:42 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv2.观梦者

天仙

梦石
0
星屑
620
在线时间
184 小时
注册时间
2008-4-15
帖子
5023

贵宾

6
 楼主| 发表于 2008-12-7 21:36:56 | 只看该作者
以下引用心碎小子HBK于2008-12-7 12:06:42的发言:
我运行的时候 说界面部分第8行有错 undefined possible_class

可以把整個錯誤訊息截圖貼出來嗎?

以下引用心碎小子HBK于2008-12-7 12:32:09的短信:
还有,我没搞懂前置职业是什么意思

前置職業就是轉職前的職業需求
例如:
要轉「祭司」之前必須要有「牧師」這個職業
要轉「弩兵」之前必須要有「弓手」這個職業

已經轉過的職業會列出在「履歷」裡面
VA脚本开工中...
偷窃脚本1.0 - 已完成
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-12-3
帖子
93
7
发表于 2008-12-7 23:10:10 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
46
在线时间
10 小时
注册时间
2007-5-27
帖子
2558

第1届Title华丽大赛新人奖

8
发表于 2008-12-8 04:08:51 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv2.观梦者

天仙

梦石
0
星屑
620
在线时间
184 小时
注册时间
2008-4-15
帖子
5023

贵宾

9
 楼主| 发表于 2008-12-8 12:15:08 | 只看该作者
以下引用心碎小子HBK于2008-12-7 15:10:10的发言:
我在一个事件里弄这么一行代码,想让它跳到专职界面
然后一触发事件就这样了
还有一个问题,怎样才能在级数到达一定时,自动弹出专职菜单?


$scene = Scene_Class.new(角色)
你沒有提供角色參數
你可以這樣:
actor = $game_party.members[0]
$scene = Scene_Class.new(actor)
VA脚本开工中...
偷窃脚本1.0 - 已完成
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-12-3
帖子
93
10
发表于 2008-12-8 20:30:26 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-12-31 01:03

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表