Project1

标题: 如何调整作用范围为敌我均可? [打印本页]

作者: 奶油Da蛋糕    时间: 2009-8-30 18:26
标题: 如何调整作用范围为敌我均可?
本帖最后由 奶油Da蛋糕 于 2009-8-30 19:51 编辑

如何调整作用范围为敌我均可?此技能既可以对敌方单体使用,又可以对我方单体使用。
作者: 认真的学    时间: 2009-8-30 19:04
1、设置两个事件,表明【我方用】与【敌方用】
2、(这个没尝试过哈)公共事件 文章:你想对我方发动技能还是敌方发动技能?然后选择项,然后就强制动作......
作者: 奶油Da蛋糕    时间: 2009-8-30 19:14
  1.       # 效果范围是敌单体的情况下
  2.       if @skill.scope == 1
  3.         # 开始选择敌人
  4.         start_enemy_select
  5.       # 效果范围是我方单体的情况下
  6.       elsif @skill.scope == 3 or @skill.scope == 5
  7.         # 开始选择角色
  8.         start_actor_select
  9.     # 效果范围是敌我均可的情况下
  10.          elsif @skill.scope == 8
  11.             start_ae_select
  12.       # 效果范围不是单体的情况下
  13.       else
  14.         # 选择特技结束
  15.         end_skill_select
  16.         # 转到下一位角色的指令输入
  17.         phase3_next_actor
  18.       end
复制代码
但是不知道要用什么方法给@skill.scope 赋值 8
作者: 奶油Da蛋糕    时间: 2009-8-30 19:21
本帖最后由 奶油Da蛋糕 于 2009-8-30 19:23 编辑

比较难做。start_ae_select里面还要打开一个Arrow类,这个Arrow类又要重新写,并且$game_troop.enemies[@index]与$game_party.actors[@index]是两个毫不相干的变量,根本没法儿关联起来。
作者: 认真的学    时间: 2009-8-30 19:21
那个,我随便瞎猜的,用一个=号试试看......
貌似=是赋值号,==是等于号......
作者: 奶油Da蛋糕    时间: 2009-8-30 19:26
那个,我随便瞎猜的,用一个=号试试看......
貌似=是赋值号,==是等于号......
认真的学 发表于 2009-8-30 19:21


关键是在哪个地方赋值?直接用公共事件写@skill.scope = 8的话可能不一定会生效。
作者: 认真的学    时间: 2009-8-30 19:29
那个,我是脚本盲......不要问我.......不过如果公共事件的话貌似可以试一试......
作者: 奶油Da蛋糕    时间: 2009-8-30 19:30
仔细看完了。

class Arrow_AE < Arrow_Base
这个类是我的能力写不出来的。

第一个问题是不知道哪个变量作为index,难道是$game_troop??
我觉得我应该先生成$game_troop.enemies[@index],然后
左右加减@index,上下键就切换为$game_party.actors[@index],同样左右键加减@index。
不过即使写完了,也没有鼠标判定。
貌似鼠标的判定是根据类来的(因为上次我删除了一个系统里的窗口类,结果鼠标有报错)。
所以鼠标的判定又要重新写。
作者: 奶油Da蛋糕    时间: 2009-8-30 19:45
OK,鼠标看完了,鼠标里的地方和我方的鼠标控制也不过只有刚刚那个变量不同罢了。
其实,按照我刚才那种方法,上下键切换变量,左右键增减@index,如果细心点,说不定我还是可以搞定的。
但是,鼠标却有难题。鼠标最不好搞定的还是判定什么情况下用$game_troop.enemies,什么情况下用$game_party.actors。我在想,如果没有一个变量包含这两个变量的值的话,就很难写鼠标的了。
  1. class Arrow_Actor
  2. if @self_alias == nil
  3.    alias self_update update
  4.    @self_alias = true
  5. end
  6. def update
  7.    mouse_x, mouse_y = Mouse.get_mouse_pos
  8.    idx = 0
  9.    for i in $game_party.actors do
  10.      if i.exist?
  11.        top_x = i.screen_x - self.ox
  12.        top_y = i.screen_y - self.oy
  13.        bottom_x = top_x + self.src_rect.width
  14.        bottom_y = top_y + self.src_rect.height
  15.        if (mouse_x > top_x - $角色选框扩大) and (mouse_y > top_y - $角色选框扩大) and
  16.           (mouse_x < bottom_x + $角色选框扩大) and (mouse_y < bottom_y + $角色选框扩大)
  17.          if @index != idx
  18.            $game_system.se_play($data_system.cursor_se)
  19.            @index = idx
  20.          end
  21.        end
  22.      end
  23.      idx += 1
  24.    end
  25.    self_update
  26. end
  27. end
复制代码

