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

Project1

 找回密码
 注册会员
搜索

【脚本问题】自己修改的脚本求大佬帮忙看下

查看数: 2594 | 评论数: 1 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2017-10-20 19:16

正文摘要:

本帖最后由 Zter 于 2017-10-20 19:25 编辑 我暂时只会把技能列表改成这样 (暂时不要帮助窗口),但是这样显得不美观,我想把技能名和花费TP的描绘都统一向下微移一些,但是我只会调技能名的位置,不会调技能花 ...

回复

魔法丶小肉包 发表于 2017-10-20 22:06:25
首先呢,完全可以不用重写一个,直接修改原来的更方便,而且一般来说原本的这个类也就在战斗中这一块地方使用,所以应该不会影响别的地方
那么,经过修改
RUBY 代码复制
  1. class Window_BattleSkill < Window_SkillList
  2.   def initialize
  3.     super(0, Graphics.height-fitting_height(3), Graphics.width, fitting_height(3))
  4.     self.visible = false
  5.   end
  6.   def show
  7.     select_last
  8.     super
  9.   end
  10.   def hide
  11.     super
  12.   end
  13.   def col_max
  14.     return 4
  15.   end
  16.   def spacing
  17.     return 0
  18.   end
  19.   def item_height
  20.     line_height*3
  21.   end
  22.  
  23.   def draw_item(index)
  24.     skill = @data[index]
  25.     if skill
  26.       rect = item_rect(index)
  27.       rect.width -= 4
  28.       draw_item_name(skill, rect.x, rect.y+24, enable?(skill))
  29.       draw_skill_cost(rect, skill)
  30.     end
  31.   end
  32.   def draw_skill_cost(rect, skill)
  33.     if @actor.skill_tp_cost(skill) > 0
  34.       change_color(tp_cost_color, enable?(skill))
  35.       draw_text(rect.x,rect.y,rect.width,rect.height + 24, @actor.skill_tp_cost(skill), 2)
  36.     elsif @actor.skill_mp_cost(skill) > 0
  37.       change_color(mp_cost_color, enable?(skill))
  38.       draw_text(rect.x,rect.y,rect.width,rect.height + 24, @actor.skill_mp_cost(skill), 2)
  39.     end
  40.   end
  41. end

就只需要30多行代码了,是不是省事多了呢~
顺便说一下第一个问题,技能名坐标你会了,那就不多说了,消耗坐标的话其实draw_text这个方法可以把第一个参数rect拆开来写成4个参数(x,y,width,height),通过调整这四个参数来实现坐标的具体修改
具体的可以参考上面的代码自己试着调整一下参数看看变化就ok了
别忘了改这里
RUBY 代码复制
  1. class Scene_Battle < Scene_Base
  2.   def create_skill_window
  3.     @skill_window = Window_BattleSkill.new
  4.     @skill_window.set_handler(:ok,     method(:on_skill_ok))
  5.     @skill_window.set_handler(:cancel, method(:on_skill_cancel))
  6.   end
  7. end


那么,第二个问题呢,也不用考虑的太复杂了
只需要一个简单的思路:战斗开始——>选择技能
那么展开来继续思考:战斗开始——>直接进入角色技能选择界面
继续:战斗开始——>跳过队伍指令——>跳过角色指令——>直接进入角色技能选择界面
大致的思路有了,那么想一想怎么实现比较方便,2个思路
1.干脆取消创建窗口
2.创建了窗口但隐藏掉(反正玩家看不见就行了)
那么,首先是第一步
去掉队伍指令窗口,在这里就选择干脆取消创建窗口吧
RUBY 代码复制
  1. def create_all_windows
  2.     create_message_window
  3.     create_scroll_text_window
  4.     create_log_window
  5.     create_status_window
  6.     create_info_viewport
  7.     create_actor_command_window
  8.     create_help_window
  9.     create_skill_window
  10.     create_item_window
  11.     create_actor_window
  12.     create_enemy_window
  13.   end

