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

Project1

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

[已经解决] 请教动画遮挡的问题

 关闭 [复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
128 小时
注册时间
2009-1-28
帖子
2790
跳转到指定楼层
1
发表于 2009-11-7 20:51:55 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
5星屑
比如主角被墙挡住了,主角播放动画时
动画会穿透墙直接显示在画面上

请教大大能让动画受精灵的影响被图块和事件挡住吗?

最佳答案

查看完整内容

这一段是事件的Z算法.事件在地图上会被遮挡物遮挡 那么只需要把动画和事件的Z弄清楚就可以.要改动画的Z有2种情况 一种是把动画本体的sprite的Z改成和其本体的sprite的Y一样 这样改的话感觉上更真实.但是也的确存在一些问题 就看你的动画是什么样的动画了 一种是把动画本体sprite的Z改成和调用该动画的sprite的Z一样 这样改的话.动画sprite就会压在调用者的上面.但是和图块的遮挡关系和其相同 看加色的部分 module RPG class Spri ...

炼金术的根本法则是等价交换。想要获得,必须失去同等价值的东西。每当烦躁的时候,煎熬在不想做却又正在做的烦心事中的时候,我就安慰自己,提醒自己做这些事情的目的所在,告诉自己不要忽略所获得或者即将获得的回报,物质的,精神的,肉体的,灵魂的回报!只做想做的事情,就会失去不想失去的东西。

Lv4.逐梦者

梦石
0
星屑
6865
在线时间
1666 小时
注册时间
2008-10-29
帖子
6710

贵宾

2
发表于 2009-11-7 20:51:56 | 只看该作者
本帖最后由 后知后觉 于 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一下这样效果会好得多











你知道得太多了

回复

使用道具 举报

Lv1.梦旅人

风之塞尔达

梦石
0
星屑
50
在线时间
57 小时
注册时间
2005-10-22
帖子
2492

贵宾

3
发表于 2009-11-7 21:52:47 | 只看该作者
本帖最后由 link006007 于 2009-11-7 22:18 编辑

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

tilemap不收脚本控制, 所以上面那个在地图元件优先遮挡上依然存在问题(动画不要太大就没问题)...
要解决就要等那些逆向工程的了 高手了:lol
我对调试那些0x123456EF之类的没毅力.................
在程序里延续塞尔达的传说, 在画板上勾勒塞尔达的轮廓!!
回复

使用道具 举报

Lv1.梦旅人

风之塞尔达

梦石
0
星屑
50
在线时间
57 小时
注册时间
2005-10-22
帖子
2492

贵宾

4
发表于 2009-11-8 10:29:06 | 只看该作者
搞什么飞机... 这论坛有bug吧 = =
我昨天回帖的时候lz的帖子是0回复
现在怎么后知后觉同学的回帖在前面了 - -

在程序里延续塞尔达的传说, 在画板上勾勒塞尔达的轮廓!!
回复

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
128 小时
注册时间
2009-1-28
帖子
2790
5
 楼主| 发表于 2009-11-11 20:32:06 | 只看该作者
搞什么飞机... 这论坛有bug吧 = =
我昨天回帖的时候lz的帖子是0回复
现在怎么后知后觉同学的回帖在前面了 - -
link006007 发表于 2009-11-8 10:29

来晚了,果然有BUG

炼金术的根本法则是等价交换。想要获得,必须失去同等价值的东西。每当烦躁的时候,煎熬在不想做却又正在做的烦心事中的时候,我就安慰自己,提醒自己做这些事情的目的所在,告诉自己不要忽略所获得或者即将获得的回报,物质的,精神的,肉体的,灵魂的回报!只做想做的事情,就会失去不想失去的东西。
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-12-27 11:33

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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