赞 | 0 |
VIP | 2 |
好人卡 | 1 |
积分 | 6 |
经验 | 27196 |
最后登录 | 2023-12-29 |
在线时间 | 169 小时 |
Lv2.观梦者
- 梦石
- 0
- 星屑
- 594
- 在线时间
- 169 小时
- 注册时间
- 2008-10-29
- 帖子
- 431
|
呵 做了个最简单的技能树 就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
|
|