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

Project1

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

【脚本恢复】『脚本从零改起』雪地脚印系统

 关闭 [复制链接]

Lv2.观梦者

傻♂逼

梦石
0
星屑
374
在线时间
1606 小时
注册时间
2007-3-13
帖子
6562

烫烫烫开拓者

跳转到指定楼层
1
发表于 2007-12-16 18:10:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
主题贴:【 『脚本从零改起』雪地脚印系统(Hard) 】(原帖)(无图)(目录)
刹那的微笑  (2007-11-11 16:18:27)
--------------------------------------------------------------------------------
☆ 思考与研究 ☆ 『脚本从零改起』雪地脚印系统

by 刹那的微笑,欢迎发布与随意转载


这个系统的来源讨论贴如下:http://rpg.blue/forumTopicRead_formake.asp?id=73881

这个系统的需求就是:当在雪地上移动的时候,人物走过的地方会留下脚印。这个脚本从零开始创建难度颇高,我这里仅仅简略给出整个系统的思考过程:


1、在雪地移动才留下脚印,说明需要对地图上的地形进行区分,这里使用地形标志进行判断。

2、走过才留下,所以需要和人物的移动有一定的关系(包括角色和NPC),可以监视角色和NPC的移动,也可以仅仅改写他们移动的函数。

3、脚印片刻后会消失,那么这里就需要对画到地图上的脚印进行刷新计数。片刻后消失表示需要动画,在RMXP中动画有两种方式,一种是数据库制作的动画,另一种角色character的动画,这里需要做出一个选择。由于数据库制作的动画默认Z值很高,会覆盖过树木和房屋,如果修改默认Z对系统改动太大,很可能出其他意外Bug,鉴于下面还有问题4的存在,所以这里我选用角色character制作动画。所以首先制作4张图片:u2,u4,u6,u8,分别对应下左右上4个方向的脚印。

4、屏幕移动的时候,脚印应该是留在地图上而不是画在屏幕上——所以脚印最好是作为一个事件存在。


以上基本定型了整个系统的技术,也就是:当人物在雪地(这里规定雪地的地形标志为5)上移动的时候,在人物的位置创建一个事件,事件的图片是脚印。然后随着刷新,脚印会自动播放character动画,当播放差不多的时候将其消失。

这里需要在地图上创建事件,在www.66RPG.com搜索“事件”,可以找到灼眼的夏娜写的脚本:http://rpg.blue/web/htm/news620.htm,研究一下发现这个脚本的使用方法是$scene.conjure(x,y,事件名,角色形象文件名) 来在地图上创建事件的。不过这个创建方法需要dispose掉整个地图然后重绘,这肯定是有点效率问题,没关系,最后再优化。

下面开始详细写整个脚本,过程分为实现和优化两步:

效果实现:

第一步:创建几个变量,用来记录各位角色站在雪地上的X、Y、面向,放在Game_Character 1的创建initialize里面:
  1. # 记录主角当前坐标的各种情况
  2. @oldx = -1
  3. @oldy = -1
  4. @oldd = 0
  5. @oldt = 0
  6. @ani = []
复制代码


第二步:在Game_Character里面创建生成脚印的函数:
  1. # XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  2. #---------------------------------------------------
  3. # 生成脚印
  4. #---------------------------------------------------
  5. def showani
  6. # 如果地形标志不是5,就不播动画了。
  7. return if @oldt != 5

  8. # 根据走步的方向来决定脚印的动画
  9. @ani.push([$scene.conjure(@oldx, @oldy,"st","u"[email protected]_s), 50])

  10. end
复制代码

这里用到了上面夏娜的外挂脚本,使用这种方法是想要将@ani弄成一个数组,大体结构如下:
[
[脚印事件1, 脚印事件1的刷新帧数]
[脚印事件2, 脚印事件2的刷新帧数]
[脚印事件3, 脚印事件3的刷新帧数]
……
]
这里刷新帧数表示脚印事件还差多少帧需要消失掉。

