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

Project1

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

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

[复制链接]

Lv3.寻梦者

梦石
0
星屑
1939
在线时间
316 小时
注册时间
2018-3-4
帖子
57
跳转到指定楼层
1
发表于 2018-4-22 21:48:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

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

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

RUBY 代码复制
  1. #--------------------------------------------------------------------------
  2. # ● 敵方攻擊顯示動畫
  3. #--------------------------------------------------------------------------
  4.  
  5. class Game_Actor < Game_Battler
  6.   #--------------------------------------------------------------------------
  7.   # ● 是否使用精灵
  8.   #--------------------------------------------------------------------------
  9.   def use_sprite?
  10.     return true
  11.   end
  12.   #--------------------------------------------------------------------------
  13.   # ● 获取战斗画面 X 坐标
  14.   #--------------------------------------------------------------------------
  15.   def screen_x
  16.     return 480
  17.   end
  18.   #--------------------------------------------------------------------------
  19.   # ● 获取战斗画面 Y 坐标
  20.   #--------------------------------------------------------------------------
  21.   def screen_y
  22.     return 208
  23.   end
  24.   #--------------------------------------------------------------------------
  25.   # ● 获取战斗画面 Z 坐标
  26.   #--------------------------------------------------------------------------
  27.   def screen_z
  28.     return 100
  29.   end
  30. end
  31.  
  32. class Game_Enemy < Game_Battler
  33.   #--------------------------------------------------------------------------
  34.   # ● 获取普通攻击的动画 ID
  35.   #--------------------------------------------------------------------------
  36.   def atk_animation_id1
  37.     return 1
  38.   end
  39.   #--------------------------------------------------------------------------
  40.   # ● 获取普通攻击的动画 ID (双持武器:武器2)
  41.   #--------------------------------------------------------------------------
  42.   def atk_animation_id2
  43.     return 0
  44.   end
  45. end
  46.  
  47. class Scene_Battle < Scene_Base
  48.   #--------------------------------------------------------------------------
  49.   # ● 显示动画
  50.   #     targets      : 目标的数组
  51.   #     animation_id : 动画 ID(-1: 与普通攻击一样)
  52.   #--------------------------------------------------------------------------
  53.   def show_animation(targets, animation_id)
  54.     if animation_id < 0
  55.       show_attack_animation(targets)
  56.     else
  57.       show_normal_animation(targets, animation_id)
  58.     end
  59.     @log_window.wait
  60.     wait_for_animation
  61.   end
  62.   #--------------------------------------------------------------------------
  63.   # ● 显示攻击动画
  64.   #     targets : 目标的数组
  65.   #    是角色的时候考虑双持武器的效果(反转动画显示左手武器)。
  66.   #    是敌人的时候,在那一瞬间,播放“敌人普通攻击”的声效。
  67.   #--------------------------------------------------------------------------
  68.   def show_attack_animation(targets)
  69.     if @subject.actor?
  70.       show_normal_animation(targets, @subject.atk_animation_id1, false)
  71.       show_normal_animation(targets, @subject.atk_animation_id2, true)
  72.     else
  73.       show_normal_animation(targets, @subject.atk_animation_id1, true)
  74.       show_normal_animation(targets, @subject.atk_animation_id2, false)
  75.     end
  76.   end
  77.   #--------------------------------------------------------------------------
  78.   # ● 显示普通动画
  79.   #     targets      : 目标的数组
  80.   #     animation_id : 动画ID
  81.   #     mirror       : 左右反转
  82.   #--------------------------------------------------------------------------
  83.   def show_normal_animation(targets, animation_id, mirror = false)
  84.     animation = $data_animations[animation_id]
  85.     if animation
  86.       targets.each do |target|
  87.         target.animation_id = animation_id
  88.         target.animation_mirror = mirror
  89.         abs_wait_short unless animation.to_screen?
  90.       end
  91.       abs_wait_short if animation.to_screen?
  92.     end
  93.   end
  94. end

Lv4.逐梦者 (版主)

梦石
0
星屑
6901
在线时间
7028 小时
注册时间
2013-11-2
帖子
1344

开拓者剧作品鉴家

2
发表于 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

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1939
在线时间
316 小时
注册时间
2018-3-4
帖子
57
3
 楼主| 发表于 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的话
虽然暂时实验成功可是会不会出现甚麽小紅未能预测的错误

