查看: 2882|回复: 4

[已经解决] 脚本新手试写又失败 想再次请教错在哪里 关於战斗动画

[复制链接]
梦石
0
星屑
1939
在线时间
316 小时
注册时间
2018-3-4
回帖
48
发表于 2018-4-22 21:48:04 | 显示全部楼层 |阅读模式

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

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

×
话说小紅尝试写了个显示敌方攻击动画的脚本的说
结果成功显示动画出来……却被立绘挡住了呢

然而立绘用的战斗事件来呈现的说
理论上Z轴应该不可能大於100的吧
所以想请教这个脚本写法是否哪里出问题了呢

[pre lang="ruby"]#--------------------------------------------------------------------------
# ● 敵方攻擊顯示動畫
#--------------------------------------------------------------------------

class Game_Actor < Game_Battler
  #--------------------------------------------------------------------------
  # ● 是否使用精灵
  #--------------------------------------------------------------------------
  def use_sprite?
    return true
  end
  #--------------------------------------------------------------------------
  # ● 获取战斗画面 X 坐标
  #--------------------------------------------------------------------------
  def screen_x
    return 480
  end
  #--------------------------------------------------------------------------
  # ● 获取战斗画面 Y 坐标
  #--------------------------------------------------------------------------
  def screen_y
    return 208
  end
  #--------------------------------------------------------------------------
  # ● 获取战斗画面 Z 坐标
  #--------------------------------------------------------------------------
  def screen_z
    return 100
  end
end

class Game_Enemy < Game_Battler
  #--------------------------------------------------------------------------
  # ● 获取普通攻击的动画 ID
  #--------------------------------------------------------------------------
  def atk_animation_id1
    return 1
  end
  #--------------------------------------------------------------------------
  # ● 获取普通攻击的动画 ID (双持武器:武器2)
  #--------------------------------------------------------------------------
  def atk_animation_id2
    return 0
  end
end

class Scene_Battle < Scene_Base
  #--------------------------------------------------------------------------
  # ● 显示动画
  #     targets      : 目标的数组
  #     animation_id : 动画 ID(-1: 与普通攻击一样)
  #--------------------------------------------------------------------------
  def show_animation(targets, animation_id)
    if animation_id < 0
      show_attack_animation(targets)
    else
      show_normal_animation(targets, animation_id)
    end
    @log_window.wait
    wait_for_animation
  end
  #--------------------------------------------------------------------------
  # ● 显示攻击动画
  #     targets : 目标的数组
  #    是角色的时候考虑双持武器的效果(反转动画显示左手武器)。
  #    是敌人的时候,在那一瞬间,播放“敌人普通攻击”的声效。
  #--------------------------------------------------------------------------
  def show_attack_animation(targets)
    if @subject.actor?
      show_normal_animation(targets, @subject.atk_animation_id1, false)
      show_normal_animation(targets, @subject.atk_animation_id2, true)
    else
      show_normal_animation(targets, @subject.atk_animation_id1, true)
      show_normal_animation(targets, @subject.atk_animation_id2, false)
    end
  end
  #--------------------------------------------------------------------------
  # ● 显示普通动画
  #     targets      : 目标的数组
  #     animation_id : 动画ID
  #     mirror       : 左右反转
  #--------------------------------------------------------------------------
  def show_normal_animation(targets, animation_id, mirror = false)
    animation = $data_animations[animation_id]
    if animation
      targets.each do |target|
        target.animation_id = animation_id
        target.animation_mirror = mirror
        abs_wait_short unless animation.to_screen?
      end
      abs_wait_short if animation.to_screen?
    end
  end
end[/pre]
梦石
0
星屑
6891
在线时间
7027 小时
注册时间
2013-11-2
回帖
1263

开拓者剧作品鉴家

发表于 2018-4-22 22:20:38 | 显示全部楼层
本帖最后由 RaidenInfinity 于 2018-4-22 22:30 编辑

