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

Project1

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

战斗+图片?

 关闭 [复制链接]
头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2006-12-6
帖子
79
跳转到指定楼层
1
发表于 2007-7-27 00:39:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
提示: 作者被禁止或删除 内容自动屏蔽
头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
0 小时
注册时间
2006-12-6
帖子
79
2
 楼主| 发表于 2007-7-27 00:39:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
提示: 作者被禁止或删除 内容自动屏蔽

Lv1.梦旅人

百魅大侠

梦石
0
星屑
50
在线时间
1 小时
注册时间
2006-6-9
帖子
615
3
发表于 2007-7-27 00:42:11 | 只看该作者
  1. 23种战斗特效的公共事件版(实践)

  2. 发表日期:2005-10-14  阅读:3233次
  3.  
  4. 作者          SailCat(中国大陆)         版本与更新        本实践的理论部分点此进入

  5. 相关网址         
  6. 范例工程        不提供
  7. ________________________________________

  8. 教程内容
  9. 作者: SailCat     时间: 2005-9-17 02:50 PM    标题: 23种战斗特效的公共事件版(Perfect!)
  10. 更新于9.18夜
  11. 更新说明:
  12. 1.视觉效果99%完美化(除了“消耗HP发动”仍然有一个先刷新消耗过SP的窗口再改消耗HP外,所有视觉效果均与一般内置技能无异)
  13. 2.加了三个脚本,魔封那个纯粹是偷了FF6的创意和设定
  14. 3.经过严格的测试,现在技能如果不命中不会再出错了,加了一堆关于系统返回伤害值是否为一个整数的判断(凡是打击后效果的那些事件)
  15. 4.如果你想要其他效果请和我联系,只要不是太复杂的算法,我可以现场写一段给你,包括反击在内都已经实现了,但是因为公共事件毕竟还是有局限性,从动画上不太好体现出来(当然精心设置还是可以的,因为我把公共事件插在这里已经完全能够重新定义攻击者和被攻击者)……
  16. 5.怎么说呢,和上一个版本相比兼容性是一模一样的。但是和其他脚本的冲突不能说没有,毕竟最大的系统修改是挪动了公共事件的执行顺序,我没有在RTAB里测试这个东西。可能用了这个以后公共事件在战斗中就不能拿来干其他事情了……不过我想知道会有人需要拿技能附加的公共事件做除了这个事以外的其他事么。。。?

  17. 步骤1:将以下脚本插入到Main之前。
  18. class Game_Battler
  19.   #--------------------------------------------------------------------------
  20.   # ● 定义实例变量
  21.   #--------------------------------------------------------------------------
  22.   attr_reader   :last_hp                  # 受效前的HP
  23. end
  24. class Scene_Battle
  25.   #--------------------------------------------------------------------------
  26.   # ● 定义实例变量
  27.   #--------------------------------------------------------------------------
  28.   attr_accessor :target_battlers
  29.   attr_accessor :active_battler
  30.   attr_reader :skill
  31.   #--------------------------------------------------------------------------
  32.   # ● 刷新画面
  33.   #--------------------------------------------------------------------------
  34.   def update
  35.     # 执行战斗事件中的情况下
  36.     if $game_system.battle_interpreter.running?
  37.       # 刷新解释器
  38.       $game_system.battle_interpreter.update
  39.       # 强制行动的战斗者不存在的情况下
  40.       if $game_temp.forcing_battler == nil
  41.         # 执行战斗事件结束的情况下
  42.         unless $game_system.battle_interpreter.running?
  43.           # 继续战斗的情况下、再执行战斗事件的设置
  44.           unless @common_event_id != 0
  45.             unless judge
  46.               setup_battle_event
  47.             end
  48.           end
  49.         end
  50.         # 如果不是结束战斗回合的情况下
  51.         if @phase != 5 and @common_event_id == 0
  52.           # 刷新状态窗口
  53.           @status_window.refresh
  54.         end
  55.       end
  56.     end
  57.     # 系统 (计时器)、刷新画面
  58.     $game_system.update
  59.     $game_screen.update
  60.     # 计时器为 0 的情况下
  61.     if $game_system.timer_working and $game_system.timer == 0
  62.       # 中断战斗
  63.       $game_temp.battle_abort = true
  64.     end
  65.     # 刷新窗口
  66.     @help_window.update
  67.     @party_command_window.update
  68.     @actor_command_window.update
  69.     @status_window.update
  70.     @message_window.update
  71.     # 刷新活动块
  72.     @spriteset.update
  73.     # 处理过渡中的情况下
  74.     if $game_temp.transition_processing
  75.       # 清除处理过渡中标志
  76.       $game_temp.transition_processing = false
  77.       # 执行过渡
  78.       if $game_temp.transition_name == ""
  79.         Graphics.transition(20)
  80.       else
  81.         Graphics.transition(40, "Graphics/Transitions/" +
  82.           $game_temp.transition_name)
  83.       end
  84.     end
  85.     # 显示信息窗口中的情况下
  86.     if $game_temp.message_window_showing
  87.       return
  88.     end
  89.     # 显示效果中的情况下
  90.     if @spriteset.effect?
  91.       return
  92.     end
  93.     # 游戏结束的情况下
  94.     if $game_temp.gameover
  95.       # 切换到游戏结束画面
  96.       $scene = Scene_Gameover.new
  97.       return
  98.     end
  99.     # 返回标题画面的情况下
  100.     if $game_temp.to_title
  101.       # 切换到标题画面
  102.       $scene = Scene_Title.new
  103.       return
  104.     end
  105.     # 中断战斗的情况下
  106.     if $game_temp.battle_abort
  107.       # 还原为战斗前的 BGM
  108.       $game_system.bgm_play($game_temp.map_bgm)
  109.       # 战斗结束
  110.       battle_end(1)
  111.       return
  112.     end
  113.     # 等待中的情况下
  114.     if @wait_count > 0
  115.       # 减少等待计数
  116.       @wait_count -= 1
  117.       return
  118.     end
  119.     # 强制行动的角色存在、
  120.     # 并且战斗事件正在执行的情况下
  121.     if $game_temp.forcing_battler == nil and
  122.        $game_system.battle_interpreter.running?
  123.       return
  124.     end
  125.     # 回合分支
  126.     case @phase
  127.     when 1  # 自由战斗回合
  128.       update_phase1
  129.     when 2  # 同伴命令回合
  130.       update_phase2
  131.     when 3  # 角色命令回合
  132.       update_phase3
  133.     when 4  # 主回合
  134.       update_phase4
  135.     when 5  # 战斗结束回合
  136.       update_phase5
  137.     end
  138.   end
  139.   #--------------------------------------------------------------------------
  140.   # ● 刷新画面 (主回合步骤 3 : 行动方动画)
  141.   #--------------------------------------------------------------------------
  142.   def update_phase4_step3
  143.     # 行动方动画 (ID 为 0 的情况下是白色闪烁)
  144.     if @animation1_id == 0
  145.       @active_battler.white_flash = true
  146.     else
  147.       @active_battler.animation_id = @animation1_id
  148.       @active_battler.animation_hit = true
  149.     end
  150.     # 公共事件 ID 有效的情况下
  151.     if @common_event_id > 0
  152.       # 设置事件
  153.       common_event = $data_common_events[@common_event_id]
  154.       $game_system.battle_interpreter.setup(common_event.list, 0)
  155.     end
  156.     # 移至步骤 4
  157.     @phase4_step = 4
  158.   end
  159.   #--------------------------------------------------------------------------
  160.   # ● 刷新画面 (主回合步骤 5 : 显示伤害)
  161.   #--------------------------------------------------------------------------
  162.   def update_phase4_step5
  163.     # 隐藏帮助窗口
  164.     @help_window.visible = false
  165.     # 刷新状态窗口
  166.     @status_window.refresh
  167.     # 显示伤害
  168.     for target in @target_battlers
  169.       if target.damage != nil
  170.         target.damage_pop = true
  171.       end
  172.     end
  173.     if @active_battler.damage != nil
  174.       @active_battler.damage_pop = true
  175.     end
  176.     # 移至步骤 6
  177.     @phase4_step = 6
  178.   end
  179.   #--------------------------------------------------------------------------
  180.   # ● 刷新画面 (主回合步骤 6 : 刷新)
  181.   #--------------------------------------------------------------------------
  182.   def update_phase4_step6
  183.     # 清除强制行动对像的战斗者
  184.     $game_temp.forcing_battler = nil
  185.     # 移至步骤 1
  186.     @phase4_step = 1
  187.   end
  188. end
  189. 步骤2:以下两种做法任选一种,推荐第一种:
  190.   做法一:定位到系统脚本的Game_Battler 2部分,第106行,该行内容是:
  191.         unless movable?
  192.         如果不是,可以用Ctrl+F搜索该行。将内容改为:
  193.         unless movable? or hp0?
  194.   做法二:在数据库中,更改“战斗不能”的行动限制为“无限制”

  195. 步骤3:这些公共事件的用法
  196.   想要哪个效果,就复制哪个效果的脚本。
  197.   将你要用到的效果脚本全部粘贴到同一个公共事件中
  198.   把要实现效果的技能的公共事件设为该事件
  199.   用条件分歧(以技能名称为条件)来实现不同的效果
  200.   这样做有两点好处:
  201.   1. 允许一个技能多重效果(当然,要注意一下排放的先后顺序问题),优先级如下:
  202.      有修改攻击范围的最优先,其次是修改伤害计算法则的,最后是只含有附加效果的
  203.   2. 节省公共事件,也就是节省内存

  204. 一、全体化(效果:攻击范围=被攻击方全体):
  205. 脚本段落1(还原):
  206. for t in $scene.target_battlers
  207.   t.hp = t.last_hp
  208. end
  209. 脚本段落2(全体化对象):
  210. @a=$scene.active_battler
  211. n=[]
  212. if @a.is_a?(Game_Enemy)
  213.   for actor in $game_party.actors
  214.     n.push(actor) if actor.exist?
  215.   end
  216. else
  217.   for enemy in $game_troop.enemies
  218.     n.push(enemy) if enemy.exist?
  219.   end
  220. end
  221. $scene.target_battlers=n
  222. 脚本段落3(应用效果):
  223. s=$scene.skill
  224. for t in $scene.target_battlers
  225.   t.skill_effect(@a,s)
  226. end
  227. 备注:这个不如直接在技能效果范围里设定了……
  228. 二、全域化(效果:攻击范围=被攻击方全体+攻击方全体):
  229. 脚本段落1(还原&全域化对象):
  230. for t in $scene.target_battlers
  231.   t.hp = t.last_hp
  232. end
  233. n=[]
  234. for actor in $game_party.actors
  235.   n.push(actor) if actor.exist?
  236. end
  237. for enemy in $game_troop.enemies
  238.   n.push(enemy) if enemy.exist?
  239. end
  240. $scene.target_battlers=n
  241. 脚本段落2(应用效果):
  242. a=$scene.active_battler
  243. s=$scene.skill
  244. for t in $scene.target_battlers
  245.   t.skill_effect(a,s)
  246. end
  247. 三、敌方随机(效果:攻击范围=被攻击方随机选定单体):
  248. 脚本段落1(还原&随机化):
  249. for t in $scene.target_battlers
  250.   t.hp = t.last_hp
  251. end
  252. @a=$scene.active_battler
  253. if @a.is_a?(Game_Enemy)
  254.   t=$game_party.random_target_actor
  255. else
  256.   t=$game_troop.random_target_enemy
  257. end
  258. $scene.target_battlers=[t]
  259. 脚本段落2(应用效果):
  260. s=$scene.skill
  261. for t in $scene.target_battlers
  262.   t.skill_effect(@a,s)
  263. end
  264. 四、我方随机(效果:攻击范围=攻击方随机选定单体):
  265. 脚本段落1(还原&随机化):
  266. for t in $scene.target_battlers
  267.   t.hp = t.last_hp
  268. end
  269. @a=$scene.active_battler
  270. if @a.is_a?(Game_Actor)
  271.   t=$game_party.random_target_actor
  272. else
  273.   t=$game_troop.random_target_enemy
  274. end
  275. $scene.target_battlers=[t]
  276. 脚本段落2(应用效果):
  277. s=$scene.skill
  278. for t in $scene.target_battlers
  279.   t.skill_effect(@a,s)
  280. end
  281. 五、对象随机(效果:攻击范围=攻击方+被攻击方随机选定单体):
  282. 脚本段落1(还原&随机化):
  283. for t in $scene.target_battlers
  284.   t.hp = t.last_hp
  285. end
  286. n=[]
  287. for actor in $game_party.actors
  288.   n.push(actor) if actor.exist?
  289. end
  290. for enemy in $game_troop.enemies
  291.   n.push(enemy) if enemy.exist?
  292. end
  293. $scene.target_battlers=[n[rand(n.size)]]
  294. 脚本段落2(应用效果):
  295. a=$scene.active_battler
  296. s=$scene.skill
  297. for t in $scene.target_battlers
  298.   t.skill_effect(a,s)
  299. end
  300. 六、HP吸收(效果:攻击者增加等同于伤害值的HP,对不死系(属性9)反效果):
  301. a = $scene.active_battler
  302. for t in $scene.target_battlers
  303.   f=t.damage
  304.   f=0 unless t.damage.is_a?(Integer)
  305.   if t.element_rate(9)>=150
  306.     t.hp=t.last_hp+f;a.hp-=f
  307.     a.damage=t.damage;t.damage=-f if f!=0
  308.   else
  309.     a.hp+=f; a.damage=-f if f!=0
  310.   end
  311. end
  312. $scene.active_battler = a
  313. 七、SP伤害(效果:本来伤害到对方HP上的改成伤害到SP上):
  314. for t in $scene.target_battlers
  315.   t.hp=t.last_hp
  316.   t.sp-=t.damage if t.damage.is_a?(Integer)
  317. end
  318. 八、SP同等伤害(效果:对方损失多少HP,就等量损失多少SP):
  319. for t in $scene.target_battlers
  320.   t.sp-=t.damage if t.damage.is_a?(Integer)
  321. end

  322. 九、SP吸收(效果:本来伤害到对方HP上的改到伤害到SP上,攻击者增加等同于伤害值的SP,对不死系(属性9)反效果):
  323. 脚本段落1(还原&SP伤害):
  324. for t in $scene.target_battlers
  325.   t.hp=t.last_hp
  326.   if t.damage.is_a?(Integer)
  327.     if t.element_rate(9)>=150
  328.       t.sp+=t.damage
  329.       t.damage=-t.damage
  330.     else
  331.       t.sp-=t.damage
  332.     end
  333.   end
  334. end
  335. 脚本段落2(SP吸收):
  336. a = $scene.active_battler
  337. for t in $scene.target_battlers
  338.   f=t.damage; f=0 unless f.is_a?(Integer)
  339.   if t.element_rate(9)>=150
  340.     a.damage=f
  341.     a.sp-=a.damage
  342.   else
  343.     a.damage=-f
  344.     a.sp-=a.damage
  345.   end
  346. end
  347. $scene.active_battler = a
  348. 九、消耗HP发动(效果:本来是消耗SP发动的技能改为消耗HP来发动):
  349. a = $scene.active_battler
  350. s = $scene.skill
  351. a.sp+=s.sp_cost
  352. a.hp-=s.sp_cost
  353. $scene.active_battler = a
  354. 十、比例伤害(效果:按对方现有HP定比例伤害,比例值为技能在数据库中的威力值,属性&防御有效):
  355. s = $scene.skill
  356. for t in $scene.target_battlers
  357.   t.hp=t.last_hp
  358.   e=t.elements_correct(s.element_set)
  359.   t.damage=t.hp*s.power*e/10000
  360.   t.damage/=2 if t.guarding?
  361.   t.hp-=t.damage
  362. end
  363. 十一、最大HP比例(效果:按对方最大HP定比例伤害,比例值为技能在数据库中的威力值,属性有效,防御无效):
  364. s = $scene.skill
  365. for t in $scene.target_battlers
  366.   t.hp=t.last_hp
  367.   e=t.elements_correct(s.element_set)
  368.   t.damage=t.maxhp*s.power*e/10000
  369.   t.hp-=t.damage
  370. end
  371. 十二、HP差分比例(效果:按(对方最大HP-现有HP)的差值定比例伤害,比例值为技能在数据库中的威力值,属性&防御无效):
  372. s = $scene.skill
  373. for t in $scene.target_battlers
  374.   t.hp=t.last_hp
  375.   t.damage=(t.maxhp-t.hp)*s.power/100
  376.   t.hp-=t.damage
  377. end
  378. 十三、自身HP比例(效果:按攻击者现有HP定比例伤害,比例值为技能在数据库中的威力值,属性&防御有效):
  379. s = $scene.skill
  380. a = $scene.active_battler
  381. for t in $scene.target_battlers
  382.   t.hp=t.last_hp
  383.   e=t.elements_correct(s.element_set)
  384.   t.damage=a.hp*s.power*e/10000
  385.   t.damage/=2 if t.guarding?
  386.   t.hp-=t.damage
  387. end
  388. 十四、自身最大HP比例(效果:按攻击者最大HP定比例伤害,比例值为技能在数据库中的威力值,属性&防御无效):
  389. s = $scene.skill
  390. a = $scene.active_battler
  391. for t in $scene.target_battlers
  392.   t.hp=t.last_hp
  393.   t.damage=a.maxhp*s.power/100
  394.   t.hp-=t.damage
  395. end
  396. 十五、自身HP差分比例(效果:按(攻击者最大HP-现有HP)的差值定比例伤害,比例值为技能在数据库中的威力值,属性有效,防御无效):
  397. s = $scene.skill
  398. a = $scene.active_battler
  399. for t in $scene.target_battlers
  400.   t.hp=t.last_hp
  401.   e=t.elements_correct(s.element_set)
  402.   t.damage=(a.maxhp-a.hp)*s.power*e/10000
  403.   t.hp-=t.damage
  404. end
  405. 十六、舍命一击(效果:攻击者攻击后死亡):
  406. $scene.active_battler.hp=0
  407. 十七、二次攻击(效果:同一种技能连续攻击两次):
  408. s = $scene.skill
  409. a = $scene.active_battler
  410. for t in $scene.target_battlers
  411.   d = t.last_hp
  412.   t.skill_effect(a,s)
  413.   t.damage = d - t.hp
  414.   t.damage = "Miss" if d==t.hp
  415. end
  416. 十八、必定会心一击(效果:永远造成会心一击):
  417. for t in $scene.target_battlers
  418.   if t.damage.is_a?(Integer)
  419.     t.critical=true
  420.     t.hp-=t.damage
  421.     t.damage*=2
  422.   end
  423. end
  424. 十九、反射(效果:若被攻击者带反射状态,则将技能效果返还给对方随机一名队员,反射状态请先在数据库中设定,这里预设值为15号状态):
  425. 脚本段落1(还原&对象重确认):
  426. c=$scene.target_battlers
  427. for t in $scene.target_battlers
  428.   t.hp=t.last_hp
  429.   if t.state?(14)
  430.     c.delete(t)
  431.     a=(t.is_a?(Game_Enemy))?true:false
  432.     b= !a
  433. c.push($game_party.random_target_actor) if a
  434. c.push($game_troop.random_target_enemy) if b
  435.   end
  436. end
  437. $scene.target_battlers=c
  438. 脚本段落2(重新应用技能效果):
  439. a=$scene.active_battler
  440. s=$scene.skill
  441. for t in $scene.target_battlers
  442.   t.skill_effect(a,s)
  443. end
  444. 二十、金钱投掷(效果:攻击方减少等同于伤害值千分比的金钱,这个比例在技能的分散度里设定(0-100对应0-10%),该技能的伤害值预设为150*(技能威力+攻击者等级-敌人防御),公式可以修改):
  445. 条件分歧: 脚本: $scene.active_battler.is_a?(Game_Actor)
  446.   脚本段落:
  447.   s=$scene.skill
  448.   a=$scene.active_battler
  449.   for t in $scene.target_battlers
  450.     power=s.power+a.level
  451.     power-=t.pdef*s.pdef_f/100
  452.     power-=t.mdef*s.mdef_f/100
  453.     power=[power,0].max
  454.     t.damage=power*150
  455.     t.hp=t.last_hp-t.damage
  456.     gold_cost=t.damage*s.variance/1000
  457.     $game_party.lose_gold(gold_cost)
  458.   end
  459. 除此以外的场合
  460.   脚本段落:
  461.   for t in $scene.target_battlers
  462.     t.hp=t.last_hp
  463.     t.damage="Miss"
  464.   end
  465. 分歧结束
  466. 备注:外包一个条件是为了如果敌人执行该技能就不会出错(最多是没有效果)。
  467. 二十一、魔封(效果:当被攻击方里有人处于魔封状态时,纯魔法攻击无效,魔封者回复该技能所消耗的SP,受属性影响有修正。魔封状态请预先设定,默认为17,这个效果出现后状态即解除(多人有此状态时,只有1人能回复SP,其他人只解除状态)):
  468. 脚本段落1(魔封):
  469. s=$scene.skill; runic=nil
  470. for t in $scene.target_battlers
  471.   runic=t if t.state?(17)
  472. end
  473. if runic!=nil
  474.   for t in $scene.target_battlers
  475.     t.hp=t.last_hp; t.damage="Miss"
  476.   end
  477.   e=runic.elements_correct(s.element_set)
  478.   runic.damage=-s.sp_cost*e/100
  479.   runic.sp-=runic.damage
  480. end
  481. 脚本段落2(解除状态):
  482. for t in $scene.target_battlers
  483.   t.remove_state(17) if t.state?(17)
  484. end
  485. 备注:魔封的条件(纯魔法攻击)我没有写在脚本里,因为没必要,建议在之外的条件分歧中写脚本
  486. $scene.skill.atk_f==0
  487. 这个和沈默状态下不能使用的判定准则一模一样
  488. 然后把所有你认为能魔封的魔法都设为公共事件就行了。
  489. 二十二、回复不死系反效果(效果:回复HP的魔法对不死系伤害HP,复活的魔法对不死系即死)
  490. s=$scene.skill
  491. for t in $scene.target_battlers
  492.   f=t.damage
  493.   f=0 unless t.damage.is_a?(Integer)
  494.   if t.element_rate(9)>=150
  495.     t.hp=t.last_hp+f
  496.     t.hp=0 if s.minus_state_set.include?(1)
  497.     t.damage = -f if f!=0
  498.     t.damage = "" if t.hp==0
  499.   end
  500. end
  501. 二十三、死后自动复活(效果:身中自动复活状态的角色,当HP=0时会变成最大HP的1/8,并解除自动复活,该状态先在数据库里设定,这里范例为22号状态):
  502. for t in $scene.target_battlers
  503.   if t.hp==0 and t.state?(22)
  504.     t.hp=t.maxhp/8
  505.     t.remove_state(22)
  506.   end
  507. end
  508. 备注:这个解决方法不算很完美,因为你看不到角色复活的明灭过程……个人觉得还是用改脚本来做好一些……
  509. ________________________________________

  510. 教程的通用说明
  511. 本站发布的教程,大多经过一些测试,应该都能够实现相应功能。但不保证所有的教程都是最优化的制作方法。
  512. 相关问题,点击发布贴进行讨论。谢谢您的鼓励与支持。

复制代码



按照此脚本,公共事件在技能发动前调用,用公共时间做显示图片
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-7-2 00:53

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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