Project1
标题:
重开,关于地图明雷遇敌系统脚本,请教3535亲
[打印本页]
作者:
寂砂
时间:
2008-6-1 20:49
提示:
作者被禁止或删除 内容自动屏蔽
作者:
IamI
时间:
2008-6-1 21:01
逃跑的场合“独立开关A=ON”可以吗
作者:
3535
时间:
2008-6-1 21:14
#-------------------------------------------------------------------------------------
#超!遇敌系统
#coding by Kevin Chang
#==============================================================================
# ■ Game_Event
#------------------------------------------------------------------------------
# 处理事件的程序。条件判断、事件页的切换、并行处理、执行事件功能
# 在 Game_Map 的内部使用。
#==============================================================================
module RPG #新增name定义,作用于抓取事件名称字段值
class Event
def initialize(x, y)
@id = 0
@name = ""
@x = x
@y = y
@pages = [RPG::Event::Page.new]
end
attr_accessor :id
attr_accessor :name
attr_accessor :x
attr_accessor :y
attr_accessor :pages
end
end
class Game_Event < Game_Character
#--------------------------------------------------------------------------
# ● 定义实例变量
#--------------------------------------------------------------------------
attr_accessor :trigger # 目标(改为可擦写)
attr_reader :list # 执行内容
attr_reader :starting # 启动中标志
attr_accessor :name #取得事件名称
attr_accessor :character_name #改变事件图形为可擦写
attr_accessor :auto_fight #敌人事件处碰启动战斗设定
attr_accessor :move_type #移动方式让 $game_map.events[event_id].move_type = ? 来设定
#--------------------------------------------------------------------------
# ● 初始化对像
# map_id : 地图 ID
# event : 事件 (RPG::Event)
#--------------------------------------------------------------------------
def initialize(map_id, event)
super()
@map_id = map_id
@event = event
@id = @event.id
@erased = false
@starting = false
@through = true
@name = @event.name #取得事件名称
@character_name =""#改变事件图形为可擦写
@auto_fight = false #敌人事件接触自动战斗
@move_type = 0 #移动方式 让 $game_map.events[event_id].move_type = ? 来设定
#改变敌人事件的移动方法 0.不动 1.随机 2.接近 4.自订AI
# 初期位置的移动
moveto(@event.x, @event.y)
refresh
end
#--------------------------------------------------------------------------
# ● 接触事件启动判定
#--------------------------------------------------------------------------
def check_event_trigger_touch(x, y)
# 事件执行中的情况下
if $game_system.map_interpreter.running?
return
end
# 目标为 [与事件接触] 以及和主角坐标一致的情况下
if @trigger == 2 and x == $game_player.x and y ==
$game_player.y
# 除跳跃中以外的情况、启动判定就是正面的事件
if not jumping? and not over_trigger?
@auto_fight = true
start
else
@auto_fight = false
end
end
end
#--------------------------------------------------------------------------
# ● 自动事件启动判定
#--------------------------------------------------------------------------
def check_event_trigger_auto
# 目标为 [与事件接触] 以及和主角坐标一致的情况下
if @trigger == 2 and @x == $game_player.x and @y ==
$game_player.y
# 除跳跃中以外的情况、启动判定就是同位置的事件
if not jumping? and over_trigger?
@auto_fight = true
start
else
@auto_fight = false
end
end
# 目标是 [自动执行] 的情况下
if @trigger == 3
start
end
end
end
#==============================================================================
# ■ Game_Character (分割定义 2)
#------------------------------------------------------------------------------
# 处理角色的程序。本程序作为 Game_Player 与 Game_Event
# 的超级程序使用。
#==============================================================================
class Game_Character
#--------------------------------------------------------------------------
# ● 移动类型 : 接近
#--------------------------------------------------------------------------
def move_type_toward_player
# 求得与主角坐标的差
sx = @x - $game_player.x
sy = @y - $game_player.y
# 求得差的绝对值
abs_sx = sx > 0 ? sx : -sx
abs_sy = sy > 0 ? sy : -sy
# 如果纵横共计离开 20 个组件
if sx + sy >= 5#修正敌人警戒距离
# 随机
move_random
return
end
# 随机 0~5 的分支
case rand(6)
when 0..3 # 接近主角
move_toward_player
when 4 # 随机
move_random
when 5 # 前进一步
move_forward
end
end
end
#===========================================================
#==============================================================================
# ■ Scene_Map
#------------------------------------------------------------------------------
# 处理地图画面的程序。
#==============================================================================
class Scene_Map
#--------------------------------------------------------------------------
# ● 主处理
#--------------------------------------------------------------------------
$enemy_event_arry = []
#存放敌人事件的事件编号对应的敌人队伍id(troop_id)
$e_event_id = []#存放属于敌人事件的事件id
def main
@a = 0
# 生成活动块
@spriteset = Spriteset_Map.new
# 生成讯息窗口
@message_window = Window_Message.new
# 执行过渡
Graphics.transition
# 主循环
loop do
new_battle_module #呼叫新版遇敌系统
# 刷新游戏画面
Graphics.update
# 刷新输入讯息
Input.update
# 刷新画面
update
# 如果画面切换的话就中断循环
if $scene != self
break
end
end
# 准备过渡
Graphics.freeze
# 释放活动块
@spriteset.dispose
# 释放讯息窗口
@message_window.dispose
# 标题画面切换中的情况下
if $scene.is_a?(Scene_Title)
# 淡入淡出画面
Graphics.transition
Graphics.freeze
end
end
#------------------------------------------------------------------
#●怪物事件随机图标变化设计模块-主要控制
#--------------------------------------------------------------------
def new_battle_module
# 遇敌列表不为空的情况下
if $game_map.encounter_list != []
# 不是在事件执行中或者禁止遇敌中
unless $game_system.map_interpreter.running? or
$game_system.encounter_disabled
# 确定队伍
for i in 1 .. $game_map.events.size
if $game_map.events[i].name == "敌人"
if $game_map.events[i].character_name ==
""#避免怪物持续刷新,设置一个break的条件
$game_map.events[i].character_name =
rand_enemies_character_name#改变敌人事件的图片
$enemy_event_arry[i] =
$enemy_event_id#将获取的troop_id 存放到敌人事件数组内
$e_event_id[@a] = i
@a += 1
$game_map.events[i].trigger = 2
#自动改为接触启动事件
$game_map.events[i].move_type = 2
#改变敌人事件的移动方法 0.不动 1.随机 2.接近
# 队伍有效的话
else
break
end#if 避免怪物持续刷新,设置一个break的条件
end
end#end for
end #unless
end#if 遇敌列表不为空的情况下
end#module
#--------------------------------------------------------------------
#●怪物事件随机图标变化设计模块-战斗图获取
#--------------------------------------------------------------------
def rand_enemies_character_name
n =
rand($game_map.encounter_list.size)#随机数取得地图敌人列表数量
troop_id =
$game_map.encounter_list[n]#随机数带入敌人队伍ID内,由敌人列表随机取出一队伍
troop = $data_troops[troop_id]#将随机敌人队伍数据存放到 troop 变数内
$enemy_event_id = troop_id
i = rand(troop.members.size) #由troop队伍资料内随机抽出一个敌人队员
enemy_character_name =
$data_enemies[troop.members[i].enemy_id].battler_name
#抽出的随机敌人队员,与data_enemies去比对出对应的怪物战斗图,把战斗图名称取出
return enemy_character_name #回传战斗图名称
end
#--------------------------------------------------------------------------
# ● 刷新画面
#--------------------------------------------------------------------------
def update
# 循环
loop do
# 按照地图、实例、主角的顺序刷新
# (本更新顺序不会在的满足事件的执行条件下成为给予角色瞬间移动
# 的机会的重要原素)
$game_map.update
$game_system.map_interpreter.update
$game_player.update
# 系统 (定时器)、画面刷新
$game_system.update
$game_screen.update
# 如果主角在场所移动中就中断循环
unless $game_temp.player_transferring
break
end
# 执行场所移动
transfer_player
# 处理过渡中的情况下、中断循环
if $game_temp.transition_processing
break
end
end
# 刷新活动块
@spriteset.update
# 刷新讯息窗口
@message_window.update
# 游戏结束的情况下
if $game_temp.gameover
# 切换的游戏结束画面
$scene = Scene_Gameover.new
return
end
# 返回标题画面的情况下
if $game_temp.to_title
# 切换到标题画面
$scene = Scene_Title.new
return
end
# 处理过渡中的情况下
if $game_temp.transition_processing
# 清除过渡处理中标志
$game_temp.transition_processing = false
# 执行过渡
if $game_temp.transition_name == ""
Graphics.transition(20)
else
Graphics.transition(40, "Graphics/Transitions/" +$game_temp.transition_name)
end
end
# 显示讯息窗口中的情况下
if $game_temp.message_window_showing
return
end
# 遇敌列表不为空的情况下且敌人事件 auto_fight 为true
for i in $e_event_id
if $game_map.encounter_list != [] and
$game_map.events[i].auto_fight == true
$event_id_on_time = i #把正在进行战斗的 event_id 取出,以便后面呼叫使用
# 不是在事件执行中或者禁止遇敌中
unless $game_system.map_interpreter.running? or
$game_system.encounter_disabled
# 确定队伍
troop_id = $enemy_event_arry[i]
# 队伍有效的话
if $data_troops[troop_id] != nil
# 设置调用战斗标志
$game_temp.battle_calling = true
$game_temp.battle_troop_id = troop_id
$game_temp.battle_can_escape = true
$game_temp.battle_can_lose = false
$game_temp.battle_proc = nil
end
end
end
end #for
# 按下 B 键的情况下
if Input.trigger?(Input::B)
# 不是在事件执行中或菜单禁止中
unless $game_system.map_interpreter.running? or
$game_system.menu_disabled
# 设置菜单调用标志以及 SE 演奏
$game_temp.menu_calling = true
$game_temp.menu_beep = true
end
end
# 调试模式为 ON 并且按下 F9 键的情况下
if $DEBUG and Input.press?(Input::F9)
# 设置调用调试标志
$game_temp.debug_calling = true
end
# 不在主角移动中的情况下
unless $game_player.moving?
# 执行各种画面的调用
if $game_temp.battle_calling
call_battle
elsif $game_temp.shop_calling
call_shop
elsif $game_temp.name_calling
call_name
elsif $game_temp.menu_calling
call_menu
elsif $game_temp.save_calling
call_save
elsif $game_temp.debug_calling
call_debug
end
end
end
end
#==============================================================================
# ■ Scene_Battle (分割定义 2)
#------------------------------------------------------------------------------
# 处理战斗画面的程序。
#==============================================================================
class Scene_Battle
#--------------------------------------------------------------------------
# ● 胜负判定
#--------------------------------------------------------------------------
def judge
# 全灭判定是真、并且同伴人数为 0 的情况下
if $game_party.all_dead? or $game_party.actors.size == 0
# 允许失败的情况下
if $game_temp.battle_can_lose
# 还原为战斗开始前的 BGM
$game_system.bgm_play($game_temp.map_bgm)
$game_map.events[$event_id_on_time].name = "死亡"
$game_map.events[$event_id_on_time].auto_fight = false
$game_map.events[$event_id_on_time].trigger = 0
$game_map.events[$event_id_on_time].erase
# 战斗结束
battle_end(2)
# 返回 true
return true
end
# 设定游戏结束标志
$game_temp.gameover = true
# 返回 true
return true
end
# 如果存在任意 1 个敌人就返回 false
for enemy in $game_troop.enemies
if enemy.exist?
return false
end
end
# 开始结束战斗回合 (胜利)
start_phase5
# 返回 true
return true
end
#--------------------------------------------------------------------------
# ● 画面更新 (结束战斗回合)
#--------------------------------------------------------------------------
def update_phase5
# 等待计数大于 0 的情况下
if @phase5_wait_count > 0
# 减少等待计数
@phase5_wait_count -= 1
# 等待计数为 0 的情况下
if @phase5_wait_count == 0
# 显示结果窗口
@result_window.visible = true
# 清除主回合标志
$game_temp.battle_main_phase = false
# 刷新状态窗口
@status_window.refresh
end
return
end
# 按下 C 键的情况下
if Input.trigger?(Input::C)
# 战斗结束
$game_map.events[$event_id_on_time].name = "死亡"
$game_map.events[$event_id_on_time].auto_fight =
false
$game_map.events[$event_id_on_time].trigger = 0
$game_map.events[$event_id_on_time].erase
battle_end(0)
end
end
end
复制代码
[LINE]1,#dddddd[/LINE]
系统信息:本贴由楼主认可为正确答案,66RPG感谢您的热情解答~
作者:
寂砂
时间:
2008-6-1 21:42
提示:
作者被禁止或删除 内容自动屏蔽
作者:
Stifling
时间:
2008-6-1 22:06
提示:
作者被禁止或删除 内容自动屏蔽
作者:
寂砂
时间:
2008-6-1 22:14
提示:
作者被禁止或删除 内容自动屏蔽
作者:
havealook
时间:
2008-6-1 22:41
我只是来提醒3535马甲超标了{/gg}
每人最多只能有2个马甲{/gg}
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1