第三步:设置脚印的创建(上面只是写了创建时候使用的函数,还没有被调用),为了省事,我们将监视的内容写在Game_Character的def update里面:
  1. # XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  2. # 如果NPC挪动了,那么就生成脚印
  3. if @oldx != self.x or @oldy != self.y
  4. showani
  5. @oldx = self.x
  6. @oldy = self.y
  7. @oldd = self.direction
  8. @oldt = self.terrain_tag
  9. end
复制代码

这样,当NPC挪动之后就会创建脚印事件了,因为中间调用了showani,同时确保人物移动之后保持XY等监视内容的监视。

第四步:设置脚印的刷新和消失:
  1. # XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  2. # 如果存在脚印,则用for循环找到每个脚印,将等待帧数-1
  3. # 当等待帧数=0的时候,就把这个脚印删除
  4. if @ani != nil
  5. for ani in @ani
  6. ani[1] -= 1
  7. if ani[1] == 0
  8. $scene.del_event(ani[0])
  9. @ani.delete(ani)
  10. end
  11. end
  12. end
复制代码

这里就是首先判断,@ani这个记录脚印和刷新的东西是否为空,不为空的时候开始循环所有的脚步,将等待帧数-1。当等待帧数为0的时候,从屏幕上和@ani里面删除掉这个脚步事件。由于是“事件”,所以事件本身的刷新不需要在这里写。

第五步:在夏娜的脚本书写del_event的方法,因为夏娜那个脚本只能创建不能删除:
  1. # XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  2. #-------------------------------------
  3. # 删除事件
  4. #-------------------------------------
  5. def del_event(map_events)
  6. $game_map.map.events[map_events.id] = nil
  7. $game_map.events.delete(map_events.id + 1)
  8. @spriteset_map.dispose
  9. @spriteset_map = Spriteset_Map.new
  10. end
复制代码


完成这些之后,脚本基本能凑合使用了,但是实际上距离能够真正应用还很远,因为这里每次把@spriteset_map给dispose之后重新创建,速度非常慢。所以下面需要进行优化。


--------------------------------------------------------------------------------


优化步骤:

第一步:首先,夏娜脚本的一个bug是,如果地图上事件的编号不连续,那么就会发生创建bug,为了考虑不连续的情况,我们需要先能够找到地图上事件编号的最大值,写一个简单的查找功能即可:
[code]#-------------------------------------
# 专门用于寻找当前地图上最大的ID
#----……
长篇帖子,完整版请原地址查看


