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

Project1

 找回密码
 注册会员
搜索

[已解决]如何做到根据人物中的状态 更换战斗图?

查看数: 3909 | 评论数: 9 | 收藏 1
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2019-5-25 15:32

正文摘要:

本帖最后由 miantouchi 于 2019-5-25 19:48 编辑 如图,论坛大部分是根据,人物,防御、虚弱、死亡、胜利的图。 现在我想要根据人物的负面状态来变换战斗图,如何修改。 系统默认的就是给对象方人物加上动画,并 ...

回复

灯笼菜刀王 发表于 2020-4-2 23:37:11
本帖最后由 灯笼菜刀王 于 2020-4-2 23:42 编辑

1, 你7楼第一张图不就是在 RPG::Sprite.new 里打开开关的么, 这部分做的没错, 因为本来就是想伤害显示结束的时候来改变图,  而你下面说的, 在第六步再打开开关,虽然也可以做到伤害显示后改变图形, 然而却忽略了一个地方"中毒阶段也是会掉血的, 而它是在第二阶段", 还有之后可能会有的阶段操作(这个等以后再说,笑), 综合考虑, 直接在伤害结束的地方打开开关是最简单的做法

2, damage_pop就是作为一个"信号" 打开的时候就调用 RPG::Sprite.new的伤害显示方法, 同理, 这个开关也是作为信号, 打开的时候就调用图片修改, 借此来让我们更方便的的控制要在什么时候改变图形

3, 这部分没你想像的那么重要, 因为有时候要通过公共事件,战斗事件制作一些效果, 比如通过事件给全体扣血之类的, 剧情需要在事件里更换战斗图什么的,  这个时候因为没有伤害显示所以不会自动打开开关, 所以可能会引起事件效果无效, 所以要记得进行这种操作的时候就手动打开开关

然后事件解释器 也就是 class Interpreter 类,  它的作用就是把事件操作的命令反馈到脚本里, "翻译"成脚本指令执行内容,  因为战斗的时候改战斗图什么的都要记得去开开关, 如果想偷懒, 那就找到这个事件内容, 加上去不就一了百了啦~

  #--------------------------------------------------------------------------
  # ● 更改角色的图形
  #--------------------------------------------------------------------------
  def command_322
    # 获取角色
    actor = $game_actors[@parameters[0]]
    # 更改图形
    if actor != nil
      actor.set_graphic(@parameters[1], @parameters[2],
        @parameters[3], @parameters[4])
    end
    # 刷新角色
    $game_player.refresh
    actor.改图开关 = true
    # 继续
    return true
  end


后话, 其实从深浅度来说, 这部分的内容应该比你之前改的伤害显示坐标,闪烁,视口等要低呢~ 所以我以为你早就掌握了

你会迷茫或许就是你没先经过"努力用事件制作想要的结果"阶段吧, 一开始就对脚本动手, 事件内容并不熟悉所以不会去想到改脚本后对事件的影响~

点评

那把死亡处理也一起塞进这个开关里咯  发表于 2020-4-3 09:48
哈哈,差不多了,现在各个重要地方加上开关了,感觉和心脏搭桥差不多,再一个死亡音效提前了。  发表于 2020-4-3 08:00
灯笼菜刀王 发表于 2020-4-2 19:17:32
本帖最后由 灯笼菜刀王 于 2020-4-2 19:23 编辑

首先你没考虑"没调用伤害显示的时候,它就无法改战斗图",  而战斗开始的时候是需要改战斗图的, 所以呢, 战斗开始的时候你要先打开它

其次, 你没考虑"全局变量只有一个判定", 而伤害是"每人都有判定", 所以会导致什么结果? 你改了一个人就关闭开关啦, 其他人就没得改了~

正确做法是, 模仿 damage_pop, 在 game_battler 里新建一个参数,用它来作为改变图形的开关, 然后到 sprite_battler里, 用这个开关来处理你上面的做法, 这样就是各人用各人的开关控制了,(提示下, sprite_battler调用game_battler的实变量在初始化的地方,自己找找, 而这个实变量也是可以用于RPG::Sprite.new里面的,因为sprite_battler就是RPG::Sprite.new )

最后记得, 在需要改图像且没有调用到伤害显示的时候, 要主动打开它, 比如战斗开始的时候, 在scene battle 的 main 里加一句  $game_party.actors.each {|i| i.改图开关 =  true}

