Project1

标题: 技能树 [打印本页]

作者: 周思远    时间: 2008-11-8 03:59
提示: 作者被禁止或删除 内容自动屏蔽
作者: 玄月    时间: 2008-11-8 04:04
公用事件…………
给图我我帮你弄弄看。。。
作者: 越前リョーマ    时间: 2008-11-8 04:11
目前有一个类似的脚本,不管我看了一下似乎超级麻烦……
当然用事件也一样……
主站上有的。
作者: 周思远    时间: 2008-11-8 04:34
提示: 作者被禁止或删除 内容自动屏蔽
作者: clap_pl    时间: 2008-11-8 09:41


呵 做了个最简单的技能树 就3个技能-。-
目前的功能是 每个技能可以升三级 对应 比如
火球术 等级1
火球术 等级2
火球术 等级3
只有升了至少1及火球术才能升火山爆发
只有至少升了1及火山爆发才能升流星火雨
再进一步改改 应该就可以实现多人物 多技能树了吧 只要生成技能树前面 判断一下角色是谁 就可以了

用 $scene = Scene_skilltree.new来调用


先在Game_Actor脚本中加几个变量 用来指代技能等级和技能点
先在 class Game_Actor < Game_Battler

下面插入
attr_accessor :skillp               #剩余技能点数
attr_accessor :skill1               #第一层的技能
attr_accessor :skill2               #第二层的技能
attr_accessor :skill3               #第三层的技能

然后在 def setup(actor_id) 下面插入
    @skillp = @level*1        
#设置初始值 每升1级得1个技能点 所以初始技能点应该是这么多
    @skill1 = 0
    @skill2 = 0
    @skill3 = 0
然后在 def exp=(exp) 下面 @level += 1 之后(大概在450多行后面吧) 插入
@skillp += 1   #升级得一点技能点 这里就不考虑等级会降的情况了

然后在脚本列表栏中 按insert 插入个新脚本

写上
#==============================================================================
# ■ Window_Command
#------------------------------------------------------------------------------
#  一般的命令选择行窗口。(追加定义)
#==============================================================================
class Window_mp_Command < Window_Selectable
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #     width    : 窗口的宽
  #     commands : 命令字符串序列
  #--------------------------------------------------------------------------
  def initialize(width, commands)
    # 由命令的个数计算出窗口的高
    super(0, 0, width, 480)#commands.size * 32 + 32)
    @item_max = 13
    @commands = commands
     self.contents = Bitmap.new(width - 32, @item_max * 32)
   
    refresh
    self.index = 0
  end
  #--------------------------------------------------------------------------
  # ● 刷新
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    for i in 0...@item_max
      draw_item(i, normal_color)
    end
  end
  #--------------------------------------------------------------------------
  # ● 描绘项目
  #     index : 项目编号
  #     color : 文字色
  #--------------------------------------------------------------------------
  def draw_item(index, color)
    self.contents.font.color = color
    rect = Rect.new(4, 32 * index, self.contents.width - 8, 32)
    self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
    self.contents.draw_text(rect, @commands[index].to_s)
  end
  #--------------------------------------------------------------------------
  # ● 项目无效化
  #     index : 项目编号
  #--------------------------------------------------------------------------
  def disable_item(index)         ####把按钮灰色显示(代表不能按)
    draw_item(index, disabled_color)
  end
  def able_item(index)       ####把按钮正常显示
    draw_item(index, normal_color)
  end
end


class Window_Base < Window
  def draw_skilltree(actor, x, y)############描绘技能树的方法   
    bitmap=Bitmap.new("Graphics/Pictures/skill")#技能树的图
#技能树的图的地址是Graphics\Pictures下的skill.png 文件 可以自己改
    src_rect = Rect.new(0, 0, bitmap.width, bitmap.height)
    self.contents.blt(x, y, bitmap, src_rect)  
    x = 244   #############技能的点数显示位置的 x值 根据技能树的不同调整
    y = 69
    self.contents.draw_text(x , y, 96, 32, @actor.skill3.to_s )
    self.contents.draw_text(x , y+160, 96, 32, @actor.skill2.to_s )
    self.contents.draw_text(x , y+316, 96, 32, @actor.skill1.to_s )