去掉创建队伍指令窗口的那行脚本
直接这样去掉肯定一堆出错吧?没关系,一点点调试就行了
直接进去战斗测试,你会发现各种报错
没关系,这些报错都是写原本调用了队伍指令窗口的地方报错(因为现在不创建了)
把这些东西该改的改一改该注释的注释掉就行了
RUBY 代码复制
  1. def update_info_viewport
  2.     move_info_viewport(64)  if BattleManager.in_turn?
  3.   end
  4.   def update_message_open
  5.     if $game_message.busy? && !@status_window.close?
  6.       @message_window.openness = 0
  7.       @status_window.close
  8.       @actor_command_window.close
  9.     end
  10.   end
  11. def start_party_command_selection
  12.     unless scene_changing?
  13.       refresh_status
  14.       @status_window.unselect
  15.       @status_window.open
  16.       if BattleManager.input_start
  17.         command_fight
  18.       else
  19.         turn_start
  20.       end
  21.     end
  22.   end
  23.   def start_actor_command_selection
  24.     @status_window.select(BattleManager.actor.index)
  25.     @actor_command_window.setup(BattleManager.actor)
  26.   end
  27.   def turn_start
  28.     @actor_command_window.close
  29.     @status_window.unselect
  30.     @subject =  nil
  31.     BattleManager.turn_start
  32.     @log_window.wait
  33.     @log_window.clear
  34.   end

嗯,然后呢,队伍指令窗口就这么没了,进入战斗测试后会发现直接开始角色命令的选择了。
那么,第一步完成
第二步,想办法直接进入技能选择界面
RUBY 代码复制
  1. def start_party_command_selection
  2.     unless scene_changing?
  3.       refresh_status
  4.       @status_window.unselect
  5.       @status_window.open
  6.       if BattleManager.input_start
  7.         command_fight
  8.       else
  9.         turn_start
  10.       end
  11.     end
  12.   end

这个方法是刚刚上面改的,在战斗开始后就直接进入战斗命令了(相当于默认选择了"战斗")
那么选择战斗是进入角色指令界面,那如果默认选择"技能"呢?
于是改一改
RUBY 代码复制
  1. def start_party_command_selection
  2.     unless scene_changing?
  3.       refresh_status
  4.       @status_window.unselect
  5.       @status_window.open
  6.       if BattleManager.input_start
  7.         if BattleManager.next_command
  8.           start_actor_command_selection
  9.           command_skill
  10.         else
  11.           turn_start
  12.         end
  13.       else
  14.         turn_start
  15.       end
  16.     end
  17.   end

这样一来,就默认选择了技能
测试一下,发现虽然打开了技能界面,但角色指令窗口还是在,于是还要改一下
RUBY 代码复制
  1. def start_actor_command_selection
  2.     @status_window.select(BattleManager.actor.index)
  3.   end

这样的话呢,角色指令窗口就没了
但是新的问题又来了,窗口出现但没技能
于是改一改command_skill的@skill_window.stype_id的值,这里改成1代表第一种类型的技能(因为数据库里可以设置很多种类的技能,这里改成默认显示1也就是"特技",当然可以进一步的修改来显示所有已学会的技能)
RUBY 代码复制
  1. def command_skill
  2.     @skill_window.actor = BattleManager.actor
  3.     @skill_window.stype_id = 1
  4.     @skill_window.refresh
  5.     @skill_window.show.activate
  6.   end

然后测试,发现可以选择了,但是,你会发现2个问题
1.如果技能都消耗不足无法使用怎么继续
2.如果这回合不想使用技能怎么跳过进入下一个角色的选择
那么,想一想,确定来选择,那么取消呢,取消还没修改
默认的取消是返回角色指令选择界面,那么我们现在不需要,所以要修改
RUBY 代码复制
  1. def on_skill_cancel
  2.     @skill_window.hide
  3.     next_command
  4.   end

取消后直接进入下一个选择就ok了,这样一下子就解决了2个问题和原本按取消时候的bug
到这里,就算基本完成了

