Project1
标题:
遇敌变奏曲(随机+自定+破限+区域)
[打印本页]
作者:
美兽
时间:
2007-6-17 20:39
标题:
遇敌变奏曲(随机+自定+破限+区域)
一:怪物单体随机出现。
例如队伍中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
复制代码
二:怪物种族群组随机出现。
相同怪物作为一组,相对每组,每个怪物随机,但至少出现一次。
例如出现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
复制代码
三:一+二
为了不与默认方式冲突,并且使用灵活,将一、二两种随机方式与默认整合,利用变量区分,具体如下:
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
复制代码
四:自定义遇敌
专门建立个方法设置敌人组合,如下:
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的限制,效果如图,具体见范例。
复制代码
破限之百鬼夜行
五:区域遇敌
使用脚本可大为提升效率。
基础设定:
其中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
复制代码
区域遇敌
范例下载,注意查毒
ftp://
[email protected]
/个� ... 遇敌变奏曲.rar
[本贴由 叶舞枫 于 2007-6-20 9:41:31 进行了编辑]
作者:
美兽
时间:
2007-6-17 20:39
标题:
遇敌变奏曲(随机+自定+破限+区域)
一:怪物单体随机出现。
例如队伍中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
复制代码
二:怪物种族群组随机出现。
相同怪物作为一组,相对每组,每个怪物随机,但至少出现一次。
例如出现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
复制代码
三:一+二
为了不与默认方式冲突,并且使用灵活,将一、二两种随机方式与默认整合,利用变量区分,具体如下:
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
复制代码
四:自定义遇敌
专门建立个方法设置敌人组合,如下:
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的限制,效果如图,具体见范例。
复制代码
破限之百鬼夜行
五:区域遇敌
使用脚本可大为提升效率。
基础设定:
其中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
复制代码
区域遇敌
范例下载,注意查毒
ftp://
[email protected]
/个� ... 遇敌变奏曲.rar
[本贴由 叶舞枫 于 2007-6-20 9:41:31 进行了编辑]
作者:
rpg83200
时间:
2007-6-18 05:28
提示:
作者被禁止或删除 内容自动屏蔽
作者:
↗AirFined↘
时间:
2007-6-18 06:40
提示:
作者被禁止或删除 内容自动屏蔽
作者:
精灵使者
时间:
2007-6-18 07:27
太有用了。绝版收藏。
作者:
gpra8764
时间:
2007-6-18 23:29
提示:
作者被禁止或删除 内容自动屏蔽
作者:
叶舞枫
时间:
2007-6-20 17:41
http://rpg.blue/web/htm/news755.htm
VIP 3
作者:
19911118
时间:
2007-6-20 19:32
提示:
作者被禁止或删除 内容自动屏蔽
作者:
得令
时间:
2008-1-22 05:59
提示:
作者被禁止或删除 内容自动屏蔽
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1