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

Project1

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

技能树

 关闭 [复制链接]
头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-7-13
帖子
64
跳转到指定楼层
1
发表于 2008-11-8 03:59:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
提示: 作者被禁止或删除 内容自动屏蔽

Lv1.梦旅人

魔王 ⑨

梦石
0
星屑
95
在线时间
380 小时
注册时间
2006-10-16
帖子
4299

贵宾

2
发表于 2008-11-8 04:04:42 | 只看该作者
公用事件…………
给图我我帮你弄弄看。。。
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (暗夜天使)

名侦探小柯

梦石
0
星屑
3309
在线时间
3620 小时
注册时间
2006-9-6
帖子
37400

开拓者贵宾第3届短篇游戏大赛主流游戏组亚军第5届短篇游戏比赛亚军

3
发表于 2008-11-8 04:11:24 | 只看该作者
目前有一个类似的脚本,不管我看了一下似乎超级麻烦……
当然用事件也一样……
主站上有的。
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-7-13
帖子
64
4
 楼主| 发表于 2008-11-8 04:34:33 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
594
在线时间
169 小时
注册时间
2008-10-29
帖子
431
5
发表于 2008-11-8 09:41:27 | 只看该作者


呵 做了个最简单的技能树 就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





回复 支持 反对

使用道具 举报

Lv1.梦旅人

魔王 ⑨

梦石
0
星屑
95
在线时间
380 小时
注册时间
2006-10-16
帖子
4299

贵宾

6
发表于 2008-11-8 16:08:52 | 只看该作者
看来以后论坛又会有神人了…………
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-7-13
帖子
64
7
 楼主| 发表于 2008-11-8 21:44:06 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
594
在线时间
169 小时
注册时间
2008-10-29
帖子
431
8
发表于 2008-11-8 21:50:05 | 只看该作者
哦 可能是我用的66rpg加强版的脚本吧
那句话删了吧
没什么用 在这里
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-7-13
帖子
64
9
 楼主| 发表于 2008-11-8 21:54:05 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
594
在线时间
169 小时
注册时间
2008-10-29
帖子
431
10
发表于 2008-11-8 21:59:01 | 只看该作者
这张技能树的图也给你好了 ^ ^
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2025-1-21 18:07

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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