Project1
标题:
留下脚印的做法
[打印本页]
作者:
destinyNX
时间:
2009-4-17 06:21
提示:
作者被禁止或删除 内容自动屏蔽
作者:
紫苏
时间:
2009-4-17 17:58
很有意思的功能~其实做这个的思路就是移动时在移动前的坐标处显示脚印的精灵,然后每帧减少每个精灵对象的不透明度,透明度为 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
复制代码
效果图:
[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