如果有用公共事件,战斗事件等改战斗图, 那也一样要打开它, 或者干脆加到事件解释器里, 这个就自己决定啦
miantouchi 发表于 2019-5-25 19:44:43
把完成结果贴下。

    super
    # 战斗者为 nil 的情况下
    if @battler == nil
      self.bitmap = nil
      loop_animation(nil)
      return
    end

    name = @battler.battler_name
    if @battler.state?(6) #石化
      name += "_石化"
    elsif @battler.state?(3) #中毒
      name += "_中毒"
    elsif @battler.state?(7) #催眠
      name += "_睡眠"
    end

   
    # 文件名和色相与当前情况有差异的情况下
    if @battler.is_a?(Game_Enemy)
      if @battler.battler_name != @battler_name or
         @battler.battler_hue != @battler_hue
        # 获取、设置位图
        @battler_name = @battler.battler_name
        @battler_hue = @battler.battler_hue
        self.bitmap = RPG::Cache.battler(@battler_name, @battler_hue)
        @width = bitmap.width
        @height = bitmap.height
        self.ox = @width / 2
        self.oy = @height
        # 如果是战斗不能或者是隐藏状态就把透明度设置成 0
        if @battler.dead? or @battler.hidden
          self.opacity = 0
        end
      end
    end
   
    if @battler.is_a?(Game_Actor) and (@battler.damage == nil or @battler.damage_pop)
      if name != @battler_name or
         @battler.battler_hue != @battler_hue
        # 获取、设置位图
        @battler_name = name
        @battler_hue = @battler.battler_hue
        self.bitmap = RPG::Cache.battler(@battler_name, @battler_hue)
        @width = bitmap.width
        @height = bitmap.height
        self.ox = @width / 2
        self.oy = @height
        # 如果是战斗不能或者是隐藏状态就把透明度设置成 0
        if @battler.dead? or @battler.hidden
          self.opacity = 0
        end
      end
   end
    # 动画 ID 与当前的情况有差异的情况下
    if @battler.damage == nil and
      @battler.state_animation_id != @state_animation_id
      @state_animation_id = @battler.state_animation_id
      if @battler.is_a?(Game_Enemy)
        loop_animation($data_animations[@state_animation_id])
      end
    end
soulsaga 发表于 2019-5-25 18:42:35
if @battler.is_a?(Game_Actor)

很常用的..

点评

对,某侠也是用这个方法,现在解决了,敌人不用单独设置状态图片了  发表于 2019-5-25 18:46
apk1095884734 发表于 2019-5-25 18:12:46
3楼说的很详细,这里做一点小补充
给所有人准备异常状态战斗图未免过于麻烦
但是发现附加状态的脚本是在Game_Battler里,并且目前没想到什么好方法来在那里判断被附加状态的人的类型
但是可以在战斗图的文件名上做文章……
简而言之,就是在更改战斗图时判断战斗图文件名是否带有"待机"这俩字
if @battler_name.include? "待机"
    blablabla...
end

把这个判定套在更换战斗图的脚本外面就可以了
没测试过……233

点评

等我试试你的方法,试完了告诉你  发表于 2019-5-25 18:53
灯笼菜刀王 发表于 2019-5-25 17:10:56
做法和那些防御,胜利什么的一样, 根据不同的判断来替换角色图片

图片相关当然要去找 Sprite类, 而战斗者就是battler, 所以要到 Sprite_Battler 里修改

update里可以找到这句

    # 文件名和色相与当前情况有差异的情况下
    if @battler.battler_name != @battler_name or
       @battler.battler_hue != @battler_hue
      # 获取、设置位图
      @battler_name = @battler.battler_name
      @battler_hue = @battler.battler_hue
      self.bitmap = RPG::Cache.battler(@battler_name, @battler_hue)
      @width = bitmap.width
      @height = bitmap.height
      self.ox = @width / 2
      self.oy = @height
      # 如果是战斗不能或者是隐藏状态就把透明度设置成 0
      if @battler.dead? or @battler.hidden
        self.opacity = 0
      end
    end

很显然,这里就是改战斗图的地方了, 然后只要这里加上判断, 让它能按状态自己改战斗图, 目标就达成了

栗子:
    name = @battler.battler_name
    if @battler.state?(2) #中毒
      name += "_毒"
    elsif @battler.state?(3) #石化
      name += "_石化"
    elsif @battler.state?(4) #催眠
      name += "_催眠"
    end

    # 文件名和色相与当前情况有差异的情况下
    if name != @battler_name or
       @battler.battler_hue != @battler_hue
      # 获取、设置位图
      @battler_name = name
      @battler_hue = @battler.battler_hue
      self.bitmap = RPG::Cache.battler(@battler_name, @battler_hue)
      @width = bitmap.width
      @height = bitmap.height
      self.ox = @width / 2
      self.oy = @height
      # 如果是战斗不能或者是隐藏状态就把透明度设置成 0
      if @battler.dead? or @battler.hidden
        self.opacity = 0
      end
    end

这样, 中毒就会把战斗图改成  战斗图名字_毒.png 的图片了(图片自己备好)

不过,  battler是"敌我双方", 所以说, 你也要给所有敌人都同样准备对应的"异常状态战斗图"

点评

我思路是,如果@_damage_duration > 0不成立,就步刷新战斗图,前面有@battler.damage == nil干扰。。。。  发表于 2020-4-1 20:19
@battler.damage == nil,好像是第1步、第5步由于时候会成立会刷新一次战斗图。  发表于 2020-4-1 20:18
if @battler.is_a?(Game_Actor) and 变量,我想这么弄,直接战斗图条件都不成立了,都不显示了。。。  发表于 2020-4-1 20:16
试了好一会了,还是不太会比划,我找到了@_damage_duration > 0里面了,也就是前段时间数值上移那里面, 我弄了个变量,思路还是死的  发表于 2020-4-1 20:13
记得菜刀之爱没, 没标志就自己去加个标志就行啦, 顺便说下, RPG::Sprite.new里的实变量 @_damage_duration > 0 就是伤害显示中, 自己想办法弄出标志吧  发表于 2020-4-1 14:47

评分

参与人数 2星屑 +100 +1 收起 理由
miantouchi + 1 认可答案
RyanBern + 100 认可答案

查看全部评分

soulsaga 发表于 2019-5-25 16:57:14
你应该找刷新战斗图的脚本才对..
拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

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

GMT+8, 2024-9-20 22:44

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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