作者: 奶油Da蛋糕    时间: 2009-8-30 20:25
  1. class Arrow_AE < Arrow_Base
  2.   #--------------------------------------------------------------------------
  3.   # ● 获取光标指向的角色
  4.   #--------------------------------------------------------------------------
  5.   def actor
  6.     return $game_party.actors[@index]
  7.   end
  8.   def enemy
  9.     return $game_troop.enemies[@index]
  10.   end
  11.   #--------------------------------------------------------------------------
  12.   # ● 刷新画面
  13.   #--------------------------------------------------------------------------
  14.   def update
  15.     super
  16.     # 如果是选择角色
  17.     if @actor
  18.       # 光标右
  19.     if Input.repeat?(Input::RIGHT)
  20.       $game_system.se_play($data_system.cursor_se)
  21.       @index += 1
  22.       @index %= $game_party.actors.size
  23.     end
  24.     # 光标左
  25.     if Input.repeat?(Input::LEFT)
  26.       $game_system.se_play($data_system.cursor_se)
  27.       @index += $game_party.actors.size - 1
  28.       @index %= $game_party.actors.size
  29.     end
  30.     # 光标上
  31.     if Input.repeat?(Input::UP)
  32.       $game_system.se_play($data_system.cursor_se)
  33.       @actor = false
  34.     end   
  35.     # 设置活动块坐标
  36.     if self.actor != nil
  37.       self.x = self.actor.s_x - 420
  38.       self.y = self.actor.s_y - 50
  39.     end
  40.     else
  41.     # 如果指向不存在的敌人就离开
  42.     $game_troop.enemies.size.times do
  43.       break if self.enemy.exist?
  44.       @index += 1
  45.       @index %= $game_troop.enemies.size
  46.     end
  47.     # 光标右
  48.     if Input.repeat?(Input::RIGHT)
  49.       $game_system.se_play($data_system.cursor_se)
  50.       $game_troop.enemies.size.times do
  51.         @index += 1
  52.         @index %= $game_troop.enemies.size
  53.         break if self.enemy.exist?
  54.       end
  55.     end
  56.     # 光标左
  57.     if Input.repeat?(Input::LEFT)
  58.       $game_system.se_play($data_system.cursor_se)
  59.       $game_troop.enemies.size.times do
  60.         @index += $game_troop.enemies.size - 1
  61.         @index %= $game_troop.enemies.size
  62.         break if self.enemy.exist?
  63.       end
  64.     end   
  65.     # 光标下
  66.     if Input.repeat?(Input::DOWN)
  67.       $game_system.se_play($data_system.cursor_se)
  68.       @actor = true
  69.     end  
  70.   end  
  71.   end
  72.   #--------------------------------------------------------------------------
  73.   # ● 刷新帮助文本
  74.   #--------------------------------------------------------------------------
  75.   def update_help
  76.     if @actor
  77.     # 帮助窗口显示角色的状态
  78.     @help_window.set_actor(self.actor)
  79.   else
  80.     @help_window.set_enemy(self.enemy)
  81.     end
  82.   end
  83. end
复制代码
  1. def start_ae_select
  2.     # 生成角色箭头
  3.     @actor_arrow = Arrow_AE.new(@spriteset.viewport2)
  4.     @actor_arrow.index = @actor_index
  5.     # 关联帮助窗口
  6.     @actor_arrow.help_window = @help_window
  7.     # 无效化角色指令窗口
  8.    # @actor_command_window.active = false
  9.    # @actor_command_window.visible = false
  10.    
  11. #-------------------宠------------------------   
  12.     # 无效化角色指令窗口
  13.     @actor_command_window.active = false
  14.     @actor_command_window.visible = false
  15.     @actor2_command_window.active = false
  16.     @actor2_command_window.visible = false  
  17. #-------------------宠------------------------

  18. end
复制代码
  1.   def end_ae_select
  2.     # 释放角色箭头
  3.    # @actor_arrow.dispose
  4.    # @actor_arrow = nil
  5.   
  6. #-------------------------宠--------------------------
  7.     # 释放角色箭头
  8.     @actor_arrow.dispose
  9.     @actor_arrow = nil
  10.     if @active_battler.id < 20 and @active_battler.current_action.kind == 6
  11.       @actor_command_window.active = true
  12.       @actor_command_window.visible = true
  13.       @help_window.visible = false
  14.     elsif @active_battler.current_action.kind == 6
  15.       @actor2_command_window.active = true
  16.       @actor2_command_window.visible = true
  17.       @help_window.visible = false
  18.     end   
  19. #-------------------------宠--------------------------

  20. end
