查看: 33392|回复: 67

[通用发布] 【22K纯事件】喵氏事件系统集(更新完毕)

[复制链接]
梦石
0
星屑
2310
在线时间
5539 小时
注册时间
2011-1-10
回帖
6353

青铜编剧史诗剧作家剧作品鉴家

发表于 2015-1-27 18:43:23 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 H·H·Y 于 2015-2-23 20:52 编辑

[box=RoyalBlue]前言[/box]
我已经当了五年事件党惹,五年钻研路上经历了各种挫折,从一开始最求效果,到后来最求性能,在系统优化上费了几番周折呢,回想两年前在6R发布的纯事件ARPG,说实话那一套错漏百出的系统我现在已经不敢再拿来用了。

至于为什么要开源,说到底就是累了,真的累了。虽然事件系统曾经满足了我的需求,但是慢慢用着发现它能实现的功能根本不够用啊,工序也繁杂,还限制了我的思想。我想向前更迈一步,向着脚本党进发了,但几年的心血留着浪费,想着公布出来吧,让那些还没有能力学习或创作脚本的事件党们有更大的发挥空间。

至于提早发了是因为短9到现在没出结果,过一星期就放假要回老家了,然后会很忙,不如现在就把教程发完吧。

[box=RoyalBlue]目录[/box]
1.事件标题
2.事件菜单
3.事件昼夜+天候系统
4.事件庄园管理系统
5.事件随机支线任务计时系统
6.喵氏二代事件血条系统
7.喵氏二代事件ARPG系统附加战斗评分系统
8.喵氏事件CP式回合制
9.结束语

[box=RoyalBlue]注意[/box]
本教程适合对事件已经有一定程度认识的人群。

以上系统由通过LZ独立思考制作。

以上系统存在一两句必要的脚本作为辅助,但绝大多数的命令都采用事件制作。

以上教程均以XP为例。

学习本教程建议下载对应的范例工程。

除了事件回合制之外,基本都是一些广泛且实用的系统,能满足你的需求了吧?(~ ̄▽ ̄)ノ

点评

