Project1

标题: 请问如何使动画播放在点(x,y) [打印本页]

作者: asdwds    时间: 2013-6-30 22:10
标题: 请问如何使动画播放在点(x,y)
本帖最后由 asdwds 于 2013-6-30 22:13 编辑

自带的播放动画都需要事件或者玩家来做原点。
我想要让动画播放在点(X,Y)
请问有什么建议吗?或者有没有类似的演示?

我试着写了一个Sprite_anime,然后它可以显示图片,但是因为不自动更新
所以不显示变化,试着在Spriteset_Map里面加了@spell.update (@spell是Sprite_anime.new),从而让其更新
Sprite_anime基本就是Sprite_Base的动画部分,其update里面是update_animation
但是告诉我 undefined method ”update “ for nil :NilClass

--------

所以如何使动画播放在某个点的位置上?
作者: SuperMario    时间: 2013-7-1 01:20
在地图上显示吗?如果是就直接把一个空事件移动到你需要的位置 ,然后再在该事件上显示动画即可。
作者: asdwds    时间: 2013-7-2 12:27
SuperMario 发表于 2013-7-1 01:20
在地图上显示吗?如果是就直接把一个空事件移动到你需要的位置 ,然后再在该事件上显示动画即可。 ...

同一个事件上能显示2个或更多的动画吗?我关键是要能够一个地方同时播放多个动画

另外空事件亦然不效率,就算不追求同一个地方播放多个动画,同时播放多个动画他都完成不了
除非我弄很多备用的空事件。然后我还要判断哪个空事件正在被用来放动画了
相当不效率
作者: Sion    时间: 2013-7-2 14:41
本帖最后由 Sion 于 2013-7-2 19:12 编辑

你可以自己写一个类来代替Sprite_Character里的@character,以此来确定动画精灵的显示坐标(参考精灵里的 update_position 方法需要使用到的 character 的数据)。
精灵也最好新建一个类(Sprite_Animation < Sprite_Base),剔除掉那些Sprite_Character里没必要调用的方法,应该是只需要要 update_position 和 update_animation 就可以

然后建立一个数组来管理,动画开始向数组里压入动画精灵,参数characer 使用新类,并设定好坐标。播放完毕后,释放并从数组中删除即可。

1.0版本VA地图显示动画有点问题,不会随着事件移动,需要打SP1补丁。


----------------------------------------------------------------
补充:

存档的时候是无法保存精灵类的。这也是人物跟精灵是分开的两个类的原因。处理数据的时候需要注意一下这个。
作者: asdwds    时间: 2013-7-3 12:18
Sion 发表于 2013-7-2 14:41
你可以自己写一个类来代替Sprite_Character里的@character,以此来确定动画精灵的显示坐标(参考精灵里的 u ...

< Sprite_Base 是必须的吗?有了这个所以才会被Spriteset更新吗?
作者: Sion    时间: 2013-7-3 12:49
asdwds 发表于 2013-7-3 12:18
< Sprite_Base 是必须的吗?有了这个所以才会被Spriteset更新吗?


不是,你要自己更新它。
建议你用数组来管理播放动画的精灵,播放的时候往数组里添加,播放完毕再删除就可以了。

这是我用的方法,是用类变量来管理他们,你可以参考一下:
  1. class Animation

  2.   @@ended_animations = []
  3.   @@animations = []
  4.   
  5.   def self.update
  6.     @@ended_animations.clear
  7.     @@animations.each {|anime| anime.update_animation}
  8.     @@animations -= @@ended_animations # 在这里删除播放完毕的动画
  9.   end
  10.   def self.start_animation(id, target, zoom_rate, mirror, viewport)
  11.     @@animations.push(Animation.new(id, target, zoom_rate, mirror, viewport))
  12.   end

  13. #...

  14.   # 播放完毕释放动画精灵
  15.   def end_animation
  16.     #...
  17.     @ani_sprites.each {|sprite| sprite.dispose}
  18.     @@ended_animations.push(self)
  19.   end
  20. end
复制代码
在Spriteset_Map里添加方法更新他们:
  1.   def update_animations
  2.     Animation::update
  3.   end
  4.   # 播放动画精灵,当然如果要调用这个方法还得首先读取到Scene_Map里的@spriteset,对它调用
  5.   def start_animation(id, target, zoom_rate = 0.25, mirror = false)
  6.     Animation::start_animation(id, target, zoom_rate, mirror, @viewport1)
  7.   end
复制代码

作者: asdwds    时间: 2013-7-3 16:40
Sion 发表于 2013-7-3 12:49
不是,你要自己更新它。
建议你用数组来管理播放动画的精灵,播放的时候往数组里添加,播放完毕再删除就 ...

原来class名::这样就可以调用那个class里面的东西吗?我以为是只有moudule
作者: asdwds    时间: 2013-7-3 16:57
Sion 发表于 2013-7-3 12:49
不是,你要自己更新它。
建议你用数组来管理播放动画的精灵,播放的时候往数组里添加,播放完毕再删除就 ...

还有一个问题,数组的[-1]是指最后一个数组中的数据吗?
作者: asdwds    时间: 2013-7-3 17:54
本帖最后由 asdwds 于 2013-7-3 18:03 编辑
Sion 发表于 2013-7-3 12:49
不是,你要自己更新它。
建议你用数组来管理播放动画的精灵,播放的时候往数组里添加,播放完毕再删除就 ...


还有几个问题。

在地图事件里写 @anime = Sprite.new后
@anime.update是不是指让@anime更新?
如果不是的话,如何让特定的一个实例变量运行class里面定义的内容

设置@x,@y就可以达到改变实例的位置吗?

viewport必须要用到吗?Viewport.new就可以了吗?
作者: Sion    时间: 2013-7-3 18:13
本帖最后由 Sion 于 2013-7-3 18:14 编辑

1.update 只是一个方法名。你要更新数据,肯定要通过调用一个方法来实现。

2.参考 Game_CharacterBase 里的 screen_x 与 screen_y 方法,事件的精灵坐标是通过这个来计算的

3. Viewport 不是必要的,F1 里写得很清楚了。使用方法参考 Spriteset_Map 里面定义的几个 Viewport。
作者: 芙蕾娅    时间: 2013-7-3 18:58
我记得Sprite_Base里有start_animation?
作者: asdwds    时间: 2013-7-3 19:23
Sion 发表于 2013-7-3 18:13
1.update 只是一个方法名。你要更新数据,肯定要通过调用一个方法来实现。

2.参考 Game_CharacterBase 里 ...

我写了一个class a,设置@a = a.new
class a
  attr_accessor :b
  def initialize
    @b = 1
end
end

@a.b 是指向了@b吗?
作者: asdwds    时间: 2013-7-3 19:37
Sion 发表于 2013-7-3 18:13
1.update 只是一个方法名。你要更新数据,肯定要通过调用一个方法来实现。

2.参考 Game_CharacterBase 里 ...

对不起,我没写完。感谢sion回答了我很多问题。这些能实践的我会自己去实践的。
作者: asdwds    时间: 2013-7-3 19:41
芙蕾娅 发表于 2013-7-3 18:58
我记得Sprite_Base里有start_animation?

其实我原本想问的是如何在同一个地方放多个动画。
因为自带的start_animation只能在一个事件或者玩家上放一个动画
所以我就想弄一个新的。

大部分sion已经给了提示了,接下来我自己一个人研究就够了
谢谢Freya




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1