请看Spriteset_Battle的部分。
战斗场景里一共有3个显示端口(Viewport)。
Viewport的用途是将图像精灵(Sprite)分组,和处理画面闪光,画面亮度之类的效果。

Spriteset_Battle的create_viewport方法定义了三个Viewport:@viewport1, @viewport2, @viewport3
Spriteset_Battle里的Sprite都有归类在Viewport里面。例子:@back1_sprite = Sprite.new(@viewport1)

> @viewport1 拥有 背景,敌方战斗图,我方战斗图(如果有)。画面摇晃时,这个Viewport(和里面的所有Sprite)的X轴会同时移动。使用事件/动画的画面色调指令时,这个Viewport会受影响。Z值是0。
> @viewport2 拥有 计时器,事件显示的图片 。使用事件的画面闪烁指令时,这个Viewport会改变颜色来实现闪烁效果。Z值是50。
> @viewport3 没有所属的Sprite,使用事件的渐出淡入指令时,这个Viewport会改变颜色来实现渐入淡出效果。Z值是100。

Viewport的Z值凌驾于Sprite的Z值。也就是说,在@viewport1里的Sprite,就算你Z值放999,还是会被@viewport2里Z值为0的Sprite盖过去。
这是为啥事件显示的图片(@viewport2)会覆盖在战斗图(@viewport1)上。

好,知道了原理之后,现在到解决方法。
当时我弄的玩家角色立绘系统,立绘不是用事件显示图片而是自己写的Sprite。但是也差不多。
于是你知道事件显示的图片,是在@viewport2里的。意思就是说,你必须给玩家角色的Sprite_Battler设置Z值更高的@viewport
但是你要知道…一,只有 @viewport1 才会摇晃和改变色调。二,@viewport2 是不会摇晃的,然后画面闪烁是在这个Viewport进行的。
如果你创建的新Viewport比@viewport2还高,会发生什么事儿呢?吃不到闪烁效果。然后,如果你的Sprite不是@viewport1所属的,就吃不到摇晃的改变色调。那怎么办?请看update_viewports方法。这个方法里面定义了哪个Viewport受什么功能影响。所以我的建议是,弄多几个新的Viewport,调整下Z值,调整哪个受影响,哪些不会。自己实验一下吧。

哦对,定义玩家角色战斗图的方法是create_actors。

评分

参与人数 1赞 +1 收起 理由
真紅樂章 + 1 塞糖

查看全部评分

回复 1 0

使用道具 举报

梦石
0
星屑
1939
在线时间
316 小时
注册时间
2018-3-4
回帖
48
 楼主| 发表于 2018-4-22 23:37:02 | 显示全部楼层
本帖最后由 真紅樂章 于 2018-4-22 23:39 编辑
RaidenInfinity 发表于 2018-4-22 22:20
于是你知道事件显示的图片,是在@viewport2里的。意思就是说,你必须给玩家角色的Sprite_Battler设置Z值更高的@viewport
但是你要知道…一,只有 @viewport1 才会摇晃和改变色调。二,@viewport2 是不会摇晃的,然后画面闪烁是在这个Viewport进行的。
如果你创建的新Viewport比@viewport2还高,会发生什么事儿呢?吃不到闪烁效果。然后,如果你的Sprite不是@viewport1所属的,就吃不到摇晃的改变色调。那怎么办?请看update_viewports方法。这个方法里面定义了哪个Viewport受什么功能影响。所以我的建议是,弄多几个新的Viewport,调整下Z值,调整哪个受影响,哪些不会。自己实验一下吧。

感谢版主Sama的详尽解说的说

那麽如果把事件图片给改到@viewport1去再把敌人的Z轴降到10然後把事件图片的Z轴设成11的话
虽然暂时实验成功可是会不会出现甚麽小紅未能预测的错误呢

[pre lang="ruby"]#--------------------------------------------------------------------------
# ● 敵方攻擊顯示動畫
#--------------------------------------------------------------------------

