查看完整版本: [-- [原创]遇敌变奏曲(随机+自定+破限+区域) --]

幻想森林论坛 -> RM思路探讨 -> [原创]遇敌变奏曲(随机+自定+破限+区域) [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

美兽 2007-06-19 20:01

[原创]遇敌变奏曲(随机+自定+破限+区域)

范例与相关截图请参见这里
http://hi.baidu.com/lingboaa/blog/item/cab2f3f27bca9711b17ec5ab.html

一:怪物单体随机出现。

复制代码
  1. 例如队伍中3个怪物,每个怪物随机出现,但至少出现一个。
    修改Game_Troop类的setup方法:
    def setup(troop_id)
          @enemies = []
          troop = $data_troops[troop_id]
          #存储必定出现的怪物序号(为保证至少一个)
          kind = rand(troop.members.size) 
          for i in 0...troop.members.size
            enemy = $data_enemies[troop.members[i].enemy_id]
            #若不是必定出现的怪物,并且rand(2) == 0(50%)则跳过循环,该怪不出现
            if (i != kind) and (rand(2) == 0)
              next
            end 
            if enemy != nil
              @enemies.push(Game_Enemy.new(troop_id, i))
            end
          end
        end


二:怪物种族群组随机出现。

复制代码
  1. 相同怪物作为一组,相对每组,每个怪物随机,但至少出现一次。
    例如出现2只A和2只B,可能2只A和2只B一起出现,或者出现1只A和2只B,或者2只A和1只B,或者1只A和1只B。
    依然修改Game_Troop类的setup方法:
    def setup(troop_id)
          # 由敌人序列的设置来确定队伍的设置
          @enemies = []
          troop = $data_troops[troop_id]
          #存储已出现过的ID(为保证每组至少一个)
          kinds = []
          for i in 0...troop.members.size
            enemy = $data_enemies[troop.members[i].enemy_id]
            #代入成员的怪物ID
            id = troop.members[i].enemy_id
            #若该怪物已出现过并且rand(2) == 0(50%)则跳过循环,该怪不出现
            #若该怪物未出现过,则代入存储ID的数组用于下次判断
            kinds.include?(id) ? (next if rand(2) == 0) : (kinds.push id) 
            if enemy != nil
              @enemies.push(Game_Enemy.new(troop_id, i))
            end
          end
        end


三:一+二

复制代码
  1. 为了不与默认方式冲突,并且使用灵活,将一、二两种随机方式与默认整合,利用变量区分,具体如下:
        def setup(troop_id)
          # 设置敌人的序列来确定队伍情况
          @enemies = []
          troop = $data_troops[troop_id]
          kinds = []
          kind = rand(troop.members.size)
          for i in 0...troop.members.size
            enemy = $data_enemies[troop.members[i].enemy_id]
            case $game_variables[10]
            when 1      # 单体随机
                if (i != kind) and (rand(2) == 0)
                  next
                end
            when 2      # 组合随机
                id = troop.members[i].enemy_id
                kinds.include?(id) ? (next if rand(2) == 0) : (kinds.push id)         
            end 
            if enemy != nil
              @enemies.push(Game_Enemy.new(troop_id, i))
            end
          end
        end


四:自定义遇敌

复制代码
  1. 专门建立个方法设置敌人组合,如下:

    module District_Enemy
     
          def self.setup(id,members)
              #新建队伍,
              $data_troops[id] = RPG::Troop.new
              #设定队伍基本属性
              $data_troops[id].id = id   
              $data_troops[id].name = 'orz'
              #为新队伍添加成员
              for i in members
                enemy = RPG::Troop::Member.new
                enemy.enemy_id = i[0]
                enemy.x = i[1]
                enemy.y = i[2]
                $data_troops[id].members.push enemy         
              end
              #触发战斗
              $game_temp.battle_calling = true
              $game_temp.battle_troop_id = id
              $game_temp.battle_can_escape = true
              $game_temp.battle_can_lose = false
              return
          end
     
    end 

    如此可依靠事件的“脚本”中输入
    District_Enemy.setup(队伍ID,[[A敌人ID,A敌人x,A敌人y],[B敌人ID,B敌人x,B敌人y],…………])
    的方法设置敌人组合,也可事先将敌人组合在RGSS书写完成,通过全局数组插入,其中队伍ID尽量设定数据库不存在的ID,例如1000,2000之类。
    这个方法最大的意义是可以突破数据库最大成员8的限制,效果如图,具体见范例。




五:区域遇敌,

复制代码
  1. 使用脚本可大大提升效率。

    基础设定:
    其中DISTRICT常量为对应地图的遇敌区域与种类,设定规则为:
    地图ID => [[区域A左上X,区域A左上Y,区域A右下X,区域A右下Y,[敌人队伍A的ID,…]],[区域B左上X,区域B左上Y,区域B右下X,区域B右下Y,[敌人队伍A的ID,…]]……]
    例如想一号地图的0,0到5,5的位置遇到1,2号敌人队伍,4,4到10,10的位置遇到3,4号敌人队伍,
    则在DISTRICT{}里添加
          1 => [[0,0,5,5,[1,2]],[4,4,10,10,[3,4]]]
    注意,要保证添加的区域可构成矩形,例如-10,20i之类的就不要尝试了——

    module District_Enemy
     
          #允许区域遇敌开关ID
          ALLOW_ID = 10

          #区域遇敌开启时,区域外部分是否遵循默认遇敌ID
          SYSTEM_ID = 11 
     
          #设置对应地图的遇敌区域与种类
          DISTRICT = {
          1 => [[0,0,5,5,[1,2]],[4,4,10,10,[3,4]]],
          2 => [[2,7,9,9,[6]],[4,4,10,10,[8]]]
          }
     
          def self.catch(id,x,y)
              data = DISTRICT[id]
              return nil if data.nil?
              temp = Array.new
              for i in data
                if x.between?(i[0], i[2]) and y.between?(i[1], i[3])
                    temp.concat(i[4])
                end
              end
              return false if temp.empty?
              return temp
          end 
     
    end 

    基础设定完毕后,将其插入遇敌部分:
    见Scene_Map类的
              # 确定队伍
              n = rand($game_map.encounter_list.size)
              troop_id = $game_map.encounter_list[n]
    将其改写为
              # 确定队伍
              # 获得当前地图区域遇敌的相关资料
              sum = District_Enemy.catch($game_map.map_id,$game_player.x,$game_player.y)
              # 若当前地图未设置过区域,或者区域遇敌未打开,则执行默认的遇敌方式
              if sum == nil or !$game_switches[District_Enemy::ALLOW_ID] 
                  n = rand($game_map.encounter_list.size)
                  troop_id = $game_map.encounter_list[n]         
              else
                  # 反之若角色不在区域内 
                  if sum == false
                    # 区域外遇敌开关开启,则执行默认遇敌方式
                    if $game_switches[District_Enemy::SYSTEM_ID]
                        n = rand($game_map.encounter_list.size)
                        troop_id = $game_map.encounter_list[n]
                    else
                        # 反之,不遇敌 
                        troop_id = -100
                    end         
                  else
                    # 若在区域内,遭遇对应区域设置的敌人队伍
                    n = rand(sum.size)       
                    troop_id = sum[n]
                  end
              end


好人卡的神话 2007-06-19 20:10
这个邪恶物也出现了。。。[s:4]不过自定义的东西较多,可能会有些人嫌麻烦。。。 [s:5]

美兽 2007-06-19 20:48
引用
引用第1楼好人卡的神话于2007-06-19 20:10发表的  :
这个邪恶物也出现了。。。不过自定义的东西较多,可能会有些人嫌麻烦。。。


感觉分区原本用事件会更多麻烦,

多点也没办法了,毕竟不清楚作者要怎么分——


查看完整版本: [-- [原创]遇敌变奏曲(随机+自定+破限+区域) --] [-- top --]



Powered by PHPWind v7.5 SP3 Code ©2003-2010 PHPWind
Time 0.152022 second(s),query:2 Gzip enabled

You can contact us