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

Project1

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

[已经解决] 如何用脚本定义战斗

[复制链接]

Lv2.观梦者

梦石
0
星屑
538
在线时间
254 小时
注册时间
2010-8-25
帖子
371
跳转到指定楼层
1
发表于 2014-2-28 18:34:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
如果直接
RUBY 代码复制
  1. $scene = Scene_Battle.new


这样肯定报错的,请问应该怎么定义?

求问

点评

已经编辑4L答案  发表于 2014-3-1 18:16

Lv4.逐梦者 (版主)

梦石
0
星屑
9497
在线时间
5073 小时
注册时间
2013-6-21
帖子
3580

开拓者贵宾剧作品鉴家

2
发表于 2014-2-28 19:38:37 | 只看该作者
原因是战斗开始之前要有很多准备工作,包括设置敌人队伍,设置是否可以逃跑等等,这些如果没有设置好就直接进入战斗场景当然会报错。

我提示你一个方法,你可以按照这个思路找找脚本。

方法一:首先,事件[战斗处理]是能够直接进入战斗的,关于[战斗处理]在脚本的解释器类 Interpreter 中,在 Interpreter2 分割定义里面有所有命令代码的标志,在这里我们看到[战斗处理]是command_301,找到它的定义之后就会看到以下代码:
  1.   def command_301
  2.     # 如果不是无效的队伍
  3.     if $data_troops[@parameters[0]] != nil
  4.       # 设置中断战斗标志
  5.       $game_temp.battle_abort = true
  6.       # 设置战斗调用标志
  7.       $game_temp.battle_calling = true
  8.       $game_temp.battle_troop_id = @parameters[0]
  9.       $game_temp.battle_can_escape = @parameters[1]
  10.       $game_temp.battle_can_lose = @parameters[2]
  11.       # 设置返回调用
  12.       current_indent = @list[@index].indent
  13.       $game_temp.battle_proc = Proc.new { |n| @branch[current_indent] = n }
  14.     end
  15.     # 推进索引
  16.     [url=home.php?mod=space&uid=370741]@Index[/url] += 1
  17.     # 结束
  18.     return false
  19.   end
复制代码
在这里设置了许多临时变量,但是并没有看到场面转移到战斗画面的迹象,其实不是这样的,注意中间的那个设置战斗调用标志,$game_temp.battle_calling = true,搜索之,看到在Scene_Map下有与之相关的字段:
  1.     # 不在主角移动中的情况下
  2.     unless $game_player.moving?
  3.       # 执行各种画面的调用
  4.       if $game_temp.battle_calling
  5.         call_battle
  6.       elsif $game_temp.shop_calling
  7.         call_shop
  8.       elsif $game_temp.name_calling
  9.         call_name
  10.       elsif $game_temp.menu_calling
  11.         call_menu
  12.       elsif $game_temp.save_calling
  13.         call_save
  14.       elsif $game_temp.debug_calling
  15.         call_debug
  16.       end
  17.     end
复制代码
以及下面的call_battle方法:
  1.   def call_battle
  2.     # 清除战斗调用标志
  3.     $game_temp.battle_calling = false
  4.     # 清除菜单调用标志
  5.     $game_temp.menu_calling = false
  6.     $game_temp.menu_beep = false
  7.     # 生成遇敌计数
  8.     $game_player.make_encounter_count
  9.     # 记忆地图 BGM 、停止 BGM
  10.     $game_temp.map_bgm = $game_system.playing_bgm
  11.     $game_system.bgm_stop
  12.     # 演奏战斗开始 SE
  13.     $game_system.se_play($data_system.battle_start_se)
  14.     # 演奏战斗 BGM
  15.     $game_system.bgm_play($game_system.battle_bgm)
  16.     # 矫正主角姿势
  17.     $game_player.straighten
  18.     # 切换到战斗画面
  19.     $scene = Scene_Battle.new
  20.   end
复制代码
在这里我们看到了画面跳转的语句,但是在这之前还要记录地图BGM并且演奏战斗BGM。
方法二:在编辑模式中,“战斗测试”可以进入战斗场景,搜索之,在Scene_Title里面:
  1.   def battle_test
  2.     # 载入数据库 (战斗测试用)
  3.     $data_actors        = load_data("Data/BT_Actors.rxdata")
  4.     $data_classes       = load_data("Data/BT_Classes.rxdata")
  5.     $data_skills        = load_data("Data/BT_Skills.rxdata")
  6.     $data_items         = load_data("Data/BT_Items.rxdata")
  7.     $data_weapons       = load_data("Data/BT_Weapons.rxdata")
  8.     $data_armors        = load_data("Data/BT_Armors.rxdata")
  9.     $data_enemies       = load_data("Data/BT_Enemies.rxdata")
  10.     $data_troops        = load_data("Data/BT_Troops.rxdata")
  11.     $data_states        = load_data("Data/BT_States.rxdata")
  12.     $data_animations    = load_data("Data/BT_Animations.rxdata")
  13.     $data_tilesets      = load_data("Data/BT_Tilesets.rxdata")
  14.     $data_common_events = load_data("Data/BT_CommonEvents.rxdata")
  15.     $data_system        = load_data("Data/BT_System.rxdata")
  16.     # 重置测量游戏时间用的画面计数器
  17.     Graphics.frame_count = 0
  18.     # 生成各种游戏对像
  19.     $game_temp          = Game_Temp.new
  20.     $game_system        = Game_System.new
  21.     $game_switches      = Game_Switches.new
  22.     $game_variables     = Game_Variables.new
  23.     $game_self_switches = Game_SelfSwitches.new
  24.     $game_screen        = Game_Screen.new
  25.     $game_actors        = Game_Actors.new
  26.     $game_party         = Game_Party.new
  27.     $game_troop         = Game_Troop.new
  28.     $game_map           = Game_Map.new
  29.     $game_player        = Game_Player.new
  30.     # 设置战斗测试用同伴
  31.     $game_party.setup_battle_test_members
  32.     # 设置队伍 ID、可以逃走标志、战斗背景
  33.     $game_temp.battle_troop_id = $data_system.test_troop_id
  34.     $game_temp.battle_can_escape = true
  35.     $game_map.battleback_name = $data_system.battleback_name
  36.     # 演奏战斗开始 BGM
  37.     $game_system.se_play($data_system.battle_start_se)
  38.     # 演奏战斗 BGM
  39.     $game_system.bgm_play($game_system.battle_bgm)
  40.     # 切换到战斗画面
  41.     $scene = Scene_Battle.new
  42.   end
