幻想森林

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2819|回复: 2

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

[复制链接]

79

主题

617

帖子

6150

积分

⑦老手

暗夜下可怜人

积分
6150
发表于 2007-6-19 20:01:26 | 显示全部楼层 |阅读模式
范例与相关截图请参见这里
http://hi.baidu.com/lingboaa/blog/item/cab2f3f27bca9711b17ec5ab.html

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

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

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

四:自定义遇敌
  1. 专门建立个方法设置敌人组合,如下:
  2. module District_Enemy
  3.   
  4.       def self.setup(id,members)
  5.           #新建队伍,
  6.           $data_troops[id] = RPG::Troop.new
  7.           #设定队伍基本属性
  8.           $data_troops[id].id = id     
  9.           $data_troops[id].name = 'orz'
  10.           #为新队伍添加成员
  11.           for i in members
  12.              enemy = RPG::Troop::Member.new
  13.              enemy.enemy_id = i[0]
  14.              enemy.x = i[1]
  15.              enemy.y = i[2]
  16.              $data_troops[id].members.push enemy         
  17.           end
  18.           #触发战斗
  19.           $game_temp.battle_calling = true
  20.           $game_temp.battle_troop_id = id
  21.           $game_temp.battle_can_escape = true
  22.           $game_temp.battle_can_lose = false
  23.           return
  24.       end
  25.    
  26. end  
  27. 如此可依靠事件的“脚本”中输入
  28. District_Enemy.setup(队伍ID,[[A敌人ID,A敌人x,A敌人y],[B敌人ID,B敌人x,B敌人y],…………])
  29. 的方法设置敌人组合,也可事先将敌人组合在RGSS书写完成,通过全局数组插入,其中队伍ID尽量设定数据库不存在的ID,例如1000,2000之类。
  30. 这个方法最大的意义是可以突破数据库最大成员8的限制,效果如图,具体见范例。
复制代码



五:区域遇敌,
  1. 使用脚本可大大提升效率。
  2. 基础设定:
  3. 其中DISTRICT常量为对应地图的遇敌区域与种类,设定规则为:
  4. 地图ID => [[区域A左上X,区域A左上Y,区域A右下X,区域A右下Y,[敌人队伍A的ID,…]],[区域B左上X,区域B左上Y,区域B右下X,区域B右下Y,[敌人队伍A的ID,…]]……]
  5. 例如想一号地图的0,0到5,5的位置遇到1,2号敌人队伍,4,4到10,10的位置遇到3,4号敌人队伍,
  6. 则在DISTRICT{}里添加
  7.       1 => [[0,0,5,5,[1,2]],[4,4,10,10,[3,4]]]
  8. 注意,要保证添加的区域可构成矩形,例如-10,20i之类的就不要尝试了——
  9. module District_Enemy
  10.   
  11.       #允许区域遇敌开关ID
  12.       ALLOW_ID = 10
  13.       #区域遇敌开启时,区域外部分是否遵循默认遇敌ID
  14.       SYSTEM_ID = 11  
  15.    
  16.       #设置对应地图的遇敌区域与种类
  17.       DISTRICT = {
  18.       1 => [[0,0,5,5,[1,2]],[4,4,10,10,[3,4]]],
  19.       2 => [[2,7,9,9,[6]],[4,4,10,10,[8]]]
  20.       }
  21.   
  22.       def self.catch(id,x,y)
  23.           data = DISTRICT[id]
  24.           return nil if data.nil?
  25.           temp = Array.new
  26.           for i in data
  27.              if x.between?(i[0], i[2]) and y.between?(i[1], i[3])
  28.                 temp.concat(i[4])
  29.              end
  30.           end
  31.           return false if temp.empty?
  32.           return temp
  33.       end  
  34.    
  35. end  
  36. 基础设定完毕后,将其插入遇敌部分:
  37. 见Scene_Map类的
  38.            # 确定队伍
  39.            n = rand($game_map.encounter_list.size)
  40.            troop_id = $game_map.encounter_list[n]
  41. 将其改写为
  42.            # 确定队伍
  43.            # 获得当前地图区域遇敌的相关资料
  44.            sum = District_Enemy.catch($game_map.map_id,$game_player.x,$game_player.y)
  45.            # 若当前地图未设置过区域,或者区域遇敌未打开,则执行默认的遇敌方式
  46.            if sum == nil or !$game_switches[District_Enemy::ALLOW_ID]  
  47.               n = rand($game_map.encounter_list.size)
  48.               troop_id = $game_map.encounter_list[n]           
  49.            else
  50.               # 反之若角色不在区域内   
  51.               if sum == false
  52.                  # 区域外遇敌开关开启,则执行默认遇敌方式
  53.                  if $game_switches[District_Enemy::SYSTEM_ID]
  54.                     n = rand($game_map.encounter_list.size)
  55.                     troop_id = $game_map.encounter_list[n]
  56.                  else
  57.                     # 反之,不遇敌  
  58.                     troop_id = -100
  59.                  end           
  60.               else
  61.                  # 若在区域内,遭遇对应区域设置的敌人队伍
  62.                  n = rand(sum.size)        
  63.                  troop_id = sum[n]
  64.               end
  65.            end
复制代码
希望破灭是因为发现真实,宁可背负罪孽也要维护爱我之人,永远的娜乌西卡!!!!!!
回复

使用道具 举报

好人卡的 该用户已被删除
发表于 2007-6-19 20:10:46 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

79

主题

617

帖子

6150

积分

⑦老手

暗夜下可怜人

积分
6150
 楼主| 发表于 2007-6-19 20:48:19 | 显示全部楼层
引用第1楼好人卡的神话于2007-06-19 20:10发表的  :
这个邪恶物也出现了。。。[s:4]不过自定义的东西较多,可能会有些人嫌麻烦。。。 [s:5]

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

多点也没办法了,毕竟不清楚作者要怎么分——
希望破灭是因为发现真实,宁可背负罪孽也要维护爱我之人,永远的娜乌西卡!!!!!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|幻想森林

GMT+8, 2024-3-29 17:50 , Processed in 0.016507 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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