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

Project1

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

[已经解决] 关于挨打动作制作的问题

[复制链接]

Lv1.梦旅人

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

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

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

x
本帖最后由 546936326 于 2014-2-15 13:18 编辑

在战斗中角色挨打时改变角色战斗图从而实现挨打动作。。在柳大的教程里是将这个判定放在scene-battle4里的显示挨打方动画的地方,可是这样一来当攻击动画比较长时就会出现还没打中时就换成了挨打动作的bug。。请问如何制作成当挨打方开始闪烁时才变成挨打动作。。?

Lv3.寻梦者

○赛

梦石
0
星屑
1249
在线时间
1276 小时
注册时间
2013-1-22
帖子
2246

贵宾

2
发表于 2014-2-11 19:46:26 | 只看该作者
尝试一下在播放时加个case?
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
51 小时
注册时间
2010-7-13
帖子
28
3
 楼主| 发表于 2014-2-13 19:07:45 | 只看该作者
天地有正气 发表于 2014-2-11 19:46
尝试一下在播放时加个case?

然后怎么判断闪光呢………………orz
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
24 小时
注册时间
2014-1-1
帖子
26
4
发表于 2014-2-14 17:16:53 | 只看该作者
(。・`ω′・)话说LZ看的是哪个教程?我最近也想学这个功能,
(。・`ω′・)我倒是不需要太细节,开始播放动画就改挨打战斗图就行了。
(。・`ω′・)倒是没搜到类似教程呢……
(。・`ω′・)因为我不是那么需要细节所以全动画脚本需要的素材也太麻烦了……只要单帧的挨打战斗图呢……
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
51 小时
注册时间
2010-7-13
帖子
28
5
 楼主| 发表于 2014-2-14 19:52:34 | 只看该作者
  1. #
  2. #修改战斗界面的教程。
  3. #


  4. 前言:

  5. 本教学难度并不高,但是比较繁琐。看完之后,你会完全理解战斗的动作系统怎么去制作,而且改造于你手,无冲突无卡机。请保持耐心并跟着制作。


  6. --------------------------------------------------------------------------------

  7. 首先先看这几个教学:
  8. 1、shownews.asp?id=131,45度战斗 + 横版战斗制作方法,这个是不带特殊素材效果的。如果你的素材紧缺,不用看了,看到这个教学基本就OK了。
  9. 对于原创度很高的游戏,可能基本到这一步就差不多了。此录像为本教学的基础,诸如设置动画、坐标等内容在本教学不再赘述。

  10. 2、shownews.asp?id=258,这个是添加了待机动画。改用行走图而已,bug很少。用于三国凡人传等游戏的制作方法,可以参考。

  11. 3、shownews.asp?id=201 + shownews.asp?id=210,超级横版战斗。所有下面有的效果里面都有,但是使用起来比较困难。


  12. --------------------------------------------------------------------------------



  13. 好了,既然以上几个教学不能满足你,那么我来告诉你怎么打造自己的战斗吧。很多人自己会做,但是不会有我讲得这么清楚,所以我再讲一遍,希望不会再讲第N遍了哦!

  14. 0、一个变量的公开:
  15. class Game_Battler中,attr_reader :battler_name改为attr_accessor :battler_name
  16. 否则这个变量不能随意修改。

  17. 1、待机动画
  18. 原理:常规战斗的情况下,有两种让图像动起来的方法。一种是使用循环动画,另一种是不断更改角色的战斗图。

  19. 怎样给角色添加循环动画呢?你可以设置一个状态名为“正常”,然后在这个状态附带循环动画里面制作上角色的待机动画。如果需要,可以附带这个脚本:shownews.asp?id=381,会防止挨打动画丢失。这种方法的特点是可以制作复杂的待机动作,缺点是占用了循环动画,导致一些状态动画不能显示了。

  20. 另一种方法是更改角色战斗图,这个方法没有副作用,但是需要一些脚本知识。为了方便,我们将待机动画的4个动作放在一张战斗图里面,横着排列。(你如果脚本知识牢靠,可以不使用本教学的方法,本教学仅做统一范例而已)

  21. 这张图片的名字是li.png,将作为角色的战斗图。

  22. 角色战斗图的刷新是在Sprite_Battler里面。所以,现在修改一下这个脚本。

  23. 初始化的部分:

  24. def initialize(viewport, battler = nil)
  25.    super(viewport)
  26.    [url=home.php?mod=space&uid=133701]@battler[/url] = battler
  27.    @battler_visible = false
  28. end



  29. 添加两个属性:

  30. def initialize(viewport, battler = nil)
  31.    super(viewport)
  32.    @battler = battler
  33.    @battler_visible = false
  34.    #★★★★★★★★★★★★
  35.    @nx = 0
  36.    @xbit = 0
  37.    #★★★★★★★★★★★★
  38. end



  39. @nx表示当前的帧数,@xbit表示当前的图像。刚开始的时候都是0值。

  40. 刷新的部分def update,找到这段

  41.   # 文件名和色相与当前情况有差异的情况下
  42.    if @battler.battler_name != @battler_name or
  43.       @battler.battler_hue != @battler_hue
  44.      # 获取、设置位图
  45.      @battler_name = @battler.battler_name
  46.      @battler_hue = @battler.battler_hue
  47.      self.bitmap = RPG::Cache.battler(@battler_name, @battler_hue)
  48.      @width = bitmap.width
  49.      [url=home.php?mod=space&uid=291977]@height[/url] = bitmap.height
  50.      self.ox = @width / 2
  51.      self.oy = @height
  52.      # 如果是战斗不能或者是隐藏状态就把透明度设置成 0
  53.      if @battler.dead? or @battler.hidden
  54.        self.opacity = 0
  55.      end
  56.    end



  57. 这段表示如果战斗中角色战斗图更换则重新换图片。在此下面添加一个刷新效果:

  58.   # 文件名和色相与当前情况有差异的情况下
  59.    if @battler.battler_name != @battler_name or
  60.       @battler.battler_hue != @battler_hue
  61.      # 获取、设置位图
  62.      @battler_name = @battler.battler_name
  63.      @battler_hue = @battler.battler_hue
  64.      self.bitmap = RPG::Cache.battler(@battler_name, @battler_hue)
  65.      @width = bitmap.width
  66.      @height = bitmap.height
  67.      self.ox = @width / 2
  68.      self.oy = @height
  69.      # 如果是战斗不能或者是隐藏状态就把透明度设置成 0
  70.      if @battler.dead? or @battler.hidden
  71.        self.opacity = 0
  72.      end
  73.    end
  74.    if @battler.is_a?(Game_Actor)
  75.      @nx += 1
  76.      @nx %= 40 #每帧+1,40帧一个循环
  77.      @xbit = @nx / 10 * self.bitmap.width/4 #获得当前的图像坐标
  78.      self.src_rect.set(@xbit, 0, self.bitmap.width/4, self.bitmap.height) #设置当前战斗图的图像
  79.    end



  80. 这段就是表示,如果这个battler是角色的时候,每隔10帧角色的动画更新一次。好了。你把上面的图像和脚本放到自己的游戏中,就已经是具有待机动画的了。坐标可能不是很好,自己调一下即可。


  81. --------------------------------------------------------------------------------



  82. 2、挨打,防御,受伤(hp小于一半)的动画

  83. 现在我们另有这么几张图片:

  84. 这张图片的名字是li★2.png


  85. 这张图片的名字是li★3.png


  86. 这张图片的名字是li★4.png


  87. 这张图片的名字是li★5.png

  88. 那么,我们怎么制作角色的防御动作和挨打动作呢?(注:我为了偷懒,上面的4张图其实上几乎没有动态,你换为自己的素材即可)

  89. 首先我们先找到脚本中控制挨打和显示伤害的部分。如果脚本比较熟你应该知道是在Scene_Battle 4中(齐时战斗的设置中讲到过了):

  90. #--------------------------------------------------------------------------
  91. # ● 刷新画面 (主回合步骤 4 : 对像方动画)
  92. #--------------------------------------------------------------------------
  93. def update_phase4_step4
  94.    # 对像方动画
  95.    for target in @target_battlers
  96.      target.animation_id = @animation2_id
  97.      target.animation_hit = (target.damage != "Miss")
  98.    end
  99.    # 限制动画长度、最低 8 帧
  100.    @wait_count = 8
  101.    # 移至步骤 5
  102.    @phase4_step = 5
  103. end
  104. #--------------------------------------------------------------------------
  105. # ● 刷新画面 (主回合步骤 5 : 显示伤害)
  106. #--------------------------------------------------------------------------
  107. def update_phase4_step5
  108.    # 隐藏帮助窗口
  109.    @help_window.visible = false
  110.    # 刷新状态窗口
  111.    @status_window.refresh
  112.    # 显示伤害
  113.    for target in @target_battlers
  114.      if target.damage != nil
  115.        target.damage_pop = true
  116.      end
  117.    end
  118.    # 移至步骤 6
  119.    @phase4_step = 6
  120. end



  121. 下面修改一下这段。我们在显示“对象方动画(update_phase4_step4)”的地方将角色的战斗图改为“防御”或者“挨打”的样子,“显示伤害(update_phase4_step5)”的时候再改回来。
  122. 修改如下:

  123. #--------------------------------------------------------------------------
  124. # ● 刷新画面 (主回合步骤 4 : 对像方动画) ★
  125. #--------------------------------------------------------------------------
  126. def update_phase4_step4
  127.    # 对像方动画
  128.    for target in @target_battlers
  129.      target.animation_id = @animation2_id
  130.      target.animation_hit = (target.damage != "Miss")
  131.      if target.is_a?(Game_Actor)
  132.        target.battler_name = target.battler_name.split(/★/)[0]
  133.        if (target.current_action.kind == 0 and target.current_action.basic == 1) or target.damage == "Miss" or target.damage.to_i <= 0
  134.          target.battler_name = target.battler_name + "★3"
  135.        else
  136.          target.battler_name = target.battler_name + "★4"
  137.        end
  138.      end
  139.    end
  140.    # 限制动画长度、最低 8 帧
  141.    @wait_count = 8
  142.    # 移至步骤 5
  143.    @phase4_step = 5
  144. end
  145. #--------------------------------------------------------------------------
  146. # ● 刷新画面 (主回合步骤 5 : 显示伤害)
  147. #--------------------------------------------------------------------------
  148. def update_phase4_step5
  149.    # 隐藏帮助窗口
  150.    @help_window.visible = false
  151.    # 刷新状态窗口
  152.    @status_window.refresh
  153.    # 显示伤害
  154.    for target in @target_battlers
  155.      if target.damage != nil
  156.        target.damage_pop = true
  157.      end
  158.      if target.is_a?(Game_Actor)
  159.        target.battler_name = target.battler_name.split(/★/)[0]
  160.        if target.hp < target.maxhp/2
  161.          target.battler_name = target.battler_name + "★5"
  162.        end
  163.      end
  164.    end
  165.    # 移至步骤 6
  166.    @phase4_step = 6
  167. end


  168. 我来解释一下红字的部分。

  169. if target.is_a?(Game_Actor) #如果挨打的是角色的时候

  170. target.battler_name = target.battler_name.split(/★/)[0] #先把角色的战斗图文件名改为默认的战斗图文件名(也就是忽略现在文件名中★后面的部分),防止出一些意外。也就是说,如果现在处于“受伤”的情况,则本来数据库设置战斗图为“li”,此刻却是“li★5”

  171. if (target.current_action.kind == 0 and target.current_action.basic == 1) or target.damage <= 0 #如果角色的行动是“防御”的时候或者伤害<0的时候(当然,这个防御你可以自己修改功能,比如“防御回气”或者“召唤宠物”等。那你就自己修改一下触发条件即可)

  172. target.battler_name = target.battler_name + "★3" #挨打者的文件名改为原名+★3。比如原来文件名是“li”,现在就变成了“li★3”

  173. else #除此以外,也就是没“防御”的时候

  174. target.battler_name = target.battler_name + "★4" #挨打者文件名改为原名+★4。原名“li”,现在变成了“li★4”

  175. end

  176. 下面再来看后面显示伤害的时候。有了上面的基础,应该很简单了吧:

  177.      if target.is_a?(Game_Actor) #当是角色的时候
  178.        target.battler_name = target.battler_name.split(/★/)[0] #文件名还原
  179.        if target.hp < target.maxhp/2 #如果角色生命小于一半
  180.          target.battler_name = target.battler_name + "★5" #把战斗图改为受伤图
  181.        end
  182.      end



  183. 这样角色就有防御和挨打的图了。不过我并不推荐这种方法制作受伤动画,因为如果你用了★5的受伤动画,则你需要在Game_Battler 3的def item_effect中增加战斗图的更改。否则角色在战场被打个半死,在地图上吃药补满血后,回到战场还是使用的受伤战斗图。此外还需要在公共事件的增减HP的地方增加战斗图更改的脚本——总之,自己改吧。原理掌握了就什么都不怕了。


  184. --------------------------------------------------------------------------------


  185. 3、死亡图

  186. 死亡图相对麻烦一点。注意到Sprite_Battler中如下几个地方:

  187.      # 如果是战斗不能或者是隐藏状态就把透明度设置成 0
  188.      if @battler.dead? or @battler.hidden
  189.        self.opacity = 0
  190.      end



  191. 以及:

  192.      if @battler.damage == nil and @battler.dead?
  193.        if @battler.is_a?(Game_Enemy)
  194.          $game_system.se_play($data_system.enemy_collapse_se)
  195.        else
  196.          $game_system.se_play($data_system.actor_collapse_se)
  197.        end
  198.        collapse
  199.        @battler_visible = false
  200.      end




  201. 以及:

  202.      if not @battler.hidden and not @battler.dead? and
  203.         (@battler.damage == nil or @battler.damage_pop)
  204.        appear
  205.        @battler_visible = true
  206.      end







  207. 修改一下吧:

  208.      # 如果是战斗不能或者是隐藏状态就把透明度设置成 0
  209.      if @battler.is_a?(Game_Enemy)
  210.        if @battler.dead? or @battler.hidden
  211.          self.opacity = 0
  212.        end
  213.      end


  214. 这个就是改为只有敌人死的时候才让敌人消失。



  215.       if @battler.damage == nil and @battler.dead?
  216.        if @battler.is_a?(Game_Enemy)
  217.          $game_system.se_play($data_system.enemy_collapse_se)
  218.          collapse
  219.        else
  220.          $game_system.se_play($data_system.actor_collapse_se)
  221.          @battler.battler_name = @battler.battler_name.split(/★/)[0]
  222.          @battler.battler_name = @battler.battler_name + "★2"
  223.        end
  224.        @battler_visible = false
  225.      end


  226. 当我方死亡的时候修改战斗图。

  227.     unless @battler_visible
  228.      # 出现
  229.      if not @battler.hidden and not @battler.dead? and
  230.         (@battler.damage == nil or @battler.damage_pop)
  231.        if @battler.is_a?(Game_Enemy)
  232.          appear
  233.        else
  234.          @battler.battler_name = @battler.battler_name.split(/★/)[0]
  235.        end
  236.        @battler_visible = true
  237.      end
  238.    end


  239. 当我方复活的时候修改战斗图

  240. 行了。完成了~~


  241. --------------------------------------------------------------------------------


  242. Final、调整位置
  243. 把默认没有写出来的脚本修改一下(这个脚本在RMXP的帮助中搜索damage可以获得):

  244. module RPG
  245. class Sprite < ::Sprite
  246.    def damage(value, critical)
  247.      dispose_damage
  248.      if value.is_a?(Numeric)
  249.        damage_string = value.abs.to_s
  250.      else
  251.        damage_string = value.to_s
  252.      end
  253.      bitmap = Bitmap.new(160, 48)
  254.      bitmap.font.name = "Arial Black"
  255.      bitmap.font.size = 32
  256.      bitmap.font.color.set(0, 0, 0)
  257.      bitmap.draw_text(-1, 12-1, 160, 36, damage_string, 1)
  258.      bitmap.draw_text(+1, 12-1, 160, 36, damage_string, 1)
  259.      bitmap.draw_text(-1, 12+1, 160, 36, damage_string, 1)
  260.      bitmap.draw_text(+1, 12+1, 160, 36, damage_string, 1)
  261.      if value.is_a?(Numeric) and value < 0
  262.        bitmap.font.color.set(176, 255, 144)
  263.      else
  264.        bitmap.font.color.set(255, 255, 255)
  265.      end
  266.      bitmap.draw_text(0, 12, 160, 36, damage_string, 1)
  267.      if critical
  268.        bitmap.font.size = 20
  269.        bitmap.font.color.set(0, 0, 0)
  270.        bitmap.draw_text(-1, -1, 160, 20, "CRITICAL", 1)
  271.        bitmap.draw_text(+1, -1, 160, 20, "CRITICAL", 1)
  272.        bitmap.draw_text(-1, +1, 160, 20, "CRITICAL", 1)
  273.        bitmap.draw_text(+1, +1, 160, 20, "CRITICAL", 1)
  274.        bitmap.font.color.set(255, 255, 255)
  275.        bitmap.draw_text(0, 0, 160, 20, "CRITICAL", 1)
  276.      end
  277.      @_damage_sprite = ::Sprite.new(self.viewport)
  278.      @_damage_sprite.bitmap = bitmap
  279.      @_damage_sprite.ox = 80
  280.      @_damage_sprite.oy = 20
  281.      @_damage_sprite.x = self.x
  282.      @_damage_sprite.x -= self.bitmap.width/2 if @battler.is_a?(Game_Actor)
  283.      @_damage_sprite.y = self.y - self.oy / 2
  284.      @_damage_sprite.z = 3000
  285.      @_damage_duration = 40
  286.    end
  287. end
  288. end



  289. 修改一下挨打的时候文字的位置。


  290. 再修改一下指针位置:
  291. class Arrow_Actor < Arrow_Base中的
  292. self.x = self.actor.screen_x改为
  293. self.x = self.actor.screen_x - 100

  294. 就算全部完成了。


  295. 如果你的敌人也要待机动画和挨打、防御动画,上面素有的.is_a?(Game_Actor)和.is_a?(Game_Enemy)这种区别对待的东西全部去掉即可。Happy~
复制代码
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
24 小时
注册时间
2014-1-1
帖子
26
6
发表于 2014-2-15 14:54:44 | 只看该作者
546936326 发表于 2014-2-14 19:52

(。・`ω′・)哦哦哦thankyou,话说是在哪里看到的?没搜到的说,比如这里面还提到了些别的几个教程该去哪找呢?
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-9-22 07:05

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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