包括第一个问题总的合起来就是:
RUBY 代码复制
  1. class Scene_Battle < Scene_Base
  2.   def create_skill_window
  3.     @skill_window = Window_BattleSkill.new
  4.     @skill_window.set_handler(:ok,     method(:on_skill_ok))
  5.     @skill_window.set_handler(:cancel, method(:on_skill_cancel))
  6.   end
  7. end
  8. class Window_BattleSkill < Window_SkillList
  9.   def initialize
  10.     super(0, Graphics.height-fitting_height(3), Graphics.width, fitting_height(3))
  11.     self.visible = false
  12.   end
  13.   def show
  14.     select_last
  15.     super
  16.   end
  17.   def hide
  18.     super
  19.   end
  20.   def col_max
  21.     return 4
  22.   end
  23.   def spacing
  24.     return 0
  25.   end
  26.   def item_height
  27.     line_height*3
  28.   end
  29.  
  30.   def draw_item(index)
  31.     skill = @data[index]
  32.     if skill
  33.       rect = item_rect(index)
  34.       rect.width -= 4
  35.       draw_item_name(skill, rect.x, rect.y+24, enable?(skill))
  36.       draw_skill_cost(rect, skill)
  37.     end
  38.   end
  39.   def draw_skill_cost(rect, skill)
  40.     if @actor.skill_tp_cost(skill) > 0
  41.       change_color(tp_cost_color, enable?(skill))
  42.       draw_text(rect.x,rect.y,rect.width,rect.height + 24, @actor.skill_tp_cost(skill), 2)
  43.     elsif @actor.skill_mp_cost(skill) > 0
  44.       change_color(mp_cost_color, enable?(skill))
  45.       draw_text(rect.x,rect.y,rect.width,rect.height + 24, @actor.skill_mp_cost(skill), 2)
  46.     end
  47.   end
  48. end
  49. class Scene_Battle < Scene_Base
  50.   def update_info_viewport
  51.     move_info_viewport(64)  if BattleManager.in_turn?
  52.   end
  53.   def update_message_open
  54.     if $game_message.busy? && !@status_window.close?
  55.       @message_window.openness = 0
  56.       @status_window.close
  57.       @actor_command_window.close
  58.     end
  59.   end
  60.   def create_all_windows
  61.     create_message_window
  62.     create_scroll_text_window
  63.     create_log_window
  64.     create_status_window
  65.     create_info_viewport
  66.     create_actor_command_window
  67.     create_help_window
  68.     create_skill_window
  69.     create_item_window
  70.     create_actor_window
  71.     create_enemy_window
  72.   end
  73.   def start_party_command_selection
  74.     unless scene_changing?
  75.       refresh_status
  76.       @status_window.unselect
  77.       @status_window.open
  78.       if BattleManager.input_start
  79.         if BattleManager.next_command
  80.           start_actor_command_selection
  81.           command_skill
  82.         else
  83.           turn_start
  84.         end
  85.       else
  86.         turn_start
  87.       end
  88.     end
  89.   end
  90.   def start_actor_command_selection
  91.     @status_window.select(BattleManager.actor.index)
  92.   end
  93.   def turn_start
  94.     @actor_command_window.close
  95.     @status_window.unselect
  96.     @subject =  nil
  97.     BattleManager.turn_start
  98.     @log_window.wait
  99.     @log_window.clear
  100.   end
  101.   def command_skill
  102.     @skill_window.actor = BattleManager.actor
  103.     @skill_window.stype_id = 1
  104.     @skill_window.refresh
  105.     @skill_window.show.activate
  106.   end
  107.   def next_command
  108.     if BattleManager.next_command
  109.       start_actor_command_selection
  110.       command_skill
  111.     else
  112.       turn_start
  113.     end
  114.   end
  115.   def on_skill_cancel
  116.     @skill_window.hide
  117.     next_command
  118.   end
  119. end


点评

多谢大佬,已经解决了,感激万分  发表于 2017-10-21 12:02

评分

参与人数 1+1 收起 理由
oott123 + 1 精品文章

查看全部评分

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

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

GMT+8, 2024-11-17 16:35

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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