class Game_Actor < Game_Battler
  #--------------------------------------------------------------------------
  # ● 是否使用精灵
  #--------------------------------------------------------------------------
  def use_sprite?
    return true
  end
  #--------------------------------------------------------------------------
  # ● 获取战斗画面 X 坐标
  #--------------------------------------------------------------------------
  def screen_x
    return 480
  end
  #--------------------------------------------------------------------------
  # ● 获取战斗画面 Y 坐标
  #--------------------------------------------------------------------------
  def screen_y
    return 208
  end
  #--------------------------------------------------------------------------
  # ● 获取战斗画面 Z 坐标
  #--------------------------------------------------------------------------
  def screen_z
    return 100
  end
end

class Game_Enemy < Game_Battler
  #--------------------------------------------------------------------------
  # ● 获取战斗画面 Z 坐标
  #--------------------------------------------------------------------------
  def screen_z
    return 10
  end
  #--------------------------------------------------------------------------
  # ● 获取普通攻击的动画 ID
  #--------------------------------------------------------------------------
  def atk_animation_id1
    return 1
  end
  #--------------------------------------------------------------------------
  # ● 获取普通攻击的动画 ID (双持武器:武器2)
  #--------------------------------------------------------------------------
  def atk_animation_id2
    return 0
  end
end

class Spriteset_Battle
  #--------------------------------------------------------------------------
  # ● 更新图片精灵
  #--------------------------------------------------------------------------
  def update_pictures
    $game_troop.screen.pictures.each do |pic|
      @picture_sprites[pic.number] ||= Sprite_Picture.new(@viewport1, pic)
      @picture_sprites[pic.number].update
    end
  end
end

class Scene_Battle < Scene_Base
  #--------------------------------------------------------------------------
  # ● 显示动画
  #     targets      : 目标的数组
  #     animation_id : 动画 ID(-1: 与普通攻击一样)
  #--------------------------------------------------------------------------
  def show_animation(targets, animation_id)
    if animation_id < 0
      show_attack_animation(targets)
    else
      show_normal_animation(targets, animation_id)
    end
    @log_window.wait
    wait_for_animation
  end
  #--------------------------------------------------------------------------
  # ● 显示攻击动画
  #     targets : 目标的数组
  #    是角色的时候考虑双持武器的效果(反转动画显示左手武器)。
  #    是敌人的时候,在那一瞬间,播放“敌人普通攻击”的声效。
  #--------------------------------------------------------------------------
  def show_attack_animation(targets)
    if @subject.actor?
      show_normal_animation(targets, @subject.atk_animation_id1, false)
      show_normal_animation(targets, @subject.atk_animation_id2, true)
    else
      show_normal_animation(targets, @subject.atk_animation_id1, true)
      show_normal_animation(targets, @subject.atk_animation_id2, false)
    end
  end
  #--------------------------------------------------------------------------
  # ● 显示普通动画
  #     targets      : 目标的数组
  #     animation_id : 动画ID
  #     mirror       : 左右反转
  #--------------------------------------------------------------------------
  def show_normal_animation(targets, animation_id, mirror = false)
    animation = $data_animations[animation_id]
    if animation
      targets.each do |target|
        target.animation_id = animation_id
        target.animation_mirror = mirror
        abs_wait_short unless animation.to_screen?
      end
      abs_wait_short if animation.to_screen?
    end
  end
end[/pre]
回复

使用道具 举报

梦石
0
星屑
6891
在线时间
7027 小时
注册时间
2013-11-2
回帖
1263

开拓者剧作品鉴家

发表于 2018-4-23 00:14:41 | 显示全部楼层
把事件图片改去@viewport1的后果,就是事件图片会受到画面摇晃和色调影响。但是,如果你觉得这没有问题的话(立绘就应该跟着屏幕摇晃,不是吗?),那应该没事儿了。

点评

感謝指導的說 ^.<⌒☆  发表于 2018-4-23 07:56

评分

参与人数 1赞 +1 收起 理由
真紅樂章 + 1 认可答案

查看全部评分

回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部