Eclair :
可以看懂的话真的不是很难做到.....
不过如果脚印太多...事件过多的话FPS会保不住哦~~ :(
或许这样会更好一些呢...
http://rpg.blue/viewthread.php?tid=71624
只是新建sprite而不是event的话,效率会快很多...
--------------------------------------------------------------------------------
>缺牙de兔子 :
的确这样做会让程序变得很卡

发现走了十几步后缓存不足 直接提示:脚本已复制--

痛苦中........
--------------------------------------------------------------------------------
>gpra8764 :
先鼓励下,希望可以修改不足之处哦
--------------------------------------------------------------------------------
>刹那的微笑 :

以下引用Eclair于2007-11-11 16:47:12的发言:

可以看懂的话真的不是很难做到.....
不过如果脚印太多...事件过多的话FPS会保不住哦~~ :(
或许这样会更好一些呢...
http://rpg.blue/viewthread.php?tid=71624
只是新建sprite而不是event的话,效率会快很多...
[/quote]

技术选型的原因我写在原帖里面了,实际上你这种播放动画的方法就是幻鱼最开始使用的方法,引用一下,有以下几个问题:
问题1、人物并不比地图高。否则就失去遮挡关系了。
问题2、在默认系脚本下,动画的z远高于人物,所以鱼老大使用了viewport来划分z,但是产生了问题1的bug。
问题3、如果不改变人物的viewport,解决问题1,但是问题2会产生脚印覆盖在人头上的情况,这时候可以修改RPG::Sprite来改变所有动画的Z值,默认是3000,改为self.z的话,那么生成脚印时指定z就可以解决1、2全部bug。这样听起来是解决好了,但是有一个问题,就是改动代价太大了,太底层了,同时实际上还有两个致命问题,这里两个BUG没太想出来怎么能处理:

致命BUG1:NPC没有脚印。
致命BUG2:由于创建脚印时候给出了x,y,所以屏幕不能移动。一旦移动就会发现脚印没有跟着动。

致命BUG1就比较麻烦了,因为这里使用的是在scene中监视,所以监视所有NPC代价不低。可以做,但是代价不低。致命BUG2就更麻烦了,因为这里的X和Y是根据realx和realy的算法得出来的,但是创建之后脚印就和人物无关了,只好监视屏幕的所有移动。可以做,但是这样代价也不低。


这几个BUG改起来挺费时间,而且你想要做的只是在30帧之内单事件刷新的系统负担转移为永久存在的update监视的负担(30帧是我这里的事件30帧消失)。这两个哪个效率比较高从表面上不好判断,但是只能说用sprite建立的话,首先你的监视是不能停的,当大部分人物在非雪地静止时候,负担很高;第二是对底层的修改过大(比如需要修改RPG::Sprite类的动画z值,需要监视地图移动,需要追踪realx和realy)。你可以尝试使用这种精灵的方法制作,作为另一种范例放出也未尝不可,这种方法其实可能会适合解决缺牙兔子的大地图大范围下雪——但是效果我不确定,因为这种把脚印作为基础效果而非特效效果的人太少了,我无法预测。

至于缺牙的兔子遇到的问题实际上和这个脚本无关,而是另一种理念的问题。你的地图是500*500的,这种大小的地图,就算不是BUG,你也是没有为玩家着想过。我们一般认为对单机玩家而言,单向移动应该在不超过20秒之内应该能达到目的地,而500的宽度至少需要2分10秒以上才能走完(此数值很容易测试),那么光看完你的地图就需要 2 * (500 / 15) = 66分钟。一张地图,纯看,不做任何思考地看,就需要耗费玩家1个小时,这个设计本身明显是有一些值得优化的地方的,就好比我们的场景有10万格,但是这并不是说一张地图上应该有10万格,按照正常的设计,至少我应该有100张地图,每张1000格,以策划和关卡设计制作人稍微消耗一些时间制作无缝链接地图来替换技术优化的时间。

另外还有一个你的想法似乎是不太对的,就是说,并不是屏幕上所有图像的算法都是一样的。举一个最简单的例子来说,我们看到很多游戏的阴影是半透明的叠加效果,但是并不是说整张画面所有位置都要用半透明效果(无论2D的绘制还是3D纹理贴图,都一样的)。真正的处理是整个屏幕使用colorKey一类的较快算法,而只对阴影部分使用alphaBlend等消耗运算时间的算法。同理,你可能见到某些游戏中有镜子,你自己还可以照镜子有倒影,但是这个镜子只是针对当时场景制作的一个小玩意,我相信你绝对不会在该游戏中见到镜子照了几十个人或者满屏幕都是镜子的情况。

这就是说,不要认为这个雪地脚印需要无限优化,这是舍本逐末。我们所要用的,只是在需要雪的时候,少量使用地形标志5,少量制作一些给玩家真实感的东西,就可以了。截止现在,没有任何一台主机能够在屏幕效果过于花哨的情况下不掉帧的,PS3、XBOX360也做不到,看龙穴、三国无双5把镜头拉低之后卡的程度就知道了,尤其三国无双五FPS甚至能掉到10以下,但这并不影响它是一个优秀的游戏,因为这种产生掉帧做法是非常规的。技术并不是万能的,我们追求的应该是在技术已经做过厚道的优化、实现了基本可行的效果之后,用策划和关卡设计来实现效果。如果你要做全屏幕都是雪地的情况,那么好了,我们需要根据全屏雪地来单独设计程序,比如在所有优先级为0的雪地上按同Z值生成一个Sprite的方法生成一些脚印专用层,并且在进入地图的时候直接创建,不管占用多少内存,一直保留着,然后需要脚印的时候再copyrect和调整透明度,或者不是每帧刷新而是每隔一段时间下一些雪等等。这是全屏的处理方法,我给出的是特效的处理方法。对于特效而言,下图的效果我自己已经满意了,请注意FPS:
http://rpg.blue/upload_program/files/snowsteps.jpg

我的意思是,不要永远认为脚本应该如何优化优化,当你的设计不太对的时候,无论用目前地球上任何一种系统或主机(RM还是PS3都无所谓),用多么牛的程序员,该掉帧就得掉帧。这时候先想想,你自己都觉得设计有点问题的地方,是不是也该改改了?
--------------------------------------------------------------------------------
>yangff :
直接创建图片不就行了?
--------------------------------------------------------------------------------
>刹那的微笑 :

以下引用yangff于2007-11-11 20:52:35的发言:

直接创建图片不就行了?



同样的BUG我不想再说第四遍了,如果你觉得能创建成功的话,欢迎做一个出来。
--------------------------------------------------------------------------------
>小真☆爱舞 :
如果我可以修改四个地方,只用十行脚本实现他现在的这个功能,楼主你能不能改一下这句话呢?
“不要认为这个雪地脚印需要无限优化,这是舍本逐末。我们所要用的,只是在需要雪的时候,少量使用地形标志5,少量制作一些给玩家真实感的东西,就可以了”
--------------------------------------------------------------------------------
>刹那的微笑 :
好啊,欢迎贴出来交流,开阔一下思路。现在这个系统已经讨论了两种做法,一种是我详细写的创建事件,一种是幻鱼和小林说的sprite,如果让我再说可能只有copyrect和fillrect的方法了,很希望能看到不同方向的技术思路。

不过对那句话可能得解释一下,因为他回帖在原帖里了。我说不适合用通用方法是针对他的500*500格大地图,而且我也认为对不同效果分类处理是程序优化的原则。只是具体到雪地脚印这个,可能目前的优化方法不够好,那么找到更好的效率优化方法后,可能就不存在效果分类的问题。但是这个脚印的优化结果对游戏编程需要分类处理的基本思路而言,至少对我来说,并没有什么影响。

至于说到对其他的程序员,就仁者见仁智者见智了。因为我自己能用在RM上的时间很少,必须在每周有限的几小时内完成计划做的内容,这样尽管可能不够优化,但至少能做出来不至于怠工。如果能用在RM上的时间比较多,比如每天都能投入一个小时,那自然技术路线就不同了。
--------------------------------------------------------------------------------
>小真☆爱舞 :
感谢指教。
PS:多谢合作,终于知道你是谁了~
--------------------------------------------------------------------------------
>Eclair :

以下引用小真☆爱舞于2007-11-11 21:07:39的发言:

如果我可以修改四个地方,只用十行脚本实现他现在的这个功能,楼主你能不能改一下这句话呢?
“不要认为这个雪地脚印需要无限优化,这是舍本逐末。我们所要用的,只是在需要雪的时候,少量使用地形标志5,少量制作一些给玩家真实感的东西,就可以了”


[本贴由作者于 2007-11-11 21:10:42 最后编辑]

哇~~~~~~口气好大的样子.....
好像很强呢...期待了....
无责任YY:
莫非是调用外部的东西绘图处理之类的...这偶彻底不行了...偶滴技术还是很局限呢~~~~~
[quote]以下引用刹那的微笑于2007-11-11 21:38:33的发言:

好啊,欢迎贴出来交流,开阔一下思路。现在这个系统已经讨论了两种做法,一种是我详细写的创建事件,一种是幻鱼和小林说的sprite,如果让我再说可能只有copyrect和fillrect的方法了,很希望能看到不同方向的技术思路。
[本贴由作者于 2007-11-11 21:49:16 最后编辑]


你怎么知道我那个极端的非常的事分得不爽的破外号的???!! >_<
--------------------------------------------------------------------------------
>刹那的微笑 :
………………………………{/shan} (逃了)
--------------------------------------------------------------------------------
>冰水 :
{/se}看到技术讨论贴啊,我也说说自己的想法
没试验过.不知道刷新有没有问题
在地图图块中添加上带脚印的图块.然后直接修改Tilemap的map_data属性,人物踩的时侯替换图块,过一段再替换回来.这样应该比用精灵和事件的效率都高得多.
只在运行中改过priorities属性,没有问题.
Tilemap的刷新好像是用c写的,修改map_data属性不知道能不能即时显示,现在没有rgxp,没法试验^^
--------------------------------------------------------------------------------
>yangff :
和角色跟随冲突  
哎呀,蛋疼什么的最有爱了

Lv2.观梦者

傻♂逼

梦石
0
星屑
374
在线时间
1606 小时
注册时间
2007-3-13
帖子
6562

烫烫烫开拓者

2
 楼主| 发表于 2007-12-16 18:10:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
主题贴:【 『脚本从零改起』雪地脚印系统(Hard) 】(原帖)(无图)(目录)
刹那的微笑  (2007-11-11 16:18:27)
--------------------------------------------------------------------------------
☆ 思考与研究 ☆ 『脚本从零改起』雪地脚印系统

by 刹那的微笑,欢迎发布与随意转载


这个系统的来源讨论贴如下:http://rpg.blue/forumTopicRead_formake.asp?id=73881

这个系统的需求就是:当在雪地上移动的时候,人物走过的地方会留下脚印。这个脚本从零开始创建难度颇高,我这里仅仅简略给出整个系统的思考过程:


1、在雪地移动才留下脚印,说明需要对地图上的地形进行区分,这里使用地形标志进行判断。

2、走过才留下,所以需要和人物的移动有一定的关系(包括角色和NPC),可以监视角色和NPC的移动,也可以仅仅改写他们移动的函数。

3、脚印片刻后会消失,那么这里就需要对画到地图上的脚印进行刷新计数。片刻后消失表示需要动画,在RMXP中动画有两种方式,一种是数据库制作的动画,另一种角色character的动画,这里需要做出一个选择。由于数据库制作的动画默认Z值很高,会覆盖过树木和房屋,如果修改默认Z对系统改动太大,很可能出其他意外Bug,鉴于下面还有问题4的存在,所以这里我选用角色character制作动画。所以首先制作4张图片:u2,u4,u6,u8,分别对应下左右上4个方向的脚印。

4、屏幕移动的时候,脚印应该是留在地图上而不是画在屏幕上——所以脚印最好是作为一个事件存在。


以上基本定型了整个系统的技术,也就是:当人物在雪地(这里规定雪地的地形标志为5)上移动的时候,在人物的位置创建一个事件,事件的图片是脚印。然后随着刷新,脚印会自动播放character动画,当播放差不多的时候将其消失。

这里需要在地图上创建事件,在www.66RPG.com搜索“事件”,可以找到灼眼的夏娜写的脚本:http://rpg.blue/web/htm/news620.htm,研究一下发现这个脚本的使用方法是$scene.conjure(x,y,事件名,角色形象文件名) 来在地图上创建事件的。不过这个创建方法需要dispose掉整个地图然后重绘,这肯定是有点效率问题,没关系,最后再优化。

下面开始详细写整个脚本,过程分为实现和优化两步:

效果实现:

第一步:创建几个变量,用来记录各位角色站在雪地上的X、Y、面向,放在Game_Character 1的创建initialize里面:
  1. # 记录主角当前坐标的各种情况
  2. @oldx = -1
  3. @oldy = -1
  4. @oldd = 0
  5. @oldt = 0
  6. @ani = []
复制代码


第二步:在Game_Character里面创建生成脚印的函数:
  1. # XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  2. #---------------------------------------------------
  3. # 生成脚印
  4. #---------------------------------------------------
  5. def showani
  6. # 如果地形标志不是5,就不播动画了。
  7. return if @oldt != 5

  8. # 根据走步的方向来决定脚印的动画
  9. @ani.push([$scene.conjure(@oldx, @oldy,"st","u"[email protected]_s), 50])

  10. end
复制代码

这里用到了上面夏娜的外挂脚本,使用这种方法是想要将@ani弄成一个数组,大体结构如下:
[
[脚印事件1, 脚印事件1的刷新帧数]
[脚印事件2, 脚印事件2的刷新帧数]
[脚印事件3, 脚印事件3的刷新帧数]
……
]
这里刷新帧数表示脚印事件还差多少帧需要消失掉。

第三步:设置脚印的创建(上面只是写了创建时候使用的函数,还没有被调用),为了省事,我们将监视的内容写在Game_Character的def update里面:
  1. # XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  2. # 如果NPC挪动了,那么就生成脚印
  3. if @oldx != self.x or @oldy != self.y
  4. showani
  5. @oldx = self.x
  6. @oldy = self.y
  7. @oldd = self.direction
  8. @oldt = self.terrain_tag
  9. end
复制代码

这样,当NPC挪动之后就会创建脚印事件了,因为中间调用了showani,同时确保人物移动之后保持XY等监视内容的监视。

第四步:设置脚印的刷新和消失:
  1. # XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  2. # 如果存在脚印,则用for循环找到每个脚印,将等待帧数-1
  3. # 当等待帧数=0的时候,就把这个脚印删除
  4. if @ani != nil
  5. for ani in @ani
  6. ani[1] -= 1
  7. if ani[1] == 0
  8. $scene.del_event(ani[0])
  9. @ani.delete(ani)
  10. end
  11. end
  12. end
复制代码

这里就是首先判断,@ani这个记录脚印和刷新的东西是否为空,不为空的时候开始循环所有的脚步,将等待帧数-1。当等待帧数为0的时候,从屏幕上和@ani里面删除掉这个脚步事件。由于是“事件”,所以事件本身的刷新不需要在这里写。

第五步:在夏娜的脚本书写del_event的方法,因为夏娜那个脚本只能创建不能删除:
  1. # XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  2. #-------------------------------------
  3. # 删除事件
  4. #-------------------------------------
  5. def del_event(map_events)
  6. $game_map.map.events[map_events.id] = nil
  7. $game_map.events.delete(map_events.id + 1)
  8. @spriteset_map.dispose
  9. @spriteset_map = Spriteset_Map.new
  10. end
复制代码


完成这些之后,脚本基本能凑合使用了,但是实际上距离能够真正应用还很远,因为这里每次把@spriteset_map给dispose之后重新创建,速度非常慢。所以下面需要进行优化。


--------------------------------------------------------------------------------


优化步骤:

第一步:首先,夏娜脚本的一个bug是,如果地图上事件的编号不连续,那么就会发生创建bug,为了考虑不连续的情况,我们需要先能够找到地图上事件编号的最大值,写一个简单的查找功能即可:
[code]#-------------------------------------
# 专门用于寻找当前地图上最大的ID
#----……
长篇帖子,完整版请原地址查看


Eclair :
可以看懂的话真的不是很难做到.....
不过如果脚印太多...事件过多的话FPS会保不住哦~~ :(
或许这样会更好一些呢...
http://rpg.blue/viewthread.php?tid=71624
只是新建sprite而不是event的话,效率会快很多...
--------------------------------------------------------------------------------
>缺牙de兔子 :
的确这样做会让程序变得很卡

发现走了十几步后缓存不足 直接提示:脚本已复制--

痛苦中........
--------------------------------------------------------------------------------
>gpra8764 :
先鼓励下,希望可以修改不足之处哦
--------------------------------------------------------------------------------
>刹那的微笑 :

以下引用Eclair于2007-11-11 16:47:12的发言:

可以看懂的话真的不是很难做到.....
不过如果脚印太多...事件过多的话FPS会保不住哦~~ :(
或许这样会更好一些呢...
http://rpg.blue/viewthread.php?tid=71624
只是新建sprite而不是event的话,效率会快很多...
[/quote]

技术选型的原因我写在原帖里面了,实际上你这种播放动画的方法就是幻鱼最开始使用的方法,引用一下,有以下几个问题:
问题1、人物并不比地图高。否则就失去遮挡关系了。
问题2、在默认系脚本下,动画的z远高于人物,所以鱼老大使用了viewport来划分z,但是产生了问题1的bug。
问题3、如果不改变人物的viewport,解决问题1,但是问题2会产生脚印覆盖在人头上的情况,这时候可以修改RPG::Sprite来改变所有动画的Z值,默认是3000,改为self.z的话,那么生成脚印时指定z就可以解决1、2全部bug。这样听起来是解决好了,但是有一个问题,就是改动代价太大了,太底层了,同时实际上还有两个致命问题,这里两个BUG没太想出来怎么能处理:

致命BUG1:NPC没有脚印。
致命BUG2:由于创建脚印时候给出了x,y,所以屏幕不能移动。一旦移动就会发现脚印没有跟着动。

致命BUG1就比较麻烦了,因为这里使用的是在scene中监视,所以监视所有NPC代价不低。可以做,但是代价不低。致命BUG2就更麻烦了,因为这里的X和Y是根据realx和realy的算法得出来的,但是创建之后脚印就和人物无关了,只好监视屏幕的所有移动。可以做,但是这样代价也不低。


这几个BUG改起来挺费时间,而且你想要做的只是在30帧之内单事件刷新的系统负担转移为永久存在的update监视的负担(30帧是我这里的事件30帧消失)。这两个哪个效率比较高从表面上不好判断,但是只能说用sprite建立的话,首先你的监视是不能停的,当大部分人物在非雪地静止时候,负担很高;第二是对底层的修改过大(比如需要修改RPG::Sprite类的动画z值,需要监视地图移动,需要追踪realx和realy)。你可以尝试使用这种精灵的方法制作,作为另一种范例放出也未尝不可,这种方法其实可能会适合解决缺牙兔子的大地图大范围下雪——但是效果我不确定,因为这种把脚印作为基础效果而非特效效果的人太少了,我无法预测。

至于缺牙的兔子遇到的问题实际上和这个脚本无关,而是另一种理念的问题。你的地图是500*500的,这种大小的地图,就算不是BUG,你也是没有为玩家着想过。我们一般认为对单机玩家而言,单向移动应该在不超过20秒之内应该能达到目的地,而500的宽度至少需要2分10秒以上才能走完(此数值很容易测试),那么光看完你的地图就需要 2 * (500 / 15) = 66分钟。一张地图,纯看,不做任何思考地看,就需要耗费玩家1个小时,这个设计本身明显是有一些值得优化的地方的,就好比我们的场景有10万格,但是这并不是说一张地图上应该有10万格,按照正常的设计,至少我应该有100张地图,每张1000格,以策划和关卡设计制作人稍微消耗一些时间制作无缝链接地图来替换技术优化的时间。

另外还有一个你的想法似乎是不太对的,就是说,并不是屏幕上所有图像的算法都是一样的。举一个最简单的例子来说,我们看到很多游戏的阴影是半透明的叠加效果,但是并不是说整张画面所有位置都要用半透明效果(无论2D的绘制还是3D纹理贴图,都一样的)。真正的处理是整个屏幕使用colorKey一类的较快算法,而只对阴影部分使用alphaBlend等消耗运算时间的算法。同理,你可能见到某些游戏中有镜子,你自己还可以照镜子有倒影,但是这个镜子只是针对当时场景制作的一个小玩意,我相信你绝对不会在该游戏中见到镜子照了几十个人或者满屏幕都是镜子的情况。

这就是说,不要认为这个雪地脚印需要无限优化,这是舍本逐末。我们所要用的,只是在需要雪的时候,少量使用地形标志5,少量制作一些给玩家真实感的东西,就可以了。截止现在,没有任何一台主机能够在屏幕效果过于花哨的情况下不掉帧的,PS3、XBOX360也做不到,看龙穴、三国无双5把镜头拉低之后卡的程度就知道了,尤其三国无双五FPS甚至能掉到10以下,但这并不影响它是一个优秀的游戏,因为这种产生掉帧做法是非常规的。技术并不是万能的,我们追求的应该是在技术已经做过厚道的优化、实现了基本可行的效果之后,用策划和关卡设计来实现效果。如果你要做全屏幕都是雪地的情况,那么好了,我们需要根据全屏雪地来单独设计程序,比如在所有优先级为0的雪地上按同Z值生成一个Sprite的方法生成一些脚印专用层,并且在进入地图的时候直接创建,不管占用多少内存,一直保留着,然后需要脚印的时候再copyrect和调整透明度,或者不是每帧刷新而是每隔一段时间下一些雪等等。这是全屏的处理方法,我给出的是特效的处理方法。对于特效而言,下图的效果我自己已经满意了,请注意FPS:
http://rpg.blue/upload_program/files/snowsteps.jpg

我的意思是,不要永远认为脚本应该如何优化优化,当你的设计不太对的时候,无论用目前地球上任何一种系统或主机(RM还是PS3都无所谓),用多么牛的程序员,该掉帧就得掉帧。这时候先想想,你自己都觉得设计有点问题的地方,是不是也该改改了?
--------------------------------------------------------------------------------
>yangff :
直接创建图片不就行了?
--------------------------------------------------------------------------------
>刹那的微笑 :

以下引用yangff于2007-11-11 20:52:35的发言:

直接创建图片不就行了?



同样的BUG我不想再说第四遍了,如果你觉得能创建成功的话,欢迎做一个出来。
--------------------------------------------------------------------------------
>小真☆爱舞 :
如果我可以修改四个地方,只用十行脚本实现他现在的这个功能,楼主你能不能改一下这句话呢?
“不要认为这个雪地脚印需要无限优化,这是舍本逐末。我们所要用的,只是在需要雪的时候,少量使用地形标志5,少量制作一些给玩家真实感的东西,就可以了”
--------------------------------------------------------------------------------
>刹那的微笑 :
好啊,欢迎贴出来交流,开阔一下思路。现在这个系统已经讨论了两种做法,一种是我详细写的创建事件,一种是幻鱼和小林说的sprite,如果让我再说可能只有copyrect和fillrect的方法了,很希望能看到不同方向的技术思路。

不过对那句话可能得解释一下,因为他回帖在原帖里了。我说不适合用通用方法是针对他的500*500格大地图,而且我也认为对不同效果分类处理是程序优化的原则。只是具体到雪地脚印这个,可能目前的优化方法不够好,那么找到更好的效率优化方法后,可能就不存在效果分类的问题。但是这个脚印的优化结果对游戏编程需要分类处理的基本思路而言,至少对我来说,并没有什么影响。

至于说到对其他的程序员,就仁者见仁智者见智了。因为我自己能用在RM上的时间很少,必须在每周有限的几小时内完成计划做的内容,这样尽管可能不够优化,但至少能做出来不至于怠工。如果能用在RM上的时间比较多,比如每天都能投入一个小时,那自然技术路线就不同了。
--------------------------------------------------------------------------------
>小真☆爱舞 :
感谢指教。
PS:多谢合作,终于知道你是谁了~
--------------------------------------------------------------------------------
>Eclair :

以下引用小真☆爱舞于2007-11-11 21:07:39的发言:

如果我可以修改四个地方,只用十行脚本实现他现在的这个功能,楼主你能不能改一下这句话呢?
“不要认为这个雪地脚印需要无限优化,这是舍本逐末。我们所要用的,只是在需要雪的时候,少量使用地形标志5,少量制作一些给玩家真实感的东西,就可以了”


[本贴由作者于 2007-11-11 21:10:42 最后编辑]

哇~~~~~~口气好大的样子.....
好像很强呢...期待了....
无责任YY:
莫非是调用外部的东西绘图处理之类的...这偶彻底不行了...偶滴技术还是很局限呢~~~~~
[quote]以下引用刹那的微笑于2007-11-11 21:38:33的发言:

好啊,欢迎贴出来交流,开阔一下思路。现在这个系统已经讨论了两种做法,一种是我详细写的创建事件,一种是幻鱼和小林说的sprite,如果让我再说可能只有copyrect和fillrect的方法了,很希望能看到不同方向的技术思路。
[本贴由作者于 2007-11-11 21:49:16 最后编辑]


你怎么知道我那个极端的非常的事分得不爽的破外号的???!! >_<
--------------------------------------------------------------------------------
>刹那的微笑 :
………………………………{/shan} (逃了)
--------------------------------------------------------------------------------
>冰水 :
{/se}看到技术讨论贴啊,我也说说自己的想法
没试验过.不知道刷新有没有问题
在地图图块中添加上带脚印的图块.然后直接修改Tilemap的map_data属性,人物踩的时侯替换图块,过一段再替换回来.这样应该比用精灵和事件的效率都高得多.
只在运行中改过priorities属性,没有问题.
Tilemap的刷新好像是用c写的,修改map_data属性不知道能不能即时显示,现在没有rgxp,没法试验^^
--------------------------------------------------------------------------------
>yangff :
和角色跟随冲突  
哎呀,蛋疼什么的最有爱了
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

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

GMT+8, 2024-11-16 22:50

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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