同作为事件流表示支持。  发表于 2015-1-28 04:44
_(:з」∠)_工程我是会砸的啦……  发表于 2015-1-27 20:33
好好做,顺便记得丢个范例工程。(这样以后提问区就又可以砸链接了。  发表于 2015-1-27 18:53

评分

参与人数 19星屑 +3195 梦石 +7 赞 +2 收起 理由
xuansun10 + 1
cc610523 + 1 精品文章
斜眼君 + 85 挖坟,顺便刚喵哥
W.Q.C. + 60 精品文章
水母书亚 + 15 塞糖
jklpgh + 20
梦·林夕 + 15 只有这么多了、、、
鑫晴 + 25 塞糖
完全默认 + 170 好东西就是要支持(~ ̄▽ ̄)~.
邪月长啸 + 45 精品文章

查看全部评分

梦石
0
星屑
2310
在线时间
5539 小时
注册时间
2011-1-10
回帖
6353

青铜编剧史诗剧作家剧作品鉴家

 楼主| 发表于 2015-1-27 18:43:50 | 显示全部楼层
本帖最后由 H·H·Y 于 2015-2-23 20:50 编辑

[fold=No.1:事件标题][box=RoyalBlue]No.1:事件标题[/box]

[box=RoyalBlue]导言[/box]
看到许多大触的标题菜单十分炫丽,然而身为不会脚本的事件党,却只能使用单调的默认标题,最多改改背景图片和Window好了,一点也不带感嘛。
如何才能让标题具有个性,成为许多RMer共同的疑问。

系统完善度 ★★★★★
学习难度 ★★☆
学习时间 30分钟-45分钟
范例工程 逐梦 v1.4 开源版


QQ截图20150127222346.png

[box=RoyalBlue]要点[/box]
该系统若能掌握诀窍就不是难事,但在光标移动的表现效果上比较容易出问题,需要根据游戏中的表现准确看出是哪个地方出了问题并进行修正。

[box=RoyalBlue]开始[/box]
首先你需要准备一个脚本:跳过默认标题界面。
事件菜单会在地图上执行,所以不需要默认菜单,要将默认菜单屏蔽掉。


以下为脚本:
RMXP:
[pre lang="ruby"]#==============================================================================
# 本脚本来自www.66RPG.com,使用和转载请保留此信息
#==============================================================================


class Scene_Title
  #==============================================================================
  # 脚本作者:朱仔メ龍 QQ:251724722
  # 脚本转载请保留以上信息
  #==============================================================================
  def main
    $data_actors        = load_data("Data/Actors.rxdata")
    $data_classes       = load_data("Data/Classes.rxdata")
    $data_skills        = load_data("Data/Skills.rxdata")
    $data_items         = load_data("Data/Items.rxdata")
    $data_weapons       = load_data("Data/Weapons.rxdata")
    $data_armors        = load_data("Data/Armors.rxdata")
    $data_enemies       = load_data("Data/Enemies.rxdata")
    $data_troops        = load_data("Data/Troops.rxdata")
    $data_states        = load_data("Data/States.rxdata")
    $data_animations    = load_data("Data/Animations.rxdata")
    $data_tilesets      = load_data("Data/Tilesets.rxdata")
    $data_common_events = load_data("Data/CommonEvents.rxdata")
    $data_system        = load_data("Data/System.rxdata")
    $game_system = Game_System.new
    Graphics.frame_count = 0
    $game_temp          = Game_Temp.new
    $game_system        = Game_System.new
    $game_switches      = Game_Switches.new
    $game_variables     = Game_Variables.new
    $game_self_switches = Game_SelfSwitches.new
    $game_screen        = Game_Screen.new
    $game_actors        = Game_Actors.new
    $game_party         = Game_Party.new
    $game_troop         = Game_Troop.new
    $game_map           = Game_Map.new
    $game_player        = Game_Player.new
    $game_party.setup_starting_members
    $game_map.setup($data_system.start_map_id)
    $game_player.moveto($data_system.start_x, $data_system.start_y)
    $game_player.refresh
    $game_map.autoplay
    $game_map.update
    $scene = Scene_Map.new
  end
end


#==============================================================================
# 本脚本来自www.66RPG.com,使用和转载请保留此信息
#============================================================================== [/pre]


RMVX:
[pre lang="ruby"]#==============================================================================
# ■ Scene_Title
#------------------------------------------------------------------------------
#  处理标题画面的类。
#==============================================================================

class Scene_Title < Scene_Base
  #--------------------------------------------------------------------------
  # ● 主处理
  #--------------------------------------------------------------------------
  def main
    if $BTEST                         # 战斗测试的情况
      battle_test                     # 开始处理战斗测试
    else                              # 一般处理
      super                           # 返回原来的主处理
    end
  end
  #--------------------------------------------------------------------------
  # ● 开始处理
  #--------------------------------------------------------------------------
  def start
    super
    load_database                     # 读取数据库
    create_game_objects               # 生成游戏对象
    check_continue                    # 继续游戏的有效判定
    command_new_game
  end
  #--------------------------------------------------------------------------
  # ● 执行过渡
  #--------------------------------------------------------------------------
  def perform_transition
    Graphics.transition(20)
  end
  #--------------------------------------------------------------------------
  # ● 结束处理
  #--------------------------------------------------------------------------
  def terminate
    super
    snapshot_for_background
  end
  #--------------------------------------------------------------------------
  # ● 读取数据库
  #--------------------------------------------------------------------------
  def load_database
    $data_actors        = load_data("Data/Actors.rvdata")
    $data_classes       = load_data("Data/Classes.rvdata")
    $data_skills        = load_data("Data/Skills.rvdata")
    $data_items         = load_data("Data/Items.rvdata")
    $data_weapons       = load_data("Data/Weapons.rvdata")
    $data_armors        = load_data("Data/Armors.rvdata")
    $data_enemies       = load_data("Data/Enemies.rvdata")
    $data_troops        = load_data("Data/Troops.rvdata")
    $data_states        = load_data("Data/States.rvdata")
    $data_animations    = load_data("Data/Animations.rvdata")
    $data_common_events = load_data("Data/CommonEvents.rvdata")
    $data_system        = load_data("Data/System.rvdata")
    $data_areas         = load_data("Data/Areas.rvdata")
  end
  #--------------------------------------------------------------------------
  # ● 战斗测试用的读取数据库
  #--------------------------------------------------------------------------
  def load_bt_database
    $data_actors        = load_data("Data/BT_Actors.rvdata")
    $data_classes       = load_data("Data/BT_Classes.rvdata")
    $data_skills        = load_data("Data/BT_Skills.rvdata")
    $data_items         = load_data("Data/BT_Items.rvdata")
    $data_weapons       = load_data("Data/BT_Weapons.rvdata")
    $data_armors        = load_data("Data/BT_Armors.rvdata")
    $data_enemies       = load_data("Data/BT_Enemies.rvdata")
    $data_troops        = load_data("Data/BT_Troops.rvdata")
    $data_states        = load_data("Data/BT_States.rvdata")
    $data_animations    = load_data("Data/BT_Animations.rvdata")
    $data_common_events = load_data("Data/BT_CommonEvents.rvdata")
    $data_system        = load_data("Data/BT_System.rvdata")
  end
  #--------------------------------------------------------------------------
  # ● 做成各种游戏对象
  #--------------------------------------------------------------------------
  def create_game_objects
    $game_temp          = Game_Temp.new
    $game_message       = Game_Message.new
    $game_system        = Game_System.new
    $game_switches      = Game_Switches.new
    $game_variables     = Game_Variables.new
    $game_self_switches = Game_SelfSwitches.new
    $game_actors        = Game_Actors.new
    $game_party         = Game_Party.new
    $game_troop         = Game_Troop.new
    $game_map           = Game_Map.new
    $game_player        = Game_Player.new
  end
  #--------------------------------------------------------------------------
  # ● 继续游戏的有效判定
  #--------------------------------------------------------------------------
  def check_continue
    $continue_enabled = (Dir.glob('Save*.rvdata').size > 0)
  end
  #--------------------------------------------------------------------------
  # ● 指令 : 新的游戏
  #--------------------------------------------------------------------------
  def command_new_game
    confirm_player_location
    $game_party.setup_starting_members            # 初期队伍
    $game_map.setup($data_system.start_map_id)    # 初期位置的地图
    $game_player.moveto($data_system.start_x, $data_system.start_y)
    $game_player.refresh
    $scene = Scene_Map.new
    Graphics.frame_count = 0
    $game_map.autoplay
  end
  #--------------------------------------------------------------------------
  # ● 检查玩家的初期位置
  #--------------------------------------------------------------------------
  def confirm_player_location
    if $data_system.start_map_id == 0
      print "还没设置玩家的初期位置。"
      exit
    end
  end  
  #--------------------------------------------------------------------------
  # ● 指令 : 继续游戏
  #--------------------------------------------------------------------------
  def command_continue
    if $continue_enabled
      Sound.play_decision
      $scene = Scene_File.new(false, true, false)
    else
      Sound.play_buzzer
    end
  end
  #--------------------------------------------------------------------------
  # ● 指令 : 离开游戏
  #--------------------------------------------------------------------------
  def command_shutdown
    Sound.play_decision
    RPG::BGM.fade(800)
    RPG::BGS.fade(800)
    RPG::ME.fade(800)
    $scene = nil
  end
  #--------------------------------------------------------------------------
  # ● 战斗测试
  #--------------------------------------------------------------------------
  def battle_test
    load_bt_database                  # 战斗测试用数据库读取
    create_game_objects               # 作成游戏对象
    Graphics.frame_count = 0          # 初期化游戏时间
    $game_party.setup_battle_test_members
    $game_troop.setup($data_system.test_troop_id)
    $game_troop.can_escape = true
    $game_system.battle_bgm.play
    snapshot_for_background
    $scene = Scene_Battle.new
  end
end[/pre]


RMVA:
[pre lang="ruby"]#===============================================================================
#
# 可以返回标题画面的跳过标题画面脚本
# 作    者:光的圆周率
# 测试情况:RPG Maker VX ACE 测试版 以及 1.00正式版 测试通过
# 说明:脚本中注明的位置可以控制是否可以返回标题画面
#            true:可以再次返回标题画面 false:不可以再次返回标题画面
# 脚本来自66RPG,转载请保留版权信息
#===============================================================================

module SceneManager

  def self.stack
     @stack
  end
end

class Scene_Title < Scene_Base

  alias old_start start
  alias old_dmv dispose_main_viewport
  
  def start

      return_allowed = true      # 决定可否再次返回标题画面的开关
      create_background
      create_foreground
      @sprite1.bitmap.dispose
      @sprite2.bitmap.dispose
      @foreground_sprite.bitmap.dispose
      chk1 = SceneManager.stack.first != nil   && return_allowed
      chk2 = Graphics.frame_count > 0  && return_allowed
     if chk1 or chk2
       old_start
       return 0
     end
       SceneManager.clear
       DataManager.setup_new_game
       $game_map.autoplay
       SceneManager.goto(Scene_Map)
  end

  def dispose_main_viewport
    SceneManager.stack.first == nil ? nil : old_dmv
  end
  
end
#===============================================================================
# 脚本来自66RPG,转载请保留版权信息
#===============================================================================[/pre]

找到对应版本的脚本后,准备好logo,选项,光标,背景图等图片素材,放进Graphics\Pictures,然后打开数据库-系统,然后初期角色全部删掉(VA可使用“初期角色透明”),以上就是全部的准备。做好准备以后咱们正式开始吧。

QQ截图20150127192736.png
看到范例工程左下角,简单的介绍一下,除了系统测试图外,名为“Start From Here”的地图就是对标题的准备。
先来查看地图内的事件,啊?找不到事件在哪的话……
QQ截图20150127193017.png

找到了咱就接着看,以下就是大家看到的事件:
QQ截图20150127193300.png

注释:
①自动执行:管你是自动还是并行,总之会自己运行就对了。
②更改画面色调:有人问这空白地图不是本来就是黑的么?为什么还要用画面色调调黑屏?我回答是:这个在标题是用不到的,但是会在游戏开始的时候用到,用法是:正式进入游戏剧情时做到画面淡入的效果,不至于那么突然。
③循环:这部分是对开头显示logo的消失控制,设置为循环是为了刷新玩家的按键输入和计时。
④变量计时器:计时器不能设置成等待帧,要做到刷新玩家按键输入必须使用变量,至于怎么进行判断在后面会提到。
⑤等待帧:不要觉得这个与上面那条矛盾了,此等待帧的作用有两点,一是防止自动执行下画面卡死,二是让变量计时器变得更可控,也就是说你想要等3秒后logo就消失,那么在下面分歧设置>60就可以了(VX和VA为180)。
⑥条件分歧:此处是对logo消失条件的判断。B、C键的条件分歧对应的是玩家按下确认键或退出键,变量>60是3秒以后玩家即使不操作也会淡出logo的判断。那么分歧内的命令自然不用说了吧?

以上便是准备地图的,接下来进入事件标题的核心命令所在地图,就是那个名为“菜单”的,来看看里面的事件。什么?又找不到在哪了?
QQ截图20150127195341.png

找到了吧?然后再打开事件,第一页是对UI的初始和BGM的播放,初始完毕后利用独立开关运行第二页。
事件有点长,咱慢慢来,先从上边开始看吧。

QQ截图20150127195641.png

注释:
①条件分歧:在初始的时候大家会发现有一个变量操作“菜单光标==0”,这个变量代表的是光标的位置信息,若选项只有“开始游戏”“继续游戏”“退出游戏”的话,则该变量的数值代表的意思是:0.开始游戏,1.继续游戏,2.退出游戏。图中的分歧就是对光标位置进行判断。
②标签跳转:现在此命令暂时无用,但后面会有大用处的。
③变量操作:先往上看,这是光标为0,玩家按了↓的情况,那么这变量操作就是将光标的位置由0,开始游戏选项设置成1,继续游戏选项。
④图片操作:对选项及光标由“开始游戏”转向“继续游戏”的动画表现。同时,上边有个只播放了音效的是因为光标为0且按下了↑,该音效是用来提示玩家光标不能往上移动的。

以上这些搞定后,咱接着往下看。

QQ截图20150127200929.png
QQ截图20150127201034.png

注释:
①开关操作:此开关在本系统无用,但如果你想要学习后面的系统,请把这个开关加上。
②脚本:这个脚本是用来呼出读档界面的,因为事件无法做到读档,必须使用脚本。与此同时,VX的读档画面呼叫脚本为$scene = Scene_File.new(false,false,true),VA的读档画面呼叫脚本为SceneManager.call(Scene_Load)。
③脚本:关闭程序用的,不用多说吧?
④标签:记得上边的标签跳转么?标签跳转会将事件执行顺序跳转到相同标签的位置。该标签为事件末尾,在上面跳转则可以跳过不必要的判断,可以提升执行性能。如果现在你还不能理解可以不使用。

好了,剩下的就是游戏剧情了,感觉比默认标题美观多了吧?但是你以为这就完了?!
如果你使用的是XP,你会发现每次呼叫读档画面后退出,便会重新显示一次logo,这是不和谐的地方咱得调整一下。
打开脚本编辑器找到Scene_Load,第61行$scene = Scene_Title.new更改为$scene = Scene_Map.new。
这样一来便和谐多了。

[box=RoyalBlue]结束[/box]
亲手制作了事件标题是否感到神清气爽?再也不用被默认菜单束缚了,咱好好的干一场吧![/fold]

点评

为什么设置完毕后,跳转地图时,会黑屏,看不见地图?只能听见地图的音乐。  发表于 2015-3-9 10:54
回复 1 0

使用道具 举报

梦石
0
星屑
2310
在线时间
5539 小时
注册时间
2011-1-10
回帖
6353

青铜编剧史诗剧作家剧作品鉴家

 楼主| 发表于 2015-1-27 18:44:14 | 显示全部楼层
本帖最后由 H·H·Y 于 2015-2-23 20:44 编辑

[fold=No.2:事件菜单][box=RoyalBlue]No.2:事件菜单[/box]

[box=RoyalBlue]导言[/box]
完成事件标题后,发现默认的菜单与自己写的标题风格完全不搭怎么办?看到大触们的菜单画面依然眼馋啊……
如何让菜单也具有个性,咱来教你~

系统完善度 ★★★☆
学习难度 ★★★☆
学习时间 30分钟-1小时
范例工程 逐梦 v1.4 开源版

QQ截图20150127222824.png

[box=RoyalBlue]要点[/box]
该系统基本为事件标题的延伸,但指令繁杂容易出问题,对作者要求会更高。学习此系统必须先掌握标签的用法。

[box=RoyalBlue]开始[/box]
首先你要准备素材,其次你需要把默认菜单屏蔽掉,屏蔽默认菜单用事件可以做到。

打开范例工程中数据库-公共事件的“打开菜单”,你会看到以下事件。这个是用来判断玩家是否打开了菜单的。
QQ截图20150127224302.png

注释:
①并行处理:既要判断玩家是否打开开关,又不能影响玩家正常游戏,你需要并行处理。
②条件开关:这个开关就是前一篇教学中的游戏开始时打开的开关,开关打开后这个公共事件便会执行。
③条件分歧:此分歧用来判断玩家是否触发了剧情,在进行剧情的时候记得把这个开关关上哟。
④条件分歧:这个分歧用来判断菜单是否已经被呼出。
⑤条件分歧:这个分歧用来判断玩家是否按下了Esc。
⑥变量操作:初始化光标位置。
⑦渐变:呼出菜单的动画效果,别漏了“准备渐变”
⑧开关操作:呼出菜单后将此开关打开防止玩家重复呼出。

菜单呼出后,接下来要对菜单进行刷新,咱往下翻一个公共事件,找到“菜单处理”公共事件。
哇好长,别被吓到了……

QQ截图20150127225129.png

注释:
①自动执行:千万要是自动执行,想必你是不想看到自己在操作光标的时候看见地图上自己也在走动的。
②条件开关:就是上一个公共事件打开的,不多说了。
③给每个子选项的判断,这里是:如果全部为OFF,则代表在主菜单,执行主菜单的刷新。这里的条件分歧要记得勾上“除此以外的场合”。
④这一段事件似乎跟上一篇教程的做法不同。由于事件菜单的选项较多,想要保证多选项的情况下达到相同的表现效果,而又便于制作者debug,我推荐用这种集中式的写法。所以先记住里面名为“刷新菜单”的标签。

咱接着往下翻,会看到依然是集中式写法的两个判断和一个标签跳转。

QQ截图20150127230017.png

注释:
①标签跳转:这个指令所在的位置有点特殊,但这是一个十分关键的标签,这个标签跳转会在前面的判断都不满足时执行,目的是跳过后面的集中命令,防止在玩家不操作的时候也会对菜单进行错误的刷新。

接下来就是刷新菜单的核心部分。

QQ截图20150127232614.png

注释:
①标签:此标签就是从上面跳下来的,必定会执行下面判断其一,一旦执行一个便会跳转到末尾,这样一来就与上一篇教程的效果完全相同了。此写法优点是集中了同类刷新的命令,方便出问题时debug。

接下来是对打开选项时的指令进行剖析。情况分为两类,一类为退出菜单回到游戏,一类为进入子选项,咱先从退出菜单开始。

QQ截图20150127232948.png

注释:
①标签:从上面跳下来的。
②标签:这个标签比较特别,还记得上面的B键分歧么?也就是说那条分歧是直接跳来这里面的。这个要从选项内容来看,范例工程中的菜单第一项为“返回游戏”,如此一来选择第一项和直接按Esc的效果是一样的,二者可以共用,那么直接跳进这里面就可以解释了。
③开关操作:千万记得要把开关关上,否则你就见不到第二次菜单了。

搞定了菜单关闭,再来看看子选项。

QQ截图20150127233549.png

注释:
①变量操作:光标重置。本范例中为了减少工作量,主菜单和子选项的光标变量是共用的,所以记得重置光标。
②开关操作:记得把对应的子选项开关打开,否则菜单依然会错误地进行主菜单的刷新。

主菜单的刷新以此类推,全部完成以后,接下来做的事子选项菜单的刷新,原理是与主菜单相同的,但是要注意以下两点:
1.从子选项菜单退回主菜单的时候,光标位置不能重置为0,必须对应进入子选项时的数字,否则光标会回到“返回游戏”的选项,并有可能造成界面错乱。
2.主菜单和子选项菜单的标签必须区分开写,比如结束1,结束2,结束3等,否则会出现错乱。

剩下的是一些零散但必要的设置:
QQ截图20150128000548.png 一定要记得在结束标签后面加上等待1帧,不然会卡死。
QQ截图20150127234336.png QQ截图20150127234341.png 存读档的脚本要对上,除此之外诸如物品,特技,状态等选项也要对上脚本,由于这些类型的菜单使用事件做出来十分繁杂,所以还是推荐使用脚本。
QQ截图20150127234444.png 如果你做了音乐鉴赏又使用了BGS,需要通过脚本来单独还原已经记忆的BGM。
打开脚本编辑器,将Scene_Item,Scene_Skill,Scene_Equip,Scene_Status,Scene_End,Scene_Save里面类似$scene = Scene_Menu.new(4)这种返回到默认主菜单的脚本改为返回到地图,否则会恢复到默认的菜单。

[box=RoyalBlue]结束[/box]
(~ ̄▽ ̄)ノ事件菜单就此做完啦~是不是感觉炫了很多呢?虽然可能比不上脚本大触们的菜单,但你们的菜单也就此不再逊色。[/fold]
回复

使用道具 举报

梦石
0
星屑
2310
在线时间
5539 小时
注册时间
2011-1-10
回帖
6353

青铜编剧史诗剧作家剧作品鉴家

 楼主| 发表于 2015-1-27 18:44:37 | 显示全部楼层
本帖最后由 H·H·Y 于 2015-2-23 20:45 编辑

[fold=No.3:事件昼夜+天候系统][box=RoyalBlue]No.3:事件昼夜+天候系统[/box]

[box=RoyalBlue]导言[/box]
自己想做生存游戏?类似生存游戏这类自由度较高的游戏通常会有昼夜循环系统,自己是否也想做一个?通过此教程你可以学到如何让游戏有昼夜和天气的变化,同时室内与室外同一时间段的光影也是完全不同的哟~

范例预设:
一共八个时间段,分为凌晨,朝晨,上午,正午,下午,黄昏,夜晚,午夜。
一共五种天气变化,分为晴朗,小雨,暴雨,多云,雾。
室内与室外在同一条件下会有不同的光影表现,具体表现为:
1.室内通常比室外的光照暗一些。
2.室内会在夜晚时间段开灯。
3.晴朗天气时,除非是在晚上,室内的窗户会透光。
4.雷雨天气时,室内的窗户在打雷时会闪光。
此外,为了程序的可控性,我将天气的变化设置为每个时间段最多只变化一次。

该系统是我第一次做,此版本在优化方面或许还有进步空间,若有高人有更好的算法点子欢迎进一步拓展该系统。

系统完善度 ★★★
学习难度 ★★
学习时间 30分钟-1小时
范例工程 逐梦 v1.4 开源版




[box=RoyalBlue]要点[/box]
难度并不算高,注意调节好光效细节。除此之外,若存在室内和室外的地图则要特别留意室内外的光影区别。

[box=RoyalBlue]开始[/box]
打开范例工程中数据库-公共事件,左方列表一直往下翻,找到“天气控制台”,那么往下的5个公共事件就都是关于此系统的了。
看上去数量似乎有点多,放心,其中只有两个是并行处理的,剩下的三个只是方便制作者制作,区分开主控制台,但会在主控制台内被调用。

咱先看到“主控制台”的公共事件,里面是对各种情况的判断,虽然看起来多,其实整列下来只需要基于两三种运算方法就行了。
翻到事件中部,找到这个注释。
QQ截图20150128192002.png

这个注释是区分室内外的,也就是说,从这里开始,上方的事件为室内,下方为室外,注意分清了。
再返回来第一行开始看。

QQ截图20150128192412.png

注释:
①变量操作:这里是时间段的控制,时间推移的时候记得要将这个变量+1。如果你发现游戏中无论怎么傻等都等不到天气变化的话,不要找我,是时辰的错。
②分歧清零变量:先说说系统的时间段,一共八个时段,那么变量0-7分别代表每个时间段,也就是说不可能存在8的时间,所以当变量加到8的时候需要清零。
③变量操作:此随机数用来做随机天气的抽签。
④条件分歧:这个分歧很重要,用来判断玩家是否在室内的,如果是则往下执行,否则就执行刚刚那个注释以下的部分。开关的操作通常在场所移动后控制。
⑤公共事件:用于给随机数做判断,确定天气类型。
⑥开关操作:这个开关是室内独有的开关。记得游戏中如果到了晚上的话,呆在室内会开灯么?灯的表现效果就是由这个开关控制的。除此之外,室外的天气系统也有一个“路灯”的开关,同样原理,只不过是用来控制路灯的。
⑦条件分歧:进行天气判断。会根据不同的天气进行不同的色调变化,以及音效变化。
⑧移动图片:这个是用来控制例如阳光这类的光效图片的,你可以根据光照强度调整图片的不透明度。

于是主控制台的运行原理都是基于以上运行的,但目前还不能表现效果。为啥呢?因为天气的开关全都没打开!
接下来要做的事将对应的天气开关打开,看到左边的公共事件列表,找到“朝晨天气控制台”和“非朝晨天气控制台”两个公共事件。也许你会问,这俩有啥区别。还记得有个“雾”的天气么?雾只会在朝晨时间出现,如果不是这个时间段的话就取消这个判断了。

QQ截图20150128203009.png

注释:
①条件分歧:用来判断是否在室内。ON为室内。
②条件分歧:如果是暴雨天气就隐藏阳光。
③条件分歧:天气的随机范围,也就是触发天气的概率,这个可以自己设定,那么剩下的就是将开关打开了。

天气的判断完成了,做到此处的话,系统就完成了大半了,剩下的就是室内外切换时光效的变化和暴雨的打雷表现。
先从简单的做起,公共事件列表处继续往下翻,找到“雷电控制”。
里面的事件应该简单明了,区分为室内(只有雷声)和室外(带上画面闪烁),不用多做解释吧?
那么接下来找到“室内外切换天气”。

QQ截图20150128204538.png

注释:
①开关操作:关上
②开关操作:嗯,连着上面那个一起讲。算了还是下面再讲吧。

QQ截图20150128204618.png

注释:
①开关操作:记得切换后打开或关闭对应的开关。
②暴雨特殊控制事件:嗯我真的开始讲了。这个真的有点意思,在写这个系统的时候我也被蒙了好一会儿。具体问题是:雷雨天气时从室外回到室内后打雷依然会画面闪烁,这是因为“雷电控制”为并行处理,需要处理完一轮回来再重新判断是否在室内。把开关关掉让它先停止运作,等切换完毕之后再将开关打开来解决这个问题。

[box=RoyalBlue]结束[/box]
天气系统做好啦(~ ̄▽ ̄)ノ是不是感觉又带感了很多呢?
快去开个生存游戏坑吧~[/fold]
回复

使用道具 举报

梦石
0
星屑
2310
在线时间
5539 小时
注册时间
2011-1-10
回帖
6353

青铜编剧史诗剧作家剧作品鉴家

 楼主| 发表于 2015-1-27 18:45:00 | 显示全部楼层
本帖最后由 H·H·Y 于 2015-2-23 20:45 编辑

[fold=No.4:事件庄园管理系统][box=RoyalBlue]No.4:事件庄园管理系统[/box]

[box=RoyalBlue]导言[/box]
想要给游戏加上庄园系统,让玩家可以建设庄园么?想要实现让玩家通过收集物品来换取奖励么?那么不妨来试试这个吧。

范例预设:
一共三种主要功能,分为战斗训练,技能升级和庄园升级。
一共两种敌人类型训练,四种可升级技能,三种庄园升级选项。

该系统是我第一次做,此版本在优化方面或许还有进步空间,若有高人有更好的算法点子欢迎进一步拓展该系统。

系统完善度 ★★★☆
学习难度 ★★★
学习时间 30分钟-1小时
范例工程 逐梦 v1.4 开源版




[box=RoyalBlue]要点[/box]
该系统基于事件菜单的基础上制作,但庄园系统的功能十分多变,要实现自己想要的功能还是有一定的难度的。此教程会讲解一些比较常见的系统。

[box=RoyalBlue]开始[/box]
咱们先对庄园的功能进行设置。
打开数据库-公共事件,在列表中找到“地盘管理”,此事件就是庄园的控制台。打开一看,你会发现这与事件菜单十分相似……不是十分……简直就是。也就是说,大家在上方看到的预览图其实也是由事件写出来的。
相信大家在点进事件的时候就看到第一行的注释了,此注释会在每个大的条件分歧之前出现一次,也就是对主菜单和子菜单的分割。于是大家又会发现,写法和前面的事件菜单又不同了。

_(:з」∠)_妈呀先别打我,其实呢,我在做这个游戏的时候是先做事件菜单的,做事件菜单的时候发现使用“除此之外的场合”非常不方便,于是我稍微改变了一下写法,将子菜单的分歧分离了出来,然后加上显眼的注释,这样一来就好看多了。

那么菜单的写法我就不用多说了吧?我们直接来剖析功能部分。往下翻看到主菜单的C键判定,第一种情况是光标为3,也就是查看地盘信息的功能。先不要理会那堆分歧和变量操作,看到末尾的显示文章处:
QQ截图20150129235311.png
显示文章里面全都是用来显示变量数字的。因为庄园存在升级选项,玩家对庄园进行升级,庄园各属性的数值也会跟着改变,于是你需要使用显示变量来表达准确的信息。
QQ截图20150129235615.png
于是上面的分歧和变量操作就可以理解了吧?分歧是对庄园的属性等级进行判断,判断后给变量代入一个准确的数值后显示。
接下来往下看。

QQ截图20150129235808.png

注释:
①条件分歧:如果你想让庄园功能受剧情进度的限制,可以通过条件分歧让剧情进行到一定进度之后才开启此功能。
②指令:剧情已经符合条件的情况下呼出子菜单的指令。

剩下的战斗训练和技能升级各位应该都能看懂,那么唯独庄园升级我稍微提点一下。

QQ截图20150130001820.png

注释:
①显示文章:因为属性等级越高,升级所需要消耗的鱼干数量就越多,同时升级后上限变高,二者皆为变量,需要使用对应的变量来显示。
②条件分歧:总之别忘了判断当前的等级。

QQ截图20150130001834.png
最后最高等级不能升级,只需要稍微提示一下即可。

以上便是庄园管理选项的设置,那么需要怎样呼出该菜单呢?
游戏中的“庄园”其实为主角“白白”的小地盘,位于地图“城郊”北部,闪烁着蓝光的地方。
QQ截图20150129234233.png
这个事件就是用于呼出庄园管理菜单的。
将这个事件打开后,由于剧情的原因,你看到的事件页会有点多,但最主要的只有很少一部分。

QQ截图20150130002248.png

这一页的末尾处是第一次开启庄园功能时必须进行的数据初始化,必须进行的数据初始化,必须进行的数据初始化,因为很重要所以说三遍,否则刚刚设置的功能会出现很大问题哦~

接下来翻到第7页。

QQ截图20150130002623.png

注释:
①条件分歧:如果正在进行战斗训练则不允许呼出菜单。另外我忽略了一个严重的问题,游戏中进行支线任务战斗时也能够呼出菜单,是因为少了类似的判断,其实我也是刚刚才发现的,已经来不及改了,各位在自己做的时候要记得加上。总而言之在所有的战斗情况下都禁止呼出就对了。
②开关操作:防止玩家在呼出庄园管理菜单后依然会呼出事件菜单的问题。
③变量操作:记得初始化光标位置,否则可能会出现选项错乱。

这样一来就可以呼出管理菜单了,但是在事件页最末尾还要加上这么一个事件页。
QQ截图20150130002838.png
这是为了防止菜单被重复呼出的。

[box=RoyalBlue]结束[/box]
(~ ̄▽ ̄)ノ那么到此庄园管理系统就做完啦~你的游戏自由度是不是又提高了一些呢?
不过这个系统配合上下一篇教程将会锦上添花哟~不妨去看一看吧。[/fold]
回复

使用道具 举报

梦石
0
星屑
2310
在线时间
5539 小时
注册时间
2011-1-10
回帖
6353

青铜编剧史诗剧作家剧作品鉴家

 楼主| 发表于 2015-1-27 18:45:28 | 显示全部楼层
本帖最后由 H·H·Y 于 2015-2-23 20:51 编辑

[fold=No.5:事件随机支线任务计时系统][box=RoyalBlue]No.5:事件随机支线任务计时系统[/box]

[box=RoyalBlue]导言[/box]
庄园系统弄好了,当然少不了支线任务系统。通过NPC触发的支线任务想必大部分人都做过了,是否想到过一些隔段时间就会发生的事件,并且此事件会受到庄园属性的影响呢?来,咱来给你开♂开♂脑♂洞。

范例预设:
获得升级庄园必需品的收集支线×1
驱赶庄园捣乱者支线×1
随机位置出现敌人的支线×1

该系统是我第一次做,此版本在优化方面或许还有进步空间,若有高人有更好的算法点子欢迎进一步拓展该系统。

系统完善度 ★★★☆
学习难度 ★★
学习时间 15分钟-30分钟
范例工程 逐梦 v1.4 开源版




[box=RoyalBlue]要点[/box]
此系统多变,若需要不同的支线,作者必须有应变修改的能力。

[box=RoyalBlue]开始[/box]
先打开数据库-公共事件,列表往下翻,在“地盘管理”往下的部分就是支线任务的控制。
范例的支线存在三种类型,咱一个个讲起。

第一种:定点定时刷新道具。
游戏中有几个地方会定期地刷新鱼干,控制核心在名为“鱼干刷新”的公共事件里。

QQ截图20150201001856.png

注释:
①条件分歧:只要这个刷新点还没有刷新出道具,就进行下一步。
②变量与分歧:变量式计时器,前面提到过,目的是实现与下面多个刷新点同时分别计时。
③开关操作:如果计时器已经达到要求,则该刷新点刷新出道具。

剩下的刷新点都是这种设置方法,注意开关要对应。另外千万记得在时间末尾加上“等待1帧”,不然两千多的变量唰一下就能加上去。
至于道具的设置如下:

QQ截图20150201002446.png

注释:
①出现条件:设置为对应开关,只有计时器完成计时才会出现。
②公共事件:这个是对收集数量是否达到上限而做判断的,具体命令在对应的公共事件内。写法也很简单,不过是些数学计算而已,你们应该能看懂吧?
③变量操作:拾取了道具之后记得将计时器清零。
④开关操作:若不关掉的话,这个刷新点一旦刷新将会无限刷物品哟~

第二种:与庄园系统关联较大的支线
范例中的野猫会来偷玩家的道具,并且玩家收集的道具越多,来的敌人就越强力。通过庄园升级可以提高敌人来偷袭的间隔和成功偷走道具时的数量。具体设置方法请看公共事件内的“野猫偷袭”。

QQ截图20150201003448.png

注释:
①条件分歧:判断这条支线是否已经开启,此判断可以用来做到“剧情进行到一定程度才开启此功能”的效果。
②条件分歧:判断是否处于战斗中。
③条件分歧:判断其他支线是否已经开启,多个支线可以多加几个判断。
④条件分歧:判断这条支线是否已经开启。
⑤判断:这里判断玩家持有相关道具的数量来划分敌人等级。

除此之外,【条件分歧-开关0121野猫出现==off】这条指令有“除此之外的场合”,处在下方。
QQ截图20150201004716.png
此事件用来判断若玩家在1分钟之内没有理会偷袭的敌人,敌人就会将玩家的部分道具偷走。
这里要特别几点注意:
首先是计时器。计时器和上面是共用的,但这不会发生冲突。因为在此支线开启之前不需要给敌人的停留时间计时,开启之后也不需要对支线间隔计时,所以一个变量可以共用。
其次是下面的“隐蔽等级”判断。这是升级庄园生效的部分了,你会看到相关等级越高,被偷走的物品就越少。

第三种:出现随机位置的NPC
范例中有两个支NPC出现的位置是随机的。以“偷食老鼠”为例,找到“偷食老鼠”公共事件。
QQ截图20150201005734.png
最直接的是通过随机数随机打开开关,并且在地图的4个位置放上对应开关的NPC。
但这只是其中一种方法,另外一种方法请看到“弃宠搜捕者”公共事件。你会发现里面并没有关于位置信息的设定。其实随机位置跑到NPC身上了。
QQ截图20150201005953.png

在“城郊”地图内找到相关的事件。当打开后你就会发现,位置判断跑到这来了。

QQ截图20150201010029.png

虽然写法不同,但是效果是基本一样的,按需求设置吧。

[box=RoyalBlue]结束[/box]
以上是三种基本的随机机制,当然除了这些以外还可以有很多种,(~ ̄▽ ̄)ノ当然最重要的还得看你自己啊~[/fold]
回复

使用道具 举报

梦石
0
星屑
2310
在线时间
5539 小时
注册时间
2011-1-10
回帖
6353

青铜编剧史诗剧作家剧作品鉴家

 楼主| 发表于 2015-1-27 18:45:50 | 显示全部楼层
本帖最后由 H·H·Y 于 2015-2-23 20:46 编辑

[fold=No.6:喵氏二代事件血条系统][box=RoyalBlue]No.6:喵氏二代事件血条系统[/box]

[box=RoyalBlue]导言[/box]
想要做到不使用脚本就可以在地图上显示血条么?嗯,不仅是血条,蓝条和TP槽也是可以的。这个系统不仅能实现显示血条,还能自由开启和关闭哦。

系统完善度 ★★★★
学习难度 ★★★
学习时间 15分钟-30分钟
范例工程 逐梦 v1.4 开源版


QQ截图20150201011127.png

[box=RoyalBlue]新系统特性[/box]
第一代事件血条系统:
https://rpg.blue/forum.php?mod=viewthread&tid=341475

相比起第一代,第二代当然是大量地用到了标签,在第一代系统中,濒死时的血条特效需要分开3个公共事件,该系统利用标签已经将4个公共事件合并到一块了,提高了运行效率。

[box=RoyalBlue]要点[/box]
受纯事件的限制,该系统只会将血条分为10段显示,而不会平滑过渡。其实如果使用移动图片的比例拉伸,理论上也是可以实现平滑过渡的,只不过要多加几道工序。
还有一点要先说明:启动血条系统的时候必须先对血条的UI进行初始化(显示图片),并且在关闭系统的时候也要进行对应的“图片消失”

[box=RoyalBlue]开始[/box]
找到“白白血条”公共事件,血条濒死特效先别考虑,看到基础的设置。

QQ截图20150201123512.png

注释:
①条件开关:这是用来控制血条是否出现的。
②变量运算:这里是计算HP和MaxHP的百分比,一般来讲计算百分百是HP ÷ MaxHP,由于纯事件的变量不支持浮点数,只能稍微变一下式了。变式公式:HP × 100 ÷ MaxHP = HP%,计算出来得到的结果是0-100,就是代表0%-100%。
③条件分歧:对得数的区域进行判断。多个条件分歧将血条切分为11段,分别对应0%-10%,11%-20%,……,91%-100%,切割后使用显示图片对血条进行变形。

以上就是血条的基本设置方法。如果需要让血条具有濒死特效,请接着往下看。
游戏中当玩家的HP低于40%的时候,血条会开始闪烁并会听到心跳声的SE,随着HP的降低,闪烁的强度和心跳声的快慢也会随之增强。
QQ截图20150201131956.png
看到“×级濒死警告”的标签了么?记得第一代血条系统里,标签处是直接调用公共事件的,当时我还不知道使用标签会更方便。
找到标签跳转的位置,往下的部分就是对特效的设置。

QQ截图20150201132300.png

注释:
①条件分歧:看到这个分歧是不是觉得>=2少了一点?这个数字大小关键要看②。
②等待帧:上边条件分歧的数值设置的比较小是因为此处的频率,等待5帧,以及末尾的等待1帧意味着上面那个条件分歧大概是7帧一个周期,7真之内“快速心跳”的SE刚好循环。至于为什么在这里设置等待5帧是因为移动图片也是有周期的,防止频繁移动图片造成没有闪所表现。

以上就是全部设置方法,如果你想对SP和TP也只做一个值槽,设置方法也是完全一样的,如果你还想对敌人设置血条(例如ARPG),设置方法基本一样,但是注意:敌人的血量是使用变量的,要在开启血条之前对相关数据初始化。

[box=RoyalBlue]结束[/box]
于是这个系统就做完了。如果使用回合制,估计大家觉得这大概没什么用,此系统主要还是来配合下一篇教程——ARPG的,ARPG里面使用这个系统就十分搭了_(:з」∠)_可怜我多年来一直主打ARPG。[/fold]
回复

使用道具 举报

梦石
0
星屑
2310
在线时间
5539 小时
注册时间
2011-1-10
回帖
6353

青铜编剧史诗剧作家剧作品鉴家

 楼主| 发表于 2015-1-27 18:46:13 | 显示全部楼层
本帖最后由 H·H·Y 于 2016-8-12 22:39 编辑

[fold=No.7:喵氏二代事件ARPG系统附加战斗评分系统][box=RoyalBlue]No.7:喵氏二代事件ARPG系统附加战斗评分系统[/box]

[box=RoyalBlue]导言[/box]
默认回合制太拙?想做个自由的ARPG系统?不会脚本?甭担心,事件做ARPG照样杠杠滴!

系统完善度 ★★★★★
学习难度 ★★★★★
学习时间 1.5小时-3小时
范例工程 逐梦 v1.4 开源版



QQ截图20150202232406.png



[box=RoyalBlue]新系统特性[/box]
第一代事件ARPG系统:
https://rpg.blue/thread-245657-1-1.html

相比起第一代,最明显的是第二代的制作工序要简单得多。第一代的判定事件基本位于战斗地图,第二代则将所有的判定事件全部移植到了公共事件内,当然这是有代价的。第二代的编写方法让敌人的数量受到了限制,你在制作系统之前必须考虑游戏中一次战斗需要多少敌人并尽量让敌人数量限制在这个范围内,画地图的时候必须考虑这个地图会不会发生战斗并把敌人NPC提前设置好。
其次,第二代的运行效率要比第一代高出几倍。第二代系统将第一代的“时刻判定坐标”修改为“只有当技能发动时才判定坐标”,并且进行一个技能判定的时候,其他技能判定不会多余地一起运算,所以相同电脑下,第一代的系统只要多弄几个技能就会让FPS掉到16,第二代系统在多个纯事件系统同时运行的情况下,最低也只掉到36FPS,再次看来性能上是一个飞跃。

[box=RoyalBlue]要点[/box]
难度十分高,要求作者要非常熟练地掌握事件,并具备逻辑运算思维。范例中的技能是十分有限的,所以作者必须有举一反三的能力,运用到自身能够充分拓展,才能让系统具备自己的个性。

[box=RoyalBlue]开始[/box]
首先打开公共事件,看到…………………………
QQ截图20150202233735.png
是不是很吓人……其实这也就只是6个玩家技能。如果你要给玩家添加更多的技能就不止这么多了……
咳……刚刚是我吓你的,其实除去上一篇教程的血条之外,这个系统最最核心的只有3个:
QQ截图20150202234129.png
这仨事件支撑起整个技能判断,用来判断所有技能的CD(冷却),GCD(公共冷却)和按键判断,没有这仨你弄什么技能都免谈。
除了这个核心,很重要的组成还分三部分:
第一部分:技能命中判定
QQ截图20150202234738.png

第二部分:技能效果
QQ截图20150202234749.png

第三部分:战斗的关键节点命令
QQ截图20150202234821.png

这些咱们一个个慢慢来。
先从核心开始讲起,打开“公共CD总控”公共事件,这是系统循环判断的开头,目的是达到每次技能施展都存在间隔,保证技能施展衔接不会显得太突然。
QQ截图20150202235213.png

注释:
①条件开关:进入战斗首先执行一次。嗯,这里其实是我疏忽的地方。按理说第一招是不存在GCD的,避免这种情况你可以在战斗开始前先把“结束公共CD”的开关打开。
②开关操作:GCD计时结束后,开启正式的技能按键判断。

然后找到“技能施展按键总控”公共事件,和事件菜单一样,里面采用的是集中式的写法。
QQ截图20150202235543.png

注释:
①条件开关:注意了注意了。
②取消僵直:根据实际需要设置,照目前进度来看你还不需要这个,请无视吧。
③条件分歧:根据实际需要设置,这里是判断玩家是否中了控制技能时去行动能力。
④条件分歧:熟悉按键是事件党必备。这里的按钮X对应键盘上其实是A。除此之外,按钮A对应键盘Z和Shift,按钮B对应一切退出键,按钮C对应一切确认键,按钮Y对应键盘S,按钮Z对应键盘D,按钮L对应键盘Q,按钮R对应键盘W。
⑤条件分歧:这里要有一次按键判断是因为游戏中爪的必杀技触发按键是S→S→A+S,默认判定是玩家按两下S之后会打开“爪必杀可施展”开关,此时玩家若同时按下A和S就会满足必杀技的所有施展条件。
⑥标签跳转:从此处跳转到对应的地方继续进行下一步。

下面的事件应该很明了了,至于一些判断“段数”的分歧下面再细讲。
现在制作好触发条件,假设接下来技能已经完整地释放了,要做的就是给技能设置一个冷却的时间。那么就要在技能施展成功之后加上这个指令:
QQ截图20150203000737.png
此时对应技能的CD会被初始化并开始计时,同时GCD也会开始计时,GCD计时则说明系统已经形成了一个环形,ARPG就是基于这个环形运行的。
至于怎么设置技能CD咱来看到“CD总控”的公共事件。
QQ截图20150203001002.png
注释:
①条件分歧:判断玩家是否使用了技能。
②条件分歧:技能CD长度。
③开关操作:计时完毕后从新初始技能并可以再次使用。

完成了以上,看回“技能施展按键总控”公共事件。
QQ截图20150203001150.png
只要添加上“当××CD开关为OFF时”的条件分歧,就可以实现技能CD了。帅呆了有木有!(大雾)


接下来是系统效果第一部分——技能范围判定。
看到那堆施展条件,看着挺多,归根结底也就两种类型:近身型和范围型。
如果你对RM的坐标系还没有概念,请记住:左上角为原点,越往右X越大,越往下Y越大。
这里都是公式计算,我不讲多,稍稍给大家梳理一下。

近身型:
QQ截图20150203001941.png
如果角色朝向下,近身攻击应该在角色下方一格,那么敌人只有站在这个位置才算是命中。
在角色下方一格,说明敌人的X坐标与玩家X坐标相等,且敌人的Y坐标比玩家Y坐标大1,于是如果满足这些情况,技能就算命中了。
非常要注意的是,这只是其中一个面向判断,你还需要把剩下的3个面向写出来。

范围型:
QQ截图20150203002740.png
假设技能范围为3格,那么就是以玩家为中心,XY坐标分别减去3,如果敌人的XY坐标大于得数,再将玩家的XY坐标从新代入并加上3,如果敌人的XY坐标小于得数,说明敌人站在了技能范围内,技能命中。如果不想从新代入,减去3之后加6也可以,得数是一样的。
范围技能没有面向,所以不需要考虑面向问题。

范例工程只有这两种类型,你肯定想问“如果远程攻击怎么做?”
我只说说公式:
依然假设玩家面朝下,远程攻击是敌人与玩家站在了一条直线上,那么敌人的X坐标是与玩家X坐标相等的。
其次,玩家面向下开枪不可能身后中弹,于是你需要判断敌人的Y坐标是否大于角色的Y坐标。
除此之外,你还可以模仿范围技能的写法给远程攻击设定一个射程,超过射程的敌人不命中。

系统效果第二部分——技能效果。
该系统内,技能只要命中就直接调用公共事件,这样会缩短命中判断的事件长度,方便作者debug。

QQ截图20150204000610.png

QQ截图20150204000834.png

注释:
①开关操作:打开敌人僵直,防止敌人被击时依然可以攻击玩家。
②褐色字体:有关于敌人和玩家的动作表现。
③变量操作:这里是敌人扣血。敌人的血量是采取变量扣血的,至于怎么设置敌人的血量往后会讲到。
④增加HP:这里是指技能消耗。范例游戏中所有技能消耗的都是HP,如果你的游戏存在SP或MP,可以改一改。
⑤慑:这是对特殊技能BUFF(状态)进行消除。因为该技能效果为“让敌人定身,但受到任何伤害都会解除状态”。
⑥这里是打开技能CD计时,“CD上限”的变量是用作可变CD技能的,因为范例中“牙”的技能有这个设定:
QQ截图20150204001913.png
⑦开关操作:如果技能存在如“定身”这类的特殊效果,这个开关则是用来控制敌人的表现的。
⑧GCD控制:记得前面提到的“环”么?“环”的结尾就是这里了。只要技能成功发动,就又会回到GCD的判定。这就成了一个完整地圆环,看到这里你应该可以清楚地了解到这个系统是怎么运行的了。

技能效果还是根据自身需要来设置的,所以你的事件基本功还是很重要的。

剩下第三部分——关键节点命令
关键节点分为“战斗开始”“战斗结算”和“战斗败北”,应该很好理解吧?那咱们按顺序来讲。
首先是战斗开始,这个事件主要不在公共事件内。先关闭数据库,在左下角地图列表找到“系统测试图”,地图上有一个行走图为016-Thief01的事件,这里是我当初用来测试系统的,找到“开启战斗”的选项,那么里面的指令就是对战斗开始的准备。

QQ截图20150204002845.png

注释:
①变量操作:此变量是对敌人的实际HP进行设定,技能命中是扣的是这个变量的数字。
②变量操作:此变量是确定敌人的最大HP,但这个变量在ARPG系统中无用(除非敌人有回血技能),范例里是用于血条系统计算HP百分比的。
③公共事件:初始化ARPG系统的UI,详见公共事件“UI显示”。
④开关操作:正式进入战斗的开关。


“战斗结束”在公共事件内判定,在地图上执行。找到“战斗胜利”公共事件,里面有个判断敌人是否死亡的事件。如果你的游戏存在多个敌人,照着多做几个判断就对了,不过记得加上控制敌人死亡表现的开关。
除此之外,范例工程中满足胜利条件后,会打开“战斗结束”的开关。做什么用的呢?关闭数据库,找到刚刚那个开启战斗的事件,然后翻到第三页。
QQ截图20150205001255.png
注释:
①公共事件:UI的消失,详见公共事件。
②场所移动:可以让UI消失的不那么突然,顺便重置玩家位置。
③公共事件:数据初始化,详见公共事件。


最后,战斗败北。请看到“游戏结束”公共事件。
QQ截图20150208151023.png
注释:
①条件分歧:某支线即使战斗失败也不会Gameover的判断。
②条件分歧:必败战不会Gameover。
③条件分歧:特殊剧情不会Gameover。

_(:з」∠)_这就是全部的系统设置。那么敌人在哪?
在系统测试图看到那只狗了么?那个就是战斗NPC。不过有一点千万要注意!千万要注意!千万要注意!很重要说三遍。这个NPC的事件ID必须是1!如果你的系统敌人有N个,那么ID必须是1、2、3、……、N。为什么?因为技能命中判定指定的就是这几个ID,所以当你确定一张地图内一定会发生战斗时,在其他事件放上去之前一定要先预定好几个战斗NPC。

好了,打开那个NPC,第一页是空的。这是不发生战斗的情况。看到第二页。
QQ截图20150208151718.png
注释:
①出现条件:战斗开启时才会执行。
②移动规则:一般情况下都是这样,除非敌人比较特殊原地不动。
③触发条件:如果移动规则是“接近”,而且敌人攻击模式是近身,那么就要“与事件接触”。注意不是“与主角接触”,至于为什么,你设置成“与主角接触”然后在游戏中站着不动就知道了。
④条件分歧:防止敌人被击时依然能够攻击玩家。
⑤指令:敌人的攻击表现。

剩下的几页都是敌人被玩家用控制技能控制时的表现。因为范例中玩家技能比较少,所以多用了几个事件页来更精致地表现敌人被控。如果你的技能稍多或者敌人稍多,可以在控制技能命中敌人时打开一个总开关,这样可以让事件页好看一些,不过记得每个敌人对应一个被控制的开关,因为如果开关通用会发生一个被控全部停下的现象。

以上就是全部的ARPG系统剖析,有些人在ARPG战斗结束后喜欢加上战斗评分,那么该怎么设置呢?

看到公共事件“战斗评分”,这些我不解释应该都懂,主要是计算公式各位需要明白怎么算。


[box=RoyalBlue]结束[/box]
于是你也有能力做出一款ARPG啦(~ ̄▽ ̄)ノ很开心否?还是看不懂?…………[/fold]

点评

_(:з」∠)_工程里面有测试地图,可以直接看那张地图里面的战斗NPC呀。另外看不到字是没装字体文件,游戏目录下就有。  发表于 2017-1-10 20:26
本来只是想打开看看这ACT系统,结果要过剧情,接着看不到字一脸懵逼,又被只野猫打成SB,读档数次怒关游戏。。。这新手关(吐血)  发表于 2017-1-10 18:08
回复 2 0

使用道具 举报

梦石
0
星屑
2310
在线时间
5539 小时
注册时间
2011-1-10
回帖
6353

青铜编剧史诗剧作家剧作品鉴家

 楼主| 发表于 2015-1-27 18:46:37 | 显示全部楼层
本帖最后由 H·H·Y 于 2015-3-8 00:54 编辑

[fold=No.8:喵氏事件CP式回合制][box=RoyalBlue]No.8:喵氏事件CP式回合制[/box]

[box=RoyalBlue]导言[/box]
各位好久不见。因为过年很多事情要忙,这一篇教程也不是特别重要,所以延长了更新时间。
此系统纯属脑洞产物,唯一一次使用到的是在R考场第二期的时候。题目要求将战斗改为横版,当时我并没有足够的能力制作横版战斗,于是花了点时间用事件做成横版。
该系统推荐使用在战斗不多的R剧上。如果R剧里面存在战斗,不想让战斗乏味缺乏表现力,而自己又没有能力写太华丽的脚本战斗系统,就可以考虑一下使用这个。

系统完善度 ★★☆
学习难度★★★★☆
学习时间 30分钟-1小时
范例工程R考场第二期答卷


QQ截图20150308005244.png


[box=RoyalBlue]要点[/box]
没有特难的要点,主要是数据的导入和公式设定比较麻烦,需要一点耐心。

[box=RoyalBlue]开始[/box]
惯例翻开公共事件,先看一看系统数量有多少。
QQ截图20150223174413.png
一整列公共事件看下来似乎有点吓人,其实真正核心的地方大都不在其中。如果你了解过一些脚本,你可以把这些公共事件看做一个个def,也就是方法定义,基本都是从其他事件内调用,不会自动执行。

这个系统我也不知道怎么讲解好,毕竟第一次做纯事件回合制,我自己都有点乱。既然如此我们就循序渐进,先从系统启动的地方开始讲起吧。
找到“洞穴陷阱”的地图,下方洞穴出口处有一个冰女,这个就是战斗开始的地方。
QQ截图20150223175250.png
注释:
①公共事件:调用了公共事件,待会再说明。
②变量操作:此处是代入敌人的能力值数据,能力值类型可以自己设置。因为这个系统的伤害公式都是自己定的。
③开关操作:进入战斗的标志开关,告诉核心系统已经开始战斗了。

了解后,看到上面那两个事件。
QQ截图20150223175559.png
QQ截图20150223175611.png

这两位其实是战斗NPC,他们会在战斗开始的时候作为敌人或队友出现。大家都能懂不必多说吧?

然后是关于战斗数据初始化的公共事件。
打开公共事件找到“战斗前准备”。
QQ截图20150223175905.png
首先将呼出菜单禁止防止玩家在战斗时呼出菜单扰乱系统。然后再看到两个调用的公共事件。
QQ截图20150223180229.png
显示图片是对队友和敌人的血条UI进行初始化。
变量计算……嗯……这个要注意一下。
这个是对全体战斗人员的速度总值进行计算。具体用来做什么的呢,下面的回合行动会讲到。

QQ截图20150223180235.png
能力值导入是……玩家队伍的角色能力值导入。可能有点多,但这是纯事件,不可避免……

接下来就是回合控制的核心指令了。打开公共事件,找到“行动顺序”公共事件。
QQ截图20150223175935.png
注释:
①条件分歧:判断是否在回合中。也就是判断是否有战斗人员在进行行动。
②敌人全灭处理:当敌人的HP全部为0以下,就将数据全部重置。此处敌人只有1个所以只有一次分歧。

再往下看,就是决定具体到哪个人的回合的判定了。
QQ截图20150223180955.png
注释:
①HP判断:判断队友HP是否大于1,也就是判断有没有死掉,如果还活着就参与回合计算。
②变量操作:记得CP战斗一般都带着个行动条么,谁的头像到了尽头就是谁的回合。这个系统看不到CP条,但是战斗顺序就是有这个决定的。你可以把这个变量加法看成CP条,数值越大,则角色离行动时机就越近。
③变量操作:这里没有死亡判定。因为之前已经判定了敌人死了没有,不过要注意,如果敌人队伍存在2个以上的敌人,就要分别加判定了。
④开始行动:如果关于角色回合进度的变量数值大于全员的速度总值,就轮到这个人行动。讲到这里大家看得出这个系统的行动顺序算法了么?如果还不清楚我就明明白白讲一遍。行动顺序的决定公式是,每个人都不断对自身的速度值进行累加,如果累加到超过了全体战斗人员的速度总值,就将累加值清零,并开始回合行动。虽然这个算法不一定最优,但是基本可以实现CP战斗了。

QQ截图20150223182050.png
注释:
①条件分歧:这是对特殊BUFF进行的特殊处理。此处是敌人中了睡眠BUFF,也就是如果轮到此敌人行动,则直接将速度累计值清零而不行动。

以上就是控制回合顺序的算法,但具体的行动指令还是在地图上。
QQ截图20150223182321.png
QQ截图20150223182420.png
注释:
①出现条件:直接设置成对应开关即可。
②自动执行:可以防止玩家乱走。
③信息读取:利用显示文章将当前角色的具体信息显示出来。
④公共事件:这里是技能的伤害公式,公式多变,根据实际需要设置。具体请看对应公共事件。另外说一下,公共事件里面的脚本只是用来显示伤害数值的,可有可无,不影响整个系统。
⑤公共事件:每一次行动结束后都要执行的公共事件,用来重置角色回合,否则角色会不断行动。

[box=RoyalBlue]结束[/box]
好了,以上就是全部要点,剩下的都是一些举一反三的内容了。
那么到这里全部教程就结束了,感谢大家的支持。[/fold]
回复

使用道具 举报

梦石
0
星屑
2310
在线时间
5539 小时
注册时间
2011-1-10
回帖
6353

青铜编剧史诗剧作家剧作品鉴家

 楼主| 发表于 2015-1-27 18:46:58 | 显示全部楼层
本帖最后由 H·H·Y 于 2019-3-21 17:33 编辑

[fold=No.9:结束语][box=RoyalBlue]No.9:结束语[/box]

[box=RoyalBlue]导言[/box]
无视下面的表格,吓唬人的233333。

系统完善度 N/A
学习难度N/A
学习时间 5分钟
范例工程N/A


[box=RoyalBlue]结束语[/box]
        我从小学六年级开始接触RM,到现在细细数来,RM已经陪伴了我5个春夏秋冬。大部分的时间,我在研究事件系统。
        也就是这个原因,我做出来的作品五根手指数的出来,不过也多亏了这个,我留下的黑历史并不太多_(:з」∠)_嗯,并且每一部作品都是一次飞跃。
        不过到现在想想,虽然纯事件给了我很多,但也是时候该放下了。我在事件系统砸了太多的时间,于是脚本和美工方面被我忽略了,更严重的是,由于纯事件局限性很多,有时候一些简单的问题也要十分绕的方法做出来。以前不觉得什么,不过现在学了脚本,感受到深受其害啊。写个脚本用纯事件思路结果弄了一堆不必要的程序什么的……
        丢下了这些,确实是感觉进步快了许多,尤其是美工方面,不瞒你说,一年前我的水平是这样的,真的是这样的。
        所以各位事件党们,不必太过执着与纯事件,也不要认为自己学不会脚本,不要认为自己除了事件一无是处。RM的世界很广大,只要你放开心情四处转转,总能找到新的闪光点的。
        那么这里的所有教程就都告一段落了,希望我以后能够写出脚本教程,做出更好的Logo,也希望各位RMer步步高升,祝66RPG……什么66RPG,祝Project1越办越好~

——By H·H·Y

2015.2.23

[/fold]
回复 1 1

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部