#####在相应的地方现实技能的点数   
    self.contents.draw_text(0 , 400, 96, 32, "剩余技能点" )
    self.contents.draw_text(100 , 400, 96, 32, @actor.skillp.to_s )
#######现实剩余技能点数
    end
  end
  


#==============================================================================
class Window_skilltree < Window_Base  #技能树窗口
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #     actor : 角色
  #--------------------------------------------------------------------------
  def initialize(actor)
    super(0, 0, 500, 480)
    self.contents = Bitmap.new(width - 32, height - 32)
    @actor = actor
    refresh
  end  
  #--------------------------------------------------------------------------
  # ● 刷新
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear   
    draw_skilltree(@actor, 160, -40) #调用draw_skilltree绘制技能树
end
end

#============================================================================
#------------------------------------------------------------------------------
#
#==============================================================================

class Scene_skilltree######技能树场景
  include OPACITY_66RPG
  #--------------------------------------------------------------------------
  # ● 初始化对像
  #     actor_index : 角色索引
  #     menu_index : 选项起始位置
  #--------------------------------------------------------------------------
  def initialize(actor_index = 0 , menu_index = 0)
    @actor_index = actor_index
    @menu_index = menu_index
  end
  #--------------------------------------------------------------------------
  # ● 主处理
  #--------------------------------------------------------------------------
  def main
    s1 = "学习火球术" #########技能树菜单 根据人物不同 可以加个when 语句
    s2 = "学习火山爆发"
    s3 = "学习流星火雨"
    s4 = "调整结束"
    @command_window = Window_mp_Command.new(180, [s1,s2,s3,s4])
    @command_window.index = @menu_index
    @actor = $game_party.actors[@actor_index]
    s_disable #####################
    # 生成技能树窗口 #技能树窗口的坐标
    @skilltree_window = Window_skilltree.new(@actor)
    @skilltree_window.x = 180
    @skilltree_window.y = 0   #技能树窗口的坐标
    # 执行过渡 渐变图形的文件位置 自己设定
    Graphics.transition
    # 主循环
    loop do# 刷新游戏画面      
      Graphics.update     
      Input.update # 刷新输入信息      
      update# 刷新画面     
      if $scene != self # 如果切换画面就中断循环
        break
      end
    end
    # 准备过渡
    Graphics.freeze# 释放窗口   
    @command_window.dispose
    @skilltree_window.dispose
    end
  #--------------------------------------------------------------------------
  # ● 刷新画面
  #--------------------------------------------------------------------------
  def update
    # 刷新窗口
    @command_window.update
    # 选项明暗判断
    s_disable
    @skilltree_window.update
    #=============================================================
    # 按下 B 键的情况下
    #=============================================================
    if Input.trigger?(Input::B)
#如果按取消键,则把光标移动到调整结束按钮的位置
      # 演奏取消 SE
      $game_system.se_play($data_system.cancel_se)
      @command_window.index = 3
      return
    end
    #=============================================================
    # 按下 C 键的情况下
    #=============================================================
    if Input.trigger?(Input::C)      
      if @command_window.index == 3
          # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)      
        skill_learn                ##############学会和遗忘
        $scene = Scene_Map.new####回到地图
        return
      end      
      case @command_window.index
      when 0                           ###############
        if @actor.skillp == 0 or @actor.skill1 == 3
