Project1

标题: 留下脚印的做法 [打印本页]

作者: destinyNX    时间: 2009-4-17 06:21
提示: 作者被禁止或删除 内容自动屏蔽
作者: 紫苏    时间: 2009-4-17 17:58
很有意思的功能~其实做这个的思路就是移动时在移动前的坐标处显示脚印的精灵,然后每帧减少每个精灵对象的不透明度,透明度为 0 时释放相关的资源

需要考虑三点:
1、地图图块的遮挡关系
如果只是在屏幕上显示精灵的话和地图图块是毫无遮挡关系的,所以应该把精灵放到显示地图图块的那个 viewport 中
2、脚印要随着画面卷动而移动
如果只是在屏幕上显示精灵的话,精灵的坐标是相对于屏幕的,在地图画面卷动的时候脚印也跟着“漂移”了……所以应该刷新精灵的坐标,使其相对于地图真实坐标~
3、判断角色是否踩在雪地上
这个可以用地形标志解决

不过用了这个之后多少会影响一点帧率,所以如果移动速度调到很高的话,fps 肯定是会降很多的~

脚印的素材用一张 128 * 32 的四帧素材,分别表示四种不同的脚印方向,比如:


顺序和行走图的纵向顺序相同,南、西、东、北

脚本(插入 Main 前):
  1. # 雪地的地形标志
  2. $雪地地形标志 = 6

  3. class Footprint < Sprite
  4.   def initialize(x, y, dir)
  5.     super($footprints_viewport)
  6.     @real_x, @real_y = x << 5, y << 5
  7.     self.bitmap = RPG::Cache.picture("footprint.png")
  8.     #self.src_rect = Rect.new(((dir >> 1) - 1) * 32, 0, 32, 32)
  9.     self.src_rect = Rect.new(dir * 32, 0, 32, 32)
  10.     #self.z = 1
  11.     update_opacity
  12.   end
  13.   def update_opacity
  14.     self.x = @real_x - ($game_map.display_x >> 2)
  15.     self.y = @real_y - ($game_map.display_y >> 2)
  16.     self.opacity -= 1
  17.     if self.opacity == 0
  18.       dispose
  19.       $footprints.delete(self.hash)
  20.     end
  21.   end
  22. end

  23. class Spriteset_Map
  24.   alias :initialize_old :initialize unless method_defined? :initialize_old
  25.   def initialize
  26.     initialize_old
  27.     $footprints_viewport = @viewport1
  28.   end
  29. end

  30. $footprints = {}
  31. class Game_Character
  32.   def move_down(turn_enabled = true)
  33.     # 面向下
  34.     if turn_enabled
  35.       turn_down
  36.     end
  37.     # 可以通行的场合
  38.     if passable?(@x, @y, 2)
  39.       if terrain_tag == $雪地地形标志
  40.         obj = Footprint.new(@x, @y, 0)
  41.         $footprints[obj.hash] = obj
  42.       end
  43.       # 面向下
  44.       turn_down
  45.       # 更新坐标
  46.       @y += 1
  47.       # 增加步数
  48.       increase_steps
  49.     # 不能通行的情况下
  50.     else
  51.       # 接触事件的启动判定
  52.       check_event_trigger_touch(@x, @y+1)
  53.     end
  54.   end

  55.   def move_left(turn_enabled = true)
  56.     # 面向左
  57.     if turn_enabled
  58.       turn_left
  59.     end
  60.     # 可以通行的情况下
  61.     if passable?(@x, @y, 4)
  62.       if terrain_tag == $雪地地形标志
  63.         obj = Footprint.new(@x, @y, 1)
  64.         $footprints[obj.hash] = obj
  65.       end
  66.       # 面向左
  67.       turn_left
  68.       # 更新坐标
  69.       @x -= 1
  70.       # 增加步数
  71.       increase_steps
  72.     # 不能通行的情况下
  73.     else
  74.       # 接触事件的启动判定
  75.       check_event_trigger_touch(@x-1, @y)
  76.     end
  77.   end

  78.   def move_right(turn_enabled = true)
  79.     # 面向右
  80.     if turn_enabled
  81.       turn_right
  82.     end
  83.     # 可以通行的场合
  84.     if passable?(@x, @y, 6)
  85.       if terrain_tag == $雪地地形标志
  86.         obj = Footprint.new(@x, @y, 2)
  87.         $footprints[obj.hash] = obj
  88.       end
  89.       # 面向右
  90.       turn_right
  91.       # 更新坐标
  92.       @x += 1
  93.       # 增加部数
  94.       increase_steps
  95.     # 不能通行的情况下
  96.     else
  97.       # 接触事件的启动判定
  98.       check_event_trigger_touch(@x+1, @y)
  99.     end
  100.   end

  101.   def move_up(turn_enabled = true)
  102.     # 面向上
  103.     if turn_enabled
  104.       turn_up
  105.     end
  106.     # 可以通行的情况下
  107.     if passable?(@x, @y, 8)
  108.       if terrain_tag == $雪地地形标志
  109.         obj = Footprint.new(@x, @y, 3)
  110.         $footprints[obj.hash] = obj
  111.       end
  112.       # 面向上
  113.       turn_up
  114.       # 更新坐标
  115.       @y -= 1
  116.       # 歩数増加
  117.       increase_steps
  118.     # 不能通行的情况下
  119.     else
  120.       # 接触事件的启动判定
  121.       check_event_trigger_touch(@x, @y-1)
  122.     end
  123.   end
  124. end

  125. class Scene_Map
  126.   alias :main_old :main unless method_defined? :main_old
  127.   def main
  128.     main_old
  129.     $footprints.each_key {
  130.       |key|
  131.       $footprints.delete(key).dispose      
  132.     }
  133.   end
  134.   
  135.   alias :update_old :update unless method_defined? :update_old
  136.   def update
  137.     $footprints.each_value {
  138.       |footprint|
  139.       footprint.update_opacity
  140.     }
  141.     update_old
  142.   end
  143. end
