Project1

标题: 请教动画遮挡的问题 [打印本页]

作者: 霜冻之狼    时间: 2009-11-7 20:51
标题: 请教动画遮挡的问题
比如主角被墙挡住了,主角播放动画时
动画会穿透墙直接显示在画面上

请教大大能让动画受精灵的影响被图块和事件挡住吗?
作者: 后知后觉    时间: 2009-11-7 20:51
本帖最后由 后知后觉 于 2009-11-7 23:14 编辑

这一段是事件的Z算法.事件在地图上会被遮挡物遮挡
那么只需要把动画和事件的Z弄清楚就可以.
  1.   #--------------------------------------------------------------------------
  2.   # ● 获取画面 Z 坐标
  3.   #     height : 角色的高度
  4.   #--------------------------------------------------------------------------
  5.   def screen_z(height = 0)
  6.     # 在最前显示的标志为 ON 的情况下
  7.     if @always_on_top
  8.       # 无条件设置为 999
  9.       return 999
  10.     end
  11.     # 通过实际坐标和地图的显示位置来求得画面坐标
  12.     z = (@real_y - $game_map.display_y + 3) / 4 + 32
  13.     # 元件的情况下
  14.     if @tile_id > 0
  15.       # 元件的优先不足 * 32
  16.       return z + $game_map.priorities[@tile_id] * 32
  17.     # 角色的场合
  18.     else
  19.       # 如果高度超过 32 就判定为满足 31
  20.       return z + ((height > 32) ? 31 : 0)
  21.     end
  22.   end
复制代码
要改动画的Z有2种情况
一种是把动画本体的sprite的Z改成和其本体的sprite的Y一样
这样改的话感觉上更真实.但是也的确存在一些问题
就看你的动画是什么样的动画了
一种是把动画本体sprite的Z改成和调用该动画的sprite的Z一样
这样改的话.动画sprite就会压在调用者的上面.但是和图块的遮挡关系和其相同
看加色的部分
module RPG
  class Sprite < ::Sprite
    def animation_set_sprites(sprites, cell_data, position)
      for i in 0..15
        sprite = sprites[ i ]
        pattern = cell_data[i, 0]
        if sprite == nil or pattern == nil or pattern == -1
          sprite.visible = false if sprite != nil
          next
        end
        sprite.visible = true
        sprite.src_rect.set(pattern % 5 * 192, pattern / 5 * 192, 192, 192)
        if position == 3
          if self.viewport != nil
            sprite.x = self.viewport.rect.width / 2
            sprite.y = self.viewport.rect.height - 160
          else
            sprite.x = 320
            sprite.y = 240
          end
        else
          sprite.x = self.x - self.ox + self.src_rect.width / 2
          sprite.y = self.y - self.oy + self.src_rect.height / 2
          sprite.y -= self.src_rect.height / 4 if position == 0
          sprite.y += self.src_rect.height / 4 if position == 2
        end
        sprite.x += cell_data[i, 1]
        sprite.y += cell_data[i, 2]
        sprite.z = sprite.y    # 和动画本体的Y挂钩
     #sprite.z = self.z    # 和调用者的Z一样
        #   # 如果位置是画面就和默认一样2000
        sprite.z = 2000 if position == 3

        sprite.ox = 96
        sprite.oy = 96
        sprite.zoom_x = cell_data[i, 3] / 100.0
        sprite.zoom_y = cell_data[i, 3] / 100.0
        sprite.angle = cell_data[i, 4]
        sprite.mirror = (cell_data[i, 5] == 1)
        sprite.opacity = cell_data[i, 6] * self.opacity / 255.0
        sprite.blend_type = cell_data[i, 7]
      end
    end
  end
end

.
那个position就是在数据库设置的 上.中.下.画面.的位置.
可以case一下这样效果会好得多
作者: link006007    时间: 2009-11-7 21:52
本帖最后由 link006007 于 2009-11-7 22:18 编辑

默认的动画和自己的宿主在同一个viewport,如果没有宿主则为nil
然后默认z坐标是2000
你试着修改def animation_set_sprites 的sprite.z 比如为0, 就可以看到效果了
viewport在animation或loop_animation里面初始化时修改
地图伤害显示同理

tilemap不收脚本控制, 所以上面那个在地图元件优先遮挡上依然存在问题(动画不要太大就没问题)...
要解决就要等那些逆向工程的了 高手了:lol
我对调试那些0x123456EF之类的没毅力.................
作者: link006007    时间: 2009-11-8 10:29
搞什么飞机... 这论坛有bug吧 = =
我昨天回帖的时候lz的帖子是0回复
现在怎么后知后觉同学的回帖在前面了 - -


作者: 霜冻之狼    时间: 2009-11-11 20:32
搞什么飞机... 这论坛有bug吧 = =
我昨天回帖的时候lz的帖子是0回复
现在怎么后知后觉同学的回帖在前面了 - -
link006007 发表于 2009-11-8 10:29

来晚了,果然有BUG




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