##如果技能点为0 或者 技能1已经是3级 就不能再升
        # 演奏冻结 SE
        $game_system.se_play($data_system.buzzer_se)
        return
      end        
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        @actor.skill1 += 1              #######技能1升一级
        @actor.skillp -= 1           #############技能点-一点
        @skilltree_window.refresh           ########刷新窗口
        s_disable                    #####刷新按钮明暗的显示
        return
      when 1                                 
        if @actor.skillp == 0 or @actor.skill2 == 3 or  @actor.skill1 ==0
          #如果技能点为0 或者 技能 2已经是最大等级3 或者 技能1没有升点 就不能再升级技能2
          # 演奏冻结 SE
        $game_system.se_play($data_system.buzzer_se)
        return
      end        
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        @actor.skillp -= 1              #技能点-1
        @actor.skill2 += 1           #技能2升1级
        @skilltree_window.refresh         
        s_disable        
        return
      when 2                            ###############
         if @actor.skillp == 0 or @actor.skill3 == 3 or  @actor.skill2 ==0
           #如果技能点为0 或者 技能 2已经是最大等级3 或者 技能1没有升点 就不能再升级技能2
        # 演奏冻结 SE
        $game_system.se_play($data_system.buzzer_se)
        return
      end      
        # 演奏确定 SE
        $game_system.se_play($data_system.decision_se)
        @actor.skill3 += 1                 ###技能3升1级
        @actor.skillp -= 1               ####技能点减1
        @skilltree_window.refresh
        s_disable
        return
      end
    end
    #=============================================================
    # 什么都没有按下的情况
    #=============================================================
    textNo = @command_window.index   
    #=============================================================
    # 按下R与L换人的情况
    #=============================================================      
    if Input.trigger?(Input::RIGHT)
     
      # 演奏光标 SE
      $game_system.se_play($data_system.cursor_se)
      # 移至下一位角色
      @actor_index += 1
      @actor_index %= $game_party.actors.size
      # 切换到别的状态画面
      @command_window.index = 0
      $scene = Scene_skilltree.new(@actor_index , @command_window.index)      
      return
    end
    # 按下 L 键的情况下
    if Input.trigger?(Input::LEFT)     
      # 演奏光标 SE
      $game_system.se_play($data_system.cursor_se)
      # 移至上一位角色
      @actor_index += $game_party.actors.size - 1
      @actor_index %= $game_party.actors.size
      # 切换到别的状态画面      
     @command_window.index = 0
      $scene = Scene_skilltree.new(@actor_index , @command_window.index)
      
      return
    end
  end  
  #--------------------------------------------------------------------------
  # ● 选项明暗判断
  #--------------------------------------------------------------------------
  def skill_learn###############结算技能点 并习得技能的方法
    learn_num = $game_party.actors.size###判断有几个角色
    for i in 0 ... learn_num      
      @learner = $game_party.actors
      @s1 = @learner.skill1
      @s2 = @learner.skill2
      @s3 = @learner.skill3   
      case @s1
      when 1
        @learner.learn_skill(1)#学会等级1的技能1 id为1
      when 2
        @learner.learn_skill(2)#学会等级2的技能1 id为2
        @learner.forget_skill(1)#把等级1的技能1 忘掉
      when 3
        @learner.learn_skill(3) #学会等级3的技能1 id为3
        @learner.forget_skill(2)#把等级2的技能1 忘掉
        @learner.forget_skill(1)#把等级1的技能1 忘掉
      end
      
      case @s2
      when 1
        @learner.learn_skill(4)#学会等级1的技能2 id为4
      when 2
        @learner.learn_skill(5)#学会等级2的技能2 id为5
        @learner.forget_skill(4)#把等级1的技能2 忘掉
      when 3
        @learner.learn_skill(6) #学会等级3的技能2 id为6
        @learner.forget_skill(4)#把等级1的技能2 忘掉
        @learner.forget_skill(5)#把等级2的技能2 忘掉
      end
      
       case @s3
      when 1
        @learner.learn_skill(7)#学会等级1的技能3 id为7
      when 2
        @learner.learn_skill(8)#学会等级2的技能3 id为8
        @learner.forget_skill(7)#把等级1的技能3 忘掉
      when 3
        @learner.learn_skill(9) #学会等级3的技能3 id为9
        @learner.forget_skill(7)#把等级1的技能3 忘掉
        @learner.forget_skill(8)#把等级2的技能3 忘掉
      end  
      end
    end
  def s_disable
    #如果技能点数为0 或者 该技能已经升满 又或者前提技能一级都没有升 就把按钮现实成灰色
    if @actor.skillp == 0 or @actor.skill1 == 3
      @command_window.disable_item(0)
    else
      @command_window.able_item(0)
    end
    if @actor.skillp == 0 or @actor.skill2 == 3 or @actor.skill1 == 0
      @command_window.disable_item(1)
    else
      @command_window.able_item(1)
    end
    if @actor.skillp == 0 or @actor.skill3 == 3 or @actor.skill2 == 0
      @command_window.disable_item(2)
    else
      @command_window.able_item(2)
    end   