RUBY 代码复制
  1. #--------------------------------------------------------------------------
  2. # ● 敵方攻擊顯示動畫
  3. #--------------------------------------------------------------------------
  4.  
  5. class Game_Actor < Game_Battler
  6.   #--------------------------------------------------------------------------
  7.   # ● 是否使用精灵
  8.   #--------------------------------------------------------------------------
  9.   def use_sprite?
  10.     return true
  11.   end
  12.   #--------------------------------------------------------------------------
  13.   # ● 获取战斗画面 X 坐标
  14.   #--------------------------------------------------------------------------
  15.   def screen_x
  16.     return 480
  17.   end
  18.   #--------------------------------------------------------------------------
  19.   # ● 获取战斗画面 Y 坐标
  20.   #--------------------------------------------------------------------------
  21.   def screen_y
  22.     return 208
  23.   end
  24.   #--------------------------------------------------------------------------
  25.   # ● 获取战斗画面 Z 坐标
  26.   #--------------------------------------------------------------------------
  27.   def screen_z
  28.     return 100
  29.   end
  30. end
  31.  
  32. class Game_Enemy < Game_Battler
  33.   #--------------------------------------------------------------------------
  34.   # ● 获取战斗画面 Z 坐标
  35.   #--------------------------------------------------------------------------
  36.   def screen_z
  37.     return 10
  38.   end
  39.   #--------------------------------------------------------------------------
  40.   # ● 获取普通攻击的动画 ID
  41.   #--------------------------------------------------------------------------
  42.   def atk_animation_id1
  43.     return 1
  44.   end
  45.   #--------------------------------------------------------------------------
  46.   # ● 获取普通攻击的动画 ID (双持武器:武器2)
  47.   #--------------------------------------------------------------------------
  48.   def atk_animation_id2
  49.     return 0
  50.   end
  51. end
  52.  
  53. class Spriteset_Battle
  54.   #--------------------------------------------------------------------------
  55.   # ● 更新图片精灵
  56.   #--------------------------------------------------------------------------
  57.   def update_pictures
  58.     $game_troop.screen.pictures.each do |pic|
  59.       @picture_sprites[pic.number] ||= Sprite_Picture.new(@viewport1, pic)
  60.       @picture_sprites[pic.number].update
  61.     end
  62.   end
  63. end
  64.  
  65. class Scene_Battle < Scene_Base
  66.   #--------------------------------------------------------------------------
  67.   # ● 显示动画
  68.   #     targets      : 目标的数组
  69.   #     animation_id : 动画 ID(-1: 与普通攻击一样)
  70.   #--------------------------------------------------------------------------
  71.   def show_animation(targets, animation_id)
  72.     if animation_id < 0
  73.       show_attack_animation(targets)
  74.     else
  75.       show_normal_animation(targets, animation_id)
  76.     end
  77.     @log_window.wait
  78.     wait_for_animation
  79.   end
  80.   #--------------------------------------------------------------------------
  81.   # ● 显示攻击动画
  82.   #     targets : 目标的数组
  83.   #    是角色的时候考虑双持武器的效果(反转动画显示左手武器)。
  84.   #    是敌人的时候,在那一瞬间,播放“敌人普通攻击”的声效。
  85.   #--------------------------------------------------------------------------
  86.   def show_attack_animation(targets)
  87.     if @subject.actor?
  88.       show_normal_animation(targets, @subject.atk_animation_id1, false)
  89.       show_normal_animation(targets, @subject.atk_animation_id2, true)
  90.     else
  91.       show_normal_animation(targets, @subject.atk_animation_id1, true)
  92.       show_normal_animation(targets, @subject.atk_animation_id2, false)
  93.     end
  94.   end
  95.   #--------------------------------------------------------------------------
  96.   # ● 显示普通动画
  97.   #     targets      : 目标的数组
  98.   #     animation_id : 动画ID
  99.   #     mirror       : 左右反转
  100.   #--------------------------------------------------------------------------
  101.   def show_normal_animation(targets, animation_id, mirror = false)
  102.     animation = $data_animations[animation_id]
  103.     if animation
  104.       targets.each do |target|
  105.         target.animation_id = animation_id
  106.         target.animation_mirror = mirror
  107.         abs_wait_short unless animation.to_screen?
  108.       end
  109.       abs_wait_short if animation.to_screen?
  110.     end
  111.   end
  112. end
回复 支持 反对

使用道具 举报

Lv4.逐梦者 (版主)

梦石
0
星屑
6901
在线时间
7028 小时
注册时间
2013-11-2
帖子
1344

开拓者剧作品鉴家

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

点评

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

评分

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

查看全部评分

回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-17 11:38

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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