复制代码
前面那些都是基础工作,但是我们仍可以看到,在战斗之前要设置角色(如果已经在游戏中可不必设置),设置敌人队伍,战斗中标志,允许逃跑,播放BGM,所以你就应该知道怎么去调用Scene_Battle了

点评

我写了很多脚本了,所以不用说什么教程了,只希望来个比较简单的方法  发表于 2014-2-28 22:54
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
538
在线时间
254 小时
注册时间
2010-8-25
帖子
371
3
 楼主| 发表于 2014-2-28 23:13:09 | 只看该作者
RyanBern 发表于 2014-2-28 19:38
原因是战斗开始之前要有很多准备工作,包括设置敌人队伍,设置是否可以逃跑等等,这些如果没有设置好就直接 ...

主要是用脚本去定义敌人队伍,我定义一个空的敌人队伍,然后通过脚本添加敌人结果报错
回复 支持 反对

使用道具 举报

Lv4.逐梦者 (版主)

梦石
0
星屑
9497
在线时间
5073 小时
注册时间
2013-6-21
帖子
3580

开拓者贵宾剧作品鉴家

4
发表于 2014-3-1 09:16:44 | 只看该作者
本帖最后由 RyanBern 于 2014-3-1 18:16 编辑
zxc3824 发表于 2014-2-28 23:13
主要是用脚本去定义敌人队伍,我定义一个空的敌人队伍,然后通过脚本添加敌人结果报错 ...


试试这句:
  1. $game_temp.battle_troop_id = 1
  2. $game_temp.battle_can_escape = true
  3. $scene = Scene_Battle.new
复制代码
另外敌人队伍是在进入Scene_Battle之后才建立起来的,所以开始之前就添加敌人是有问题的。并且即使你临时设置敌人队伍的方式成功了,对Scene_Battle的改动也是相当大,因为你没有初始化Scene_Battle的@troop_id,导致很多循环都无法进行。因此比较简单的做法就是利用数据库的现成的队伍初始化战斗场景,就像上面那样。


意思就是利用脚本进行类似数据库编辑的操作(以操作1号队伍为例):
  1. troop = RPG::Troop.new
  2. troop.id = 1
  3. # 添加敌人(以添加2个1号敌人为例)
  4. for i in 0..1
  5.   # 生成新成员
  6.   member = RPG::Troop::Member.new
  7.   # 设置敌人编号
  8.   member.enemy_id = 1
  9.   # 设置 X 坐标
  10.   member.x = 160 + 160 * i
  11.   # 设置 Y 坐标
  12.   member.y = 320
  13.   troop.members.push(member)
  14. end
  15. $data_troops[1] = troop
复制代码

注:1)这种方法临时定义的队伍无法在数据库中保存,退出游戏之后会消失。
       2)里面没有考虑存在战斗事件的情况,如果存在战斗事件,设置的脚本会变得很长很麻烦,具体内容请参考RPG::Troop,RPG::Troop::Page,RPG::Troop::Page::Condition


另外麻烦LZ之后问问题说得明白些,现在这个帖子的内容和你在主楼问的已经差的很远,既然你不是新手,那么应该明白如何提问才能得到准确的答案,你说对不对?

点评

这个我也会的,只是我在数据库里面定义了一个空的敌人队伍,我想通过脚本给这个空队伍添加敌人  发表于 2014-3-1 13:30

评分

参与人数 1星屑 +180 收起 理由
myownroc + 180 认可答案

查看全部评分

回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
538
在线时间
254 小时
注册时间
2010-8-25
帖子
371
5
 楼主| 发表于 2014-3-1 20:06:34 | 只看该作者
RyanBern 发表于 2014-3-1 09:16
试试这句:另外敌人队伍是在进入Scene_Battle之后才建立起来的,所以开始之前就添加敌人是有问题的。并且 ...

不用事件的,因为没有必要的,谢谢了,认可答案,呼叫版主ba
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-4-27 01:10

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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