end
end






作者: 玄月    时间: 2008-11-8 16:08
看来以后论坛又会有神人了…………
作者: 周思远    时间: 2008-11-8 21:44
提示: 作者被禁止或删除 内容自动屏蔽
作者: clap_pl    时间: 2008-11-8 21:50
哦 可能是我用的66rpg加强版的脚本吧
那句话删了吧
没什么用 在这里
作者: 周思远    时间: 2008-11-8 21:54
提示: 作者被禁止或删除 内容自动屏蔽
作者: clap_pl    时间: 2008-11-8 21:59
这张技能树的图也给你好了 ^ ^

作者: clap_pl    时间: 2008-11-8 22:06
一开始 skillp 都定义好了吗

那句话 应该没问题啊
位置放对了吗
放在
def setup(actor_id)
    actor = $data_actors[actor_id]
    @actor_id = actor_id
    @name = actor.name
    @character_name = actor.character_name
    @character_hue = actor.character_hue
    @battler_name = actor.battler_name
    @battler_hue = actor.battler_hue
    @class_id = actor.class_id
    @weapon_id = actor.weapon_id
    @armor1_id = actor.armor1_id
    @armor2_id = actor.armor2_id
    @armor3_id = actor.armor3_id
    @armor4_id = actor.armor4_id
    @level = actor.initial_level
    @exp_list = Array.new(101)
    make_exp_list
    @exp = @exp_list[@level]
    @skills = []
    @hp = maxhp
    @sp = maxsp
    @states = []
    @states_turn = {}
    @maxhp_plus = 0
    @maxsp_plus = 0
    @str_plus = 0
    @dex_plus = 0
    @agi_plus = 0
    @int_plus = 0
的后面好了

还不行的话 先让它等于 10 或者随便一个自然数
看看有没有问题
作者: 周思远    时间: 2008-11-8 22:13
提示: 作者被禁止或删除 内容自动屏蔽
作者: 越前リョーマ    时间: 2008-11-8 22:39
Clap兄很认真嘛……
作者: clap_pl    时间: 2008-11-9 10:12
我也还只是新手{/tp}
刚学了几天脚本而已
没事把别人的脚本拿来研究研究 改一改 就有了一点小心得

我的QQ 761747671
一起讨论讨论吧


作者: 玄月    时间: 2008-11-9 17:15
反正我就是没学脚本的人……………………
LS年龄应该超过18岁吧。。。
否则哪有那么多时间……
作者: 周思远    时间: 2008-11-9 20:56
提示: 作者被禁止或删除 内容自动屏蔽
作者: 风吹过的晴天    时间: 2008-11-9 21:01
提示: 作者被禁止或删除 内容自动屏蔽
作者: 周思远    时间: 2008-11-9 21:10
提示: 作者被禁止或删除 内容自动屏蔽
作者: clap_pl    时间: 2008-11-10 10:00
id = $game_party.actors[@actor_index].id
when id
case 1
.........
case 2
........
case 3
.......
end [LINE]1,#dddddd[/LINE]系统信息:本贴由楼主认可为正确答案,66RPG感谢您的热情解答~




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