Project1

标题: 帮忙改下这个VA的战斗指针脚本 [打印本页]

作者: 小汰酱    时间: 2017-4-17 15:41
标题: 帮忙改下这个VA的战斗指针脚本
本帖最后由 小汰酱 于 2017-4-17 15:43 编辑

已经亲自用空白新工程测试过了,对己方单位使用物品就会出错



此外, 战斗中已经死了的敌人还是能被指针选到。这也是个BUG
哪位大佬帮帮忙改改,感激不尽
脚本在下面
RUBY 代码复制
  1. #==============================================================================
  2. # ■ Sprite_BattleArrow
  3. #==============================================================================
  4.  
  5. class Sprite_BattleArrow < Sprite
  6.   #--------------------------------------------------------------------------
  7.   # ● 定义实例变量
  8.   #--------------------------------------------------------------------------
  9.   attr_reader   :index
  10.   attr_accessor :select_all
  11.   attr_accessor :can_select_all
  12.   attr_accessor :members
  13.   attr_accessor :add_x
  14.   attr_accessor :on_ok_method
  15.   attr_accessor :on_cancel_method
  16.   #--------------------------------------------------------------------------
  17.   # ● 初始化对像
  18.   #--------------------------------------------------------------------------
  19.   def initialize(type, viewport, can_select_all = false)
  20.     super(viewport)
  21.     self.bitmap = Cache.system("BattleArrow")
  22.     @type = type
  23.     case @type
  24.     when :enemy
  25.       self.ox = 0
  26.       src_rect.set(32, 0-35, 32, 32+50)
  27.       @members = $game_troop.members
  28.       @add_x = 30-10
  29.     when :actor
  30.       self.ox = 32
  31.       src_rect.set(0, 0-35, 32, 32+50)
  32.       @members = $game_party.battle_members
  33.       @add_x = -30
  34.     else
  35.       self.ox = 16
  36.       src_rect.set(0, 0, 32, 32)
  37.       @members = []
  38.       @add_x = 0
  39.     end
  40.     self.oy = 32
  41.     self.z = 2500
  42.     self.visible = false
  43.     @index = 0
  44.     @old_index = @index
  45.     @select_all = false
  46.     @can_select_all = can_select_all
  47.     update
  48.   end
  49.   #--------------------------------------------------------------------------
  50.   # ● 设置
  51.   #--------------------------------------------------------------------------
  52.   def setup(can_select_all)
  53.     @can_select_all = can_select_all
  54.     @select_all = false
  55.     @index = @old_index
  56.     case @type
  57.     when :actor
  58.       @members = $game_party.battle_members
  59.     when :enemy
  60.       @members = $game_troop.members
  61.     else
  62.       @members = []
  63.     end
  64.     self.visible = true
  65.     update
  66.   end
  67.   #--------------------------------------------------------------------------
  68.   # ● 获取光标指向的战斗者
  69.   #--------------------------------------------------------------------------
  70.   def battler
  71.     return members[index]
  72.   end
  73.   #--------------------------------------------------------------------------
  74.   # ● 设置光标位置
  75.   #--------------------------------------------------------------------------
  76.   def index=(index)
  77.     @index = index
  78.     update
  79.   end
  80.   #--------------------------------------------------------------------------
  81.   # ● 刷新画面
  82.   #--------------------------------------------------------------------------
  83.   def update
  84.     super
  85.     return unless visible
  86.     if Input.trigger?(13)
  87.       Sound.play_ok
  88.       on_ok_method.call if on_ok_method
  89.       return
  90.     end
  91.     if Input.trigger?(12)
  92.       Sound.play_cancel
  93.       on_cancel_method.call if on_cancel_method
  94.       return
  95.     end
  96.     if Input.trigger?(4) or Input.trigger?(6)
  97.       if @select_all
  98.         @select_all = false
  99.         @index = @old_index
  100.       else
  101.         if @can_select_all
  102.           @select_all = true
  103.           @old_index = @index
  104.         end
  105.       end
  106.     end
  107.     case @type
  108.     when :actor
  109.       update_actor
  110.     when :enemy
  111.       update_enemy
  112.     end
  113.   end
  114.   #--------------------------------------------------------------------------
  115.   # ● 刷新选择角色
  116.   #--------------------------------------------------------------------------
  117.   def update_actor
  118.     if @select_all
  119.       @index += 1
  120.       @index %= members.size
  121.     else
  122.       old_index = @index
  123.       for i in 0..members.size
  124.         @index = i
  125.         if @index == members.size
  126.           @index = old_index
  127.           break
  128.         end
  129.         next unless battler
  130.         self_x = battler.fscreen_x + add_x
  131.         self_y = battler.fscreen_y
  132.       end
  133.       if Input.repeat?(2)
  134.         Sound.play_cursor
  135.         @index += 1
  136.         @index %= members.size
  137.       end
  138.       if Input.repeat?(8)
  139.         Sound.play_cursor
  140.         @index += members.size - 1
  141.         @index %= members.size
  142.       end
  143.     end
  144.     if battler
  145.       self.x = battler.fscreen_x + add_x
  146.       self.y = battler.fscreen_y
  147.     end
  148.   end
  149.   #--------------------------------------------------------------------------
  150.   # ● 刷新选择敌人
  151.   #--------------------------------------------------------------------------
  152.   def update_enemy
  153.     if @select_all
  154.       members.size.times do
  155.         @index += 1
  156.         @index %= members.size
  157.         break if not battler.hidden?
  158.       end
  159.     else
  160.       members.size.times do
  161.         break if not battler.hidden?
  162.         @index += 1
  163.         @index %= members.size
  164.       end
  165.       old_index = @index
  166.       for i in 0..members.size
  167.         @index = i
  168.         if @index == members.size
  169.           @index = old_index
  170.           break
  171.         end
  172.         next if battler.hidden?
  173.         self_x = battler.screen_x + add_x
  174.         self_y = battler.screen_y
  175.       end
  176.       if Input.repeat?(2)
  177.         Sound.play_cursor
  178.         members.size.times do
  179.           @index += 1
  180.           @index %= members.size
  181.           break if not battler.hidden?
  182.         end
  183.       end
  184.       if Input.repeat?(8)
  185.         Sound.play_cursor
  186.         members.size.times do
  187.           @index += members.size - 1
  188.           @index %= members.size
  189.           break if not battler.hidden?
  190.         end
  191.       end
  192.     end
  193.     if battler != nil
  194.       self.x = battler.screen_x + add_x
  195.       self.y = battler.screen_y
  196.     end
  197.   end
  198. end
  199. #==============================================================================
  200. # ■ Scene_Battle
  201. #==============================================================================
  202.  
  203. class Scene_Battle < Scene_Base
  204.   #--------------------------------------------------------------------------
  205.   # ● 结束处理
  206.   #--------------------------------------------------------------------------
  207.   alias hzhj_terminate_battle_arrow terminate
  208.   def terminate
  209.     @actor_arrow.dispose
  210.     @enemy_arrow.dispose
  211.     hzhj_terminate_battle_arrow
  212.   end
  213.   #--------------------------------------------------------------------------
  214.   # ● 刷新所有窗口
  215.   #--------------------------------------------------------------------------
  216.   alias hzhj_update_all_windows_battle_arrow update_all_windows
  217.   def update_all_windows
  218.     hzhj_update_all_windows_battle_arrow
  219.     @actor_arrow.update
  220.     @enemy_arrow.update
  221.   end
  222.   #--------------------------------------------------------------------------
  223.   # ● 生成角色窗口
  224.   #--------------------------------------------------------------------------
  225.   def create_actor_window
  226.     viewport = @viewport #@spriteset.viewport1
  227.     @actor_arrow = Sprite_BattleArrow.new(:actor, viewport, false)
  228.     @actor_arrow.on_ok_method = method(:on_actor_ok)
  229.     @actor_arrow.on_cancel_method = method(:on_actor_cancel)
  230.   end
  231.   #--------------------------------------------------------------------------
  232.   # ● 生成敌人窗口
  233.   #--------------------------------------------------------------------------
  234.   def create_enemy_window
  235.     viewport = @viewport #@spriteset.viewport1
  236.     @enemy_arrow = Sprite_BattleArrow.new(:enemy, viewport, false)
  237.     @enemy_arrow.on_ok_method = method(:on_enemy_ok)
  238.     @enemy_arrow.on_cancel_method = method(:on_enemy_cancel)
  239.   end
  240.   #--------------------------------------------------------------------------
  241.   # ● 开始选择队友
  242.   #--------------------------------------------------------------------------
  243.   def select_actor_selection(can_select_all = false)
  244.     @actor_arrow.setup(can_select_all)
  245.     @skill_window.hide
  246.     @item_window.hide
  247.   end
  248.   #--------------------------------------------------------------------------
  249.   # ● 角色“确定”
  250.   #--------------------------------------------------------------------------
  251.   def on_actor_ok
  252.     target_index = @actor_arrow.select_all ? 65535 : @actor_arrow.index
  253.     BattleManager.actor.input.target_index = target_index
  254.     @skill_window.hide
  255.     @item_window.hide
  256.     @actor_arrow.visible = false
  257.     next_command
  258.   end
  259.   #--------------------------------------------------------------------------
  260.   # ● 角色“取消”
  261.   #--------------------------------------------------------------------------
  262.   def on_actor_cancel
  263.     case @actor_command_window.current_symbol
  264.     when :skill
  265.       @skill_window.show.activate
  266.     when :item
  267.       @item_window.show.activate
  268.     end
  269.     @actor_arrow.visible = false
  270.   end
  271.   #--------------------------------------------------------------------------
  272.   # ● 开始选择敌人
  273.   #--------------------------------------------------------------------------
  274.   def select_enemy_selection(can_select_all = false)
  275.     @enemy_arrow.setup(can_select_all)
  276. #    @actor_command_window.hide
  277.     @skill_window.hide
  278.     @item_window.hide
  279.   end
  280.   #--------------------------------------------------------------------------
  281.   # ● 敌人“确定”
  282.   #--------------------------------------------------------------------------
  283.   def on_enemy_ok
  284.     target_index = @enemy_arrow.select_all ? 65535 : @enemy_arrow.index
  285.     BattleManager.actor.input.target_index = target_index
  286.     @skill_window.hide
  287.     @item_window.hide
  288.     @enemy_arrow.visible = false
  289.     next_command
  290.   end
  291.   #--------------------------------------------------------------------------
  292.   # ● 敌人“取消”
  293.   #--------------------------------------------------------------------------
  294.   def on_enemy_cancel
  295.     case @actor_command_window.current_symbol
  296.     when :attack
  297.       @actor_command_window.show.activate
  298.     when :skill
  299.       @skill_window.show.activate
  300.     when :status
  301.       @actor_command_window.show.activate
  302.     when :item
  303.       @item_window.show.activate
  304.     end
  305.     @enemy_arrow.visible = false
  306.   end
  307. end