复制代码
OK,理论上没问题,实际上可能会有问题。
特别是这个,@actor_arrow = Arrow_AE.new(@spriteset.viewport2)
不知道viewport2这个参数的意义,究竟是用viewport1还是viewport2呢?
鼠标还在构思中。。。。。
作者: 牛肉面    时间: 2009-8-30 20:44
提示一下,改脚本不要删除啊,可以打上注释,方便以后修改
作者: 奶油Da蛋糕    时间: 2009-8-31 09:43
=.=,我发现我写的东西根本没有生效。
我纳闷了= =
看来这个问题不是我的能力解决的了的了
还是交给高手好了
我负责伸手
作者: 「旅」    时间: 2009-8-31 11:38
  1. class Scene_Battle
  2.   All_全范围技能 = [1,13]
  3.   alias lv13_update_phase3_enemy_select update_phase3_enemy_select
  4.   alias lv13_update_phase3_actor_select update_phase3_actor_select
  5.   def update_phase3_enemy_select
  6.     lv13_update_phase3_enemy_select
  7.     return if Input.trigger?(Input::C) or  Input.trigger?(Input::B)
  8.     if @skill.scope == 1 and All_全范围技能.include?(@skill.id) and Input.trigger?(Input::DOWN)
  9.       @enemy_arrow.dispose
  10.       @enemy_arrow = nil
  11.       @target_battlers = []
  12.       @skill.scope = 3
  13.       @actor_arrow = Arrow_Actor.new(@spriteset.viewport1)
  14.       @actor_arrow.help_window = @help_windowend
  15.     end
  16.   end
  17.   def update_phase3_actor_select
  18.     lv13_update_phase3_actor_select
  19.     return if Input.trigger?(Input::C) or  Input.trigger?(Input::B)
  20.     if @skill.scope == 3 and All_全范围技能.include?(@skill.id) and Input.trigger?(Input::UP)
  21.       @actor_arrow.dispose
  22.       @actor_arrow = nil
  23.       @target_battlers = []
  24.       @skill.scope = 1
  25.       @enemy_arrow = Arrow_Enemy.new(@spriteset.viewport1)
  26.       @enemy_arrow.help_window = @help_window
  27.     end
  28.   end
  29. end
复制代码
自己写了个,效果都达到了~~

可是……为什么第二次的主角光标会不见了呢……
作者: 柳飛鷹    时间: 2009-8-31 11:53
主站的23种公共事件的战斗特效……
有全域化的功能
作者: 奶油Da蛋糕    时间: 2009-8-31 12:34
class Scene_Battle
  All_全范围技能 = [1,13]
  alias lv13_update_phase3_enemy_select update_phase3_enemy_select
  alias lv13_update_phase3_actor_select update_phase3_actor_select
  def update_phase3_e ...
「旅」 发表于 2009-8-31 11:38


旅,辛苦啦!
作者: 奶油Da蛋糕    时间: 2009-8-31 13:05
class Scene_Battle
  All_全范围技能 = [1,13]
  alias lv13_update_phase3_enemy_select update_phase3_enemy_select
  alias lv13_update_phase3_actor_select update_phase3_actor_select
  def update_phase3_e ...
「旅」 发表于 2009-8-31 11:38


看明白了大概意思,就是scope可以按上下键切换成1或3,从而改变范围。
这种思路比我原来的思路更好。不用重新定义一个scope繁琐。
作者: IamI    时间: 2009-8-31 13:16
  1. class Scene_Battle
  2.   All_全范围技能 = [1,13]
  3.   alias lv13_update_phase3_enemy_select update_phase3_enemy_select
  4.   alias lv13_update_phase3_actor_select update_phase3_actor_select
  5.   def update_phase3_enemy_select
  6.     lv13_update_phase3_enemy_select
  7.     return if Input.trigger?(Input::C) or  Input.trigger?(Input::B)
  8.     if @skill != nil
  9.     if @skill.scope == 1 and All_全范围技能.include?(@skill.id) and Input.trigger?(Input::DOWN)
  10.       $game_system.se_play($data_system.cursor_se)
  11.       @enemy_arrow.dispose
  12.       @enemy_arrow = nil
  13.       @target_battlers = []
  14.       @skill.scope = 3
  15.       @actor_arrow = Arrow_Actor.new(@spriteset.viewport2)
  16.       @actor_arrow.help_window = @help_window
  17.     end
  18.     end
  19.   end
  20.   def update_phase3_actor_select
  21.     lv13_update_phase3_actor_select
  22.     return if Input.trigger?(Input::C) or Input.trigger?(Input::B)
  23.     if @skill != nil
  24.     if @skill.scope == 3 and All_全范围技能.include?(@skill.id) and Input.trigger?(Input::UP)
  25.       $game_system.se_play($data_system.cursor_se)
  26.       @actor_arrow.dispose
  27.       @actor_arrow = nil
  28.       @target_battlers = []
  29.       @skill.scope = 1
  30.       @enemy_arrow = Arrow_Enemy.new(@spriteset.viewport1)
  31.       @enemy_arrow.help_window = @help_window
  32.     end
  33.     end
  34.   end
  35. end
