赞 | 2 |
VIP | 143 |
好人卡 | 1 |
积分 | 1 |
经验 | 216792 |
最后登录 | 2019-10-10 |
在线时间 | 24 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 61
- 在线时间
- 24 小时
- 注册时间
- 2008-8-5
- 帖子
- 1924
|
很有意思的功能~其实做这个的思路就是移动时在移动前的坐标处显示脚印的精灵,然后每帧减少每个精灵对象的不透明度,透明度为 0 时释放相关的资源
需要考虑三点:
1、地图图块的遮挡关系
如果只是在屏幕上显示精灵的话和地图图块是毫无遮挡关系的,所以应该把精灵放到显示地图图块的那个 viewport 中
2、脚印要随着画面卷动而移动
如果只是在屏幕上显示精灵的话,精灵的坐标是相对于屏幕的,在地图画面卷动的时候脚印也跟着“漂移”了……所以应该刷新精灵的坐标,使其相对于地图真实坐标~
3、判断角色是否踩在雪地上
这个可以用地形标志解决
不过用了这个之后多少会影响一点帧率,所以如果移动速度调到很高的话,fps 肯定是会降很多的~
脚印的素材用一张 128 * 32 的四帧素材,分别表示四种不同的脚印方向,比如:
顺序和行走图的纵向顺序相同,南、西、东、北
脚本(插入 Main 前):
- # 雪地的地形标志
- $雪地地形标志 = 6
- class Footprint < Sprite
- def initialize(x, y, dir)
- super($footprints_viewport)
- @real_x, @real_y = x << 5, y << 5
- self.bitmap = RPG::Cache.picture("footprint.png")
- #self.src_rect = Rect.new(((dir >> 1) - 1) * 32, 0, 32, 32)
- self.src_rect = Rect.new(dir * 32, 0, 32, 32)
- #self.z = 1
- update_opacity
- end
- def update_opacity
- self.x = @real_x - ($game_map.display_x >> 2)
- self.y = @real_y - ($game_map.display_y >> 2)
- self.opacity -= 1
- if self.opacity == 0
- dispose
- $footprints.delete(self.hash)
- end
- end
- end
- class Spriteset_Map
- alias :initialize_old :initialize unless method_defined? :initialize_old
- def initialize
- initialize_old
- $footprints_viewport = @viewport1
- end
- end
- $footprints = {}
- class Game_Character
- def move_down(turn_enabled = true)
- # 面向下
- if turn_enabled
- turn_down
- end
- # 可以通行的场合
- if passable?(@x, @y, 2)
- if terrain_tag == $雪地地形标志
- obj = Footprint.new(@x, @y, 0)
- $footprints[obj.hash] = obj
- end
- # 面向下
- turn_down
- # 更新坐标
- @y += 1
- # 增加步数
- increase_steps
- # 不能通行的情况下
- else
- # 接触事件的启动判定
- check_event_trigger_touch(@x, @y+1)
- end
- end
- def move_left(turn_enabled = true)
- # 面向左
- if turn_enabled
- turn_left
- end
- # 可以通行的情况下
- if passable?(@x, @y, 4)
- if terrain_tag == $雪地地形标志
- obj = Footprint.new(@x, @y, 1)
- $footprints[obj.hash] = obj
- end
- # 面向左
- turn_left
- # 更新坐标
- @x -= 1
- # 增加步数
- increase_steps
- # 不能通行的情况下
- else
- # 接触事件的启动判定
- check_event_trigger_touch(@x-1, @y)
- end
- end
- def move_right(turn_enabled = true)
- # 面向右
- if turn_enabled
- turn_right
- end
- # 可以通行的场合
- if passable?(@x, @y, 6)
- if terrain_tag == $雪地地形标志
- obj = Footprint.new(@x, @y, 2)
- $footprints[obj.hash] = obj
- end
- # 面向右
- turn_right
- # 更新坐标
- @x += 1
- # 增加部数
- increase_steps
- # 不能通行的情况下
- else
- # 接触事件的启动判定
- check_event_trigger_touch(@x+1, @y)
- end
- end
- def move_up(turn_enabled = true)
- # 面向上
- if turn_enabled
- turn_up
- end
- # 可以通行的情况下
- if passable?(@x, @y, 8)
- if terrain_tag == $雪地地形标志
- obj = Footprint.new(@x, @y, 3)
- $footprints[obj.hash] = obj
- end
- # 面向上
- turn_up
- # 更新坐标
- @y -= 1
- # 歩数増加
- increase_steps
- # 不能通行的情况下
- else
- # 接触事件的启动判定
- check_event_trigger_touch(@x, @y-1)
- end
- end
- end
- class Scene_Map
- alias :main_old :main unless method_defined? :main_old
- def main
- main_old
- $footprints.each_key {
- |key|
- $footprints.delete(key).dispose
- }
- end
-
- alias :update_old :update unless method_defined? :update_old
- def update
- $footprints.each_value {
- |footprint|
- footprint.update_opacity
- }
- update_old
- end
- end
复制代码
效果图:
版主对此帖的认可:『如此大赞{/qiang}』,积分『+150』。 系统信息:本贴由本区版主认可为正确答案,66RPG感谢您的热情解答~ |
评分
-
查看全部评分
|