作者: 小汰酱    时间: 2017-4-17 15:55
还尝试了站里的MOG那个指针脚本,然而那个脚本用起来很奇怪,放技能用物品选目标的时候窗口不会关闭,光标都被窗口挡在后面了。
作者: guoxiaomi    时间: 2017-4-17 18:40
把130,131行的fscreen中的f去掉。
作者: 小汰酱    时间: 2017-4-17 19:56
guoxiaomi 发表于 2017-4-17 18:40
把130,131行的fscreen中的f去掉。

还是一样,提示130行blablabla。。。。
作者: 魔法丶小肉包    时间: 2017-4-17 20:35
虽然不知道原本的效果是如何,总之,只能强行定义一下fscreen_x和fscreen_y了
把这个作为插件脚本放在原脚本的下方
RUBY 代码复制
  1. class Game_Actor < Game_Battler
  2.   attr_accessor :fscreen_x
  3.   attr_accessor :fscreen_y
  4.   def initialize(actor_id)
  5.     super()
  6.     setup(actor_id)
  7.     @last_skill = Game_BaseItem.new
  8.     @fscreen_x = 0
  9.     @fscreen_y = 0
  10.   end
  11. end
  12. class Game_Party < Game_Unit
  13.   def setup_battle_test_members
  14.     $data_system.test_battlers.each do |battler|
  15.       actor = $game_actors[battler.actor_id]
  16.       actor.change_level(battler.level, false)
  17.       actor.init_equips(battler.equips)
  18.       actor.recover_all
  19.       actor.fscreen_x = 100
  20.       actor.fscreen_y = 276+battler.actor_id*24
  21.       p battler.actor_id
  22.       add_actor(actor.id)
  23.     end
  24.   end
  25. end