复制代码
修正3个诡异的Bug,顺便,Actor_Arrow征用的是Spriteset2,有鉴于此,无条件殴打旅= =
作者: 奶油Da蛋糕    时间: 2009-8-31 14:10
  1. class Arrow_Enemy
  2. if @self_alias == nil
  3.    alias self_update update
  4.    @self_alias = true
  5. end
  6. def update
  7.    mouse_x, mouse_y = Mouse.get_mouse_pos
  8. if mouse_y >= (0) and mouse_y < (480/2)
  9.    idx = 0
  10.    for i in $game_troop.enemies do
  11.      if i.exist?
  12.        top_x = i.screen_x - self.ox
  13.        top_y = i.screen_y - self.oy
  14.        bottom_x = top_x + self.src_rect.width
  15.        bottom_y = top_y + self.src_rect.height
  16.        if (mouse_x > top_x - $敌人选框扩大) and (mouse_y > top_y - $敌人选框扩大) and
  17.           (mouse_x < bottom_x + $敌人选框扩大) and (mouse_y < bottom_y + $敌人选框扩大)
  18.          if @index != idx
  19.            $game_system.se_play($data_system.cursor_se)
  20.            @index = idx
  21.          end
  22.        end
  23.      end
  24.      idx += 1
  25.    end
  26.    self_update
  27. elsif $shubiao
  28.    idx = 0
  29. for i in $game_party.actors do
  30.      if i.exist?
  31.        top_x = i.screen_x - self.ox
  32.        top_y = i.screen_y - self.oy
  33.        bottom_x = top_x + self.src_rect.width
  34.        bottom_y = top_y + self.src_rect.height
  35.        if (mouse_x > top_x - $角色选框扩大) and (mouse_y > top_y - $角色选框扩大) and
  36.           (mouse_x < bottom_x + $角色选框扩大) and (mouse_y < bottom_y + $角色选框扩大)
  37.          if @index != idx
  38.            $game_system.se_play($data_system.cursor_se)
  39.            @index = idx
  40.          end
  41.        end
  42.      end
  43.      idx += 1
  44.    end
  45.    self_update
  46.     end   
  47. end#结束DEF
  48. end#结束CLASS

  49. class Arrow_Actor
  50. if @self_alias == nil
  51.    alias self_update update
  52.    @self_alias = true
  53. end
  54. def update
  55.    mouse_x, mouse_y = Mouse.get_mouse_pos
  56.    if mouse_y > (480/2) and mouse_y <= (480)
  57.    idx = 0
  58.    for i in $game_party.actors do
  59.      if i.exist?
  60.        top_x = i.screen_x - self.ox
  61.        top_y = i.screen_y - self.oy
  62.        bottom_x = top_x + self.src_rect.width
  63.        bottom_y = top_y + self.src_rect.height
  64.        if (mouse_x > top_x - $角色选框扩大) and (mouse_y > top_y - $角色选框扩大) and
  65.           (mouse_x < bottom_x + $角色选框扩大) and (mouse_y < bottom_y + $角色选框扩大)
  66.          if @index != idx
  67.            $game_system.se_play($data_system.cursor_se)
  68.            @index = idx
  69.          end
  70.        end
  71.      end
  72.      idx += 1
  73.    end
  74.    self_update
  75. elsif $shubiao
  76.    idx = 0
  77.    for i in $game_troop.enemies do
  78.      if i.exist?
  79.        top_x = i.screen_x - self.ox
  80.        top_y = i.screen_y - self.oy
  81.        bottom_x = top_x + self.src_rect.width
  82.        bottom_y = top_y + self.src_rect.height
  83.        if (mouse_x > top_x - $敌人选框扩大) and (mouse_y > top_y - $敌人选框扩大) and
  84.           (mouse_x < bottom_x + $敌人选框扩大) and (mouse_y < bottom_y + $敌人选框扩大)
  85.          if @index != idx
  86.            $game_system.se_play($data_system.cursor_se)
  87.            @index = idx
  88.          end
  89.        end
  90.      end
  91.      idx += 1
  92.    end
  93.    self_update
  94.    end
  95. end
  96. end
复制代码
OK,鼠标也根据旅的思路完成了,加了一下鼠标的Y的判定,如果在屏幕上半方就调用敌人的判定,如果鼠标在屏幕下班方并且$shubiao == true 的话调用我方目标的判定。
不过,貌似没生效=.=....其因不解....

另外,上面那段为了迎合鼠标的判定,加了一句
if All_全范围技能.include?(@skill.id)
$shubiao = true
end




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