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

Project1

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

[已经解决] 关于动画的显示原理

 关闭 [复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
13 小时
注册时间
2011-9-3
帖子
11
跳转到指定楼层
1
发表于 2011-9-16 23:06:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题 我阅读代码时 发现了 每个精灵最终通过调用animation()这个函数
来实现动画的播放 但这个函数的实现似乎是RPG这个类里定义的 而RPG类
是代码隐藏的 手册提供的信息也不能让我理解
论坛的那个动画显示原理的神贴的图全挂了  无法阅读
希望懂得的朋友解答一下  如果比较麻烦 大概点个思路也行
问题是 : animation() 两个参数的意义 以及 每次精灵update过程中调用animation() 时
          哪里体现了动画帧数的变化?


行舟如夜于2011-9-16 23:17补充以下内容:
问题补充  RPG::Sprite 和  RPG::animation 两个类
          的关系是什么?

Lv1.梦旅人

梦石
0
星屑
50
在线时间
1281 小时
注册时间
2006-8-27
帖子
590
2
发表于 2011-9-16 23:47:20 | 只看该作者
RPG::animation 用来保存变量的
RPG::Sprite 根据RPG::animation 的值 来决定显示内容

F1里RPG::Sprite的
def animation(animation, hit)
animation = 从数据库里改好的 RPG::animation
hit = 命中的区别

没调用 animation() 前精灵也是每帧刷新的 但是 RPG::animation的值是空的 所以什么都不需要刷新

调用animation()之后  RPG::animation被从数据库里读到的数据替换了
有了内容之后 就会刷新出动画了

每刷新1次内部计数器+1 然后根据数据库里设置好的动画内容 显示和计数器编号一样的动画页

这只是思路 要学脚本不能从我这思路学 要从头开始

点评

谢谢 按照这个思路 动画的代码框架基本看懂了 但细节上问题好多  发表于 2011-9-17 01:10
回复

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
13 小时
注册时间
2011-9-3
帖子
11
3
 楼主| 发表于 2011-9-17 01:04:59 | 只看该作者
这是在RPG::Sprite  中的animation(animation, hit) 方法的定义 还有update_animation
的 这个在f1里有
def animation(animation, hit)
      dispose_animation                                   
      @_animation = animation
      return if @_animation == nil
      @_animation_hit = hit
      @_animation_duration = @_animation.frame_max
      animation_name = @_animation.animation_name
      animation_hue = @_animation.animation_hue
      bitmap = RPG::Cache.animation(animation_name, animation_hue)
      if @@_reference_count.include?(bitmap)
        @@_reference_count[bitmap] += 1
      else
        @@_reference_count[bitmap] = 1
      end
      @_animation_sprites = []
      if @_animation.position != 3 or not @@_animations.include?(animation)  //???????????
        for i in 0..15                                                                                            //问号间的这一段弄了16个
          sprite = ::Sprite.new(self.viewport)                                                          存储着动画图片的精灵
          sprite.bitmap = bitmap                                                                             保存在了@_animation_sprites     
          sprite.visible = false                                                                                    数组中 意思是最长16帧么
          @_animation_sprites.push(sprite)                                                               还有那个!= 3 的条件是什么意思
        end                                                                                                         //??????????
        unless @@_animations.include?(animation)
          @@_animations.push(animation)
        end
      end
      update_animation
    end

def update_animation
      if @_animation_duration > 0
        frame_index = @_animation.frame_max - @_animation_duration
        cell_data = @_animation.frames[frame_index].cell_data                              //这里cell_data的值估计在数据库里
        position = @_animation.position
        animation_set_sprites(@_animation_sprites, cell_data, position)                  //???调用这个函数是显示单帧图像的么?
        for timing in @_animation.timings
          if timing.frame == frame_index
            animation_process_timing(timing, @_animation_hit)                               //这个timing 也没看懂啥意思
          end                                                                                                           //能帮我看看这个函数大概在干啥么
        end
      else
        dispose_animation
      end
end



帮忙看看吧 有时代码看多了脑袋打结 一头雾水了  代码比较长 辛苦 谢谢了 !




行舟如夜于2011-9-17 02:02补充以下内容:
嗯 我基本搞懂了
16的意思是一帧里最多有16个动画元素
3表示全屏动画 那个判断是为了不重复播放全屏动画
那个函数确实是调整精灵的参数进行显示的 函数中用16次循环将16个动画元素全都画好了
animation_process_timing(timing, @_animation_hit)   这个函数还是没看懂 求解答
回复

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
1281 小时
注册时间
2006-8-27
帖子
590
4
发表于 2011-9-17 18:41:35 | 只看该作者
要学会看调用类的内容啊
  1.     def animation_process_timing(timing, hit)
  2.       if (timing.condition == 0) or
  3.          (timing.condition == 1 and hit == true) or
  4.          (timing.condition == 2 and hit == false)
  5.         if timing.se.name != ""
  6.           se = timing.se
  7.           Audio.se_play("Audio/SE/" + se.name, se.volume, se.pitch)
  8.         end
  9.         case timing.flash_scope
  10.         when 1
  11.           self.flash(timing.flash_color, timing.flash_duration * 2)
  12.         when 2
  13.           if self.viewport != nil
  14.             self.viewport.flash(timing.flash_color, timing.flash_duration * 2)
  15.           end
  16.         when 3
  17.           self.flash(nil, timing.flash_duration * 2)
  18.         end
  19.       end
复制代码
大致看了下是: 控制音效 闪烁的部分
回复

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
13 小时
注册时间
2011-9-3
帖子
11
5
 楼主| 发表于 2011-9-17 20:07:24 | 只看该作者
好的 基本明白了 想把战斗系统弄清楚还蛮花时间的 。。。
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2025-7-20 19:09

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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