作者: guoxiaomi    时间: 2017-4-18 01:25
小汰酱 发表于 2017-4-17 19:56
还是一样,提示130行blablabla。。。。

别偷懒啊,提示什么发上来啊。

以及后面的都是 screen_x,就这里是 fscreen_x,很可能是笔误
作者: 小汰酱    时间: 2017-4-18 13:23
魔法丶小肉包 发表于 2017-4-17 20:35
虽然不知道原本的效果是如何,总之,只能强行定义一下fscreen_x和fscreen_y了
把这个作为插件脚本放在原脚 ...

{:2_253:}不会报错了,感谢,那么另外一个问题:已经死了的敌人还是能被指针选到,有没有办法解决呢?
作者: 魔法丶小肉包    时间: 2017-4-18 16:09
小汰酱 发表于 2017-4-18 13:23
不会报错了,感谢,那么另外一个问题:已经死了的敌人还是能被指针选到,有没有办法解决呢? ...

同样,作为插件脚本在此脚本下方使用
RUBY 代码复制
  1. class Sprite_BattleArrow < Sprite
  2.   def update_enemy
  3.     if @select_all
  4.       members.size.times do
  5.         @index += 1
  6.         @index %= members.size
  7.         break if not battler.hidden? || battler.dead?
  8.       end
  9.     else
  10.       members.size.times do
  11.         break if not battler.hidden? || battler.dead?
  12.         @index += 1
  13.         @index %= members.size
  14.       end
  15.       old_index = @index
  16.       for i in 0..members.size
  17.         @index = i
  18.         if @index == members.size
  19.           @index = old_index
  20.           break
  21.         end
  22.         next if battler.hidden? || battler.dead?
  23.         self_x = battler.screen_x + add_x
  24.         self_y = battler.screen_y
  25.       end
  26.       if Input.repeat?(2)
  27.         Sound.play_cursor
  28.         members.size.times do
  29.           @index += 1
  30.           @index %= members.size
  31.           break if not battler.hidden? || battler.dead?
  32.         end
  33.       end
  34.       if Input.repeat?(8)
  35.         Sound.play_cursor
  36.         members.size.times do
  37.           @index += members.size - 1
  38.           @index %= members.size
  39.           break if not battler.hidden? || battler.dead?
  40.         end
  41.       end
  42.     end
  43.     if battler != nil
  44.       self.x = battler.screen_x + add_x
  45.       self.y = battler.screen_y
  46.     end
  47.   end
  48. end

作者: 小汰酱    时间: 2017-4-18 16:35
魔法丶小肉包 发表于 2017-4-18 16:09
同样,作为插件脚本在此脚本下方使用
class Sprite_BattleArrow < Sprite
  def update_enemy

可以了!万分感谢!!




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