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

Project1

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

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

[复制链接]

Lv4.逐梦者

梦石
0
星屑
14616
在线时间
2196 小时
注册时间
2019-1-24
帖子
1123

R考场第七期纪念奖

跳转到指定楼层
1
发表于 2019-5-25 15:32:20 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 miantouchi 于 2019-5-25 19:48 编辑

如图,论坛大部分是根据,人物,防御、虚弱、死亡、胜利的图。
现在我想要根据人物的负面状态来变换战斗图,如何修改。
系统默认的就是给对象方人物加上动画,并不是更改战斗图。

比方人物中毒了,战斗图改成中毒的图、睡眠了就改成睡眠的图。
脚本方面,大体找了一个地方,也不知道从何入手。

是从下面这两个功能里面改吗?希望大大指点下。
Game_Battler 2
def add_state(state_id, force = false)
def remove_state(state_id, force = false)

哪吒待机图.png (3.02 KB, 下载次数: 16)

正常战斗图

正常战斗图

哪吒混乱.png (3.01 KB, 下载次数: 12)

中毒

中毒

哪吒石化.png (3 KB, 下载次数: 16)

石化

石化

哪吒睡眠.png (3 KB, 下载次数: 13)

哪吒睡眠.png

Lv5.捕梦者

梦石
0
星屑
36437
在线时间
10798 小时
注册时间
2009-3-15
帖子
4814
2
发表于 2019-5-25 16:57:14 | 只看该作者
你应该找刷新战斗图的脚本才对..
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
39016
在线时间
5717 小时
注册时间
2006-11-10
帖子
6619
3
发表于 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 认可答案

查看全部评分

回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
117
在线时间
3 小时
注册时间
2018-8-21
帖子
4
4
发表于 2019-5-25 18:12:46 | 只看该作者
3楼说的很详细,这里做一点小补充
给所有人准备异常状态战斗图未免过于麻烦
但是发现附加状态的脚本是在Game_Battler里,并且目前没想到什么好方法来在那里判断被附加状态的人的类型
但是可以在战斗图的文件名上做文章……
简而言之,就是在更改战斗图时判断战斗图文件名是否带有"待机"这俩字
if @battler_name.include? "待机"
    blablabla...
end

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

点评

等我试试你的方法,试完了告诉你  发表于 2019-5-25 18:53
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
36437
在线时间
10798 小时
注册时间
2009-3-15
帖子
4814
5
发表于 2019-5-25 18:42:35 | 只看该作者
if @battler.is_a?(Game_Actor)

很常用的..

点评

对,某侠也是用这个方法,现在解决了,敌人不用单独设置状态图片了  发表于 2019-5-25 18:46
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
14616
在线时间
2196 小时
注册时间
2019-1-24
帖子
1123

R考场第七期纪念奖

6
 楼主| 发表于 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
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
14616
在线时间
2196 小时
注册时间
2019-1-24
帖子
1123

R考场第七期纪念奖

7
 楼主| 发表于 2020-4-2 18:11:19 | 只看该作者
灯笼菜刀王 发表于 2019-5-25 17:10
做法和那些防御,胜利什么的一样, 根据不同的判断来替换角色图片

图片相关当然要去找 Sprite类,  ...

好了,这就是我加的标记,不太行,也不知道怎么继续弄了

1.png (21.03 KB, 下载次数: 16)

1.png

2.png (25.25 KB, 下载次数: 12)

2.png
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
39016
在线时间
5717 小时
注册时间
2006-11-10
帖子
6619
8
发表于 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}

如果有用公共事件,战斗事件等改战斗图, 那也一样要打开它, 或者干脆加到事件解释器里, 这个就自己决定啦
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
14616
在线时间
2196 小时
注册时间
2019-1-24
帖子
1123

R考场第七期纪念奖

9
 楼主| 发表于 2020-4-2 20:45:59 | 只看该作者
灯笼菜刀王 发表于 2020-4-2 19:17
首先你没考虑"没调用伤害显示的时候,它就无法改战斗图",  而战斗开始的时候是需要改战斗图的, 所以呢, 战斗 ...



说实话真的挺绕啊,似懂非懂阶段,部分懂,部分没懂,你提出的初始化和全局变量问题我是懂了。
1、(提示下, sprite_battler调用game_battler的实变量在初始化的地方,自己找找, 而这个实变量也是可以用于RPG::Sprite.new里面的,因为sprite_battler就是RPG::Sprite.new )
我直接在 sprite_battler里面@battler.改图开关,不就是调用了game_battler的实变量了吗?为什么又绕到RPG::Sprite.new里面了。
2、在需要改图像且没有调用到伤害显示的时候, 要主动打开它
调用到伤害显示的时候是第5步完后,@battler.damage_pop开关打开了后又关闭了
所以这个时候是1-6步当中除了5这步。
而你给的例子是第一步初始化的时候需要改、我再第六步加上是不是就可以了。
3.如果有用公共事件,战斗事件等改战斗图, 那也一样要打开它, 或者干脆加到事件解释器里
这两个应该是最不理解的,感觉也是最关键的,要不是即使前面处理好了,也会造成中间的3和4步的战斗图无法切换。
能否具体介绍下这两个方面。

1.png (70.33 KB, 下载次数: 13)

1.png

2.png (21.92 KB, 下载次数: 14)

2.png

3.png (73.84 KB, 下载次数: 14)

3.png

4.png (28.32 KB, 下载次数: 15)

4.png
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
39016
在线时间
5717 小时
注册时间
2006-11-10
帖子
6619
10
发表于 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
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-23 08:28

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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