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

Project1

 找回密码
 注册会员
搜索
查看: 3815|回复: 8
打印 上一主题 下一主题

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

 关闭 [复制链接]

Lv1.梦旅人

月下可怜人

梦石
0
星屑
50
在线时间
10 小时
注册时间
2005-11-23
帖子
4085

第1届短篇游戏比赛亚军

跳转到指定楼层
1
发表于 2007-6-17 20:39:12 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

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

  8. module District_Enemy
  9.   
  10.    #允许区域遇敌开关ID
  11.    ALLOW_ID = 10

  12.    #区域遇敌开启时,区域外部分是否遵循默认遇敌ID
  13.    SYSTEM_ID = 11  
  14.    
  15.    #设置对应地图的遇敌区域与种类
  16.    DISTRICT = {
  17.    1 => [[0,0,5,5,[1,2]],[4,4,10,10,[3,4]]],
  18.    2 => [[2,7,9,9,[6]],[4,4,10,10,[8]]]
  19.    }
  20.   
  21.    def self.catch(id,x,y)
  22.        data = DISTRICT[id]
  23.        return nil if data.nil?
  24.        temp = Array.new
  25.        for i in data
  26.           if x.between?(i[0], i[2]) and y.between?(i[1], i[3])
  27.              temp.concat(i[4])
  28.           end
  29.        end
  30.        return false if temp.empty?
  31.        return temp
  32.    end  
  33.    
  34. end  

  35. 基础设定完毕后,将其插入遇敌部分:
  36. 见Scene_Map类的
  37.         # 确定队伍
  38.         n = rand($game_map.encounter_list.size)
  39.         troop_id = $game_map.encounter_list[n]
  40. 将其改写为
  41.         # 确定队伍
  42.         # 获得当前地图区域遇敌的相关资料
  43.         sum = District_Enemy.catch($game_map.map_id,$game_player.x,$game_player.y)
  44.         # 若当前地图未设置过区域,或者区域遇敌未打开,则执行默认的遇敌方式
  45.         if sum == nil or !$game_switches[District_Enemy::ALLOW_ID]  
  46.            n = rand($game_map.encounter_list.size)
  47.            troop_id = $game_map.encounter_list[n]           
  48.         else
  49.            # 反之若角色不在区域内   
  50.            if sum == false
  51.               # 区域外遇敌开关开启,则执行默认遇敌方式
  52.               if $game_switches[District_Enemy::SYSTEM_ID]
  53.                  n = rand($game_map.encounter_list.size)
  54.                  troop_id = $game_map.encounter_list[n]
  55.               else
  56.                  # 反之,不遇敌  
  57.                  troop_id = -100
  58.               end           
  59.            else
  60.               # 若在区域内,遭遇对应区域设置的敌人队伍
  61.               n = rand(sum.size)        
  62.               troop_id = sum[n]
  63.            end
  64.         end
复制代码
区域遇敌


范例下载,注意查毒
ftp://[email protected]/个� ... 遇敌变奏曲.rar

              [本贴由 叶舞枫 于 2007-6-20 9:41:31 进行了编辑]
纵然千里外,我等雁归来。
头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2008-1-20
帖子
7
9
发表于 2008-1-22 05:59:04 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2007-2-8
帖子
208
8
发表于 2007-6-20 19:32:19 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

Dancer-

梦石
0
星屑
55
在线时间
76 小时
注册时间
2006-11-9
帖子
3551

开拓者贵宾

7
发表于 2007-6-20 17:41:12 | 只看该作者
http://rpg.blue/web/htm/news755.htm
VIP 3
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

苹果梨

梦石
0
星屑
43
在线时间
6 小时
注册时间
2007-2-14
帖子
720
6
发表于 2007-6-18 23:29:08 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (暗夜天使)

精灵族の天使

梦石
0
星屑
1697
在线时间
3038 小时
注册时间
2007-3-16
帖子
33731

开拓者贵宾

5
发表于 2007-6-18 07:27:05 | 只看该作者
太有用了。绝版收藏。
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2007-6-8
帖子
96
4
发表于 2007-6-18 06:40:47 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

◎伸手党潜力队员

梦石
0
星屑
50
在线时间
0 小时
注册时间
2007-2-21
帖子
236
3
发表于 2007-6-18 05:28:22 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

月下可怜人

梦石
0
星屑
50
在线时间
10 小时
注册时间
2005-11-23
帖子
4085

第1届短篇游戏比赛亚军

2
 楼主| 发表于 2007-6-17 20:39:12 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

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

  8. module District_Enemy
  9.   
  10.    #允许区域遇敌开关ID
  11.    ALLOW_ID = 10

  12.    #区域遇敌开启时,区域外部分是否遵循默认遇敌ID
  13.    SYSTEM_ID = 11  
  14.    
  15.    #设置对应地图的遇敌区域与种类
  16.    DISTRICT = {
  17.    1 => [[0,0,5,5,[1,2]],[4,4,10,10,[3,4]]],
  18.    2 => [[2,7,9,9,[6]],[4,4,10,10,[8]]]
  19.    }
  20.   
  21.    def self.catch(id,x,y)
  22.        data = DISTRICT[id]
  23.        return nil if data.nil?
  24.        temp = Array.new
  25.        for i in data
  26.           if x.between?(i[0], i[2]) and y.between?(i[1], i[3])
  27.              temp.concat(i[4])
  28.           end
  29.        end
  30.        return false if temp.empty?
  31.        return temp
  32.    end  
  33.    
  34. end  

  35. 基础设定完毕后,将其插入遇敌部分:
  36. 见Scene_Map类的
  37.         # 确定队伍
  38.         n = rand($game_map.encounter_list.size)
  39.         troop_id = $game_map.encounter_list[n]
  40. 将其改写为
  41.         # 确定队伍
  42.         # 获得当前地图区域遇敌的相关资料
  43.         sum = District_Enemy.catch($game_map.map_id,$game_player.x,$game_player.y)
  44.         # 若当前地图未设置过区域,或者区域遇敌未打开,则执行默认的遇敌方式
  45.         if sum == nil or !$game_switches[District_Enemy::ALLOW_ID]  
  46.            n = rand($game_map.encounter_list.size)
  47.            troop_id = $game_map.encounter_list[n]           
  48.         else
  49.            # 反之若角色不在区域内   
  50.            if sum == false
  51.               # 区域外遇敌开关开启,则执行默认遇敌方式
  52.               if $game_switches[District_Enemy::SYSTEM_ID]
  53.                  n = rand($game_map.encounter_list.size)
  54.                  troop_id = $game_map.encounter_list[n]
  55.               else
  56.                  # 反之,不遇敌  
  57.                  troop_id = -100
  58.               end           
  59.            else
  60.               # 若在区域内,遭遇对应区域设置的敌人队伍
  61.               n = rand(sum.size)        
  62.               troop_id = sum[n]
  63.            end
  64.         end
复制代码
区域遇敌


范例下载,注意查毒
ftp://[email protected]/个� ... 遇敌变奏曲.rar

              [本贴由 叶舞枫 于 2007-6-20 9:41:31 进行了编辑]
纵然千里外,我等雁归来。
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

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

GMT+8, 2024-11-23 13:06

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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