复制代码


效果图:
[LINE]1,#dddddd[/LINE]版主对此帖的认可:『如此大赞{/qiang}』,积分『+150』。 [LINE]1,#dddddd[/LINE]系统信息:本贴由本区版主认可为正确答案,66RPG感谢您的热情解答~
作者: Tabris_Air    时间: 2009-4-17 18:44
赞~~
这样不只是雪地脚印,水上飘(?)的波纹,恶魔猎手走过的冒火,边走边掉血都一并解决了~
作者: 紫苏    时间: 2009-4-17 19:11
嗯,不过恶魔猎手那种就不用判断地形标志了,随时都冒火……
暴雪的游戏有超多这样的效果,火墙、拦截、疾跑时的残影、火箭炮喷的火,还有亡灵和死骑的坐骑踏过地面留下的蹄痕{/se}
山口山中不同的种族职业脚印也不同,比如小德留下的就可以是爪痕、牛头是牛蹄印,这些都可以在上面的基础上扩充,而如果要多种效果同时存在的话,就可以设计不同的 Sprite 派生类(这里只写了一个 Footprint)分别在不同的场合显示不同的效果~
作者: destinyNX    时间: 2009-4-17 19:42
提示: 作者被禁止或删除 内容自动屏蔽
作者: 亿万星辰    时间: 2009-4-17 20:18
代码部分写的相当的不错啊
作者: hitlerson    时间: 2009-4-17 20:25
受亿万老师如此夸奖,真是很高的荣誉呢~!恭喜紫苏大啊
作者: 塑望    时间: 2009-4-17 20:33
{/fd} 话说我也在研究的说

直接套去学习  谢谢 {/hx}

另外很期待楼上的卡牌系统 {/se}




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