- 积分
- 34677
- 威望
- 499
- 魅力
- 507
- 经验
- 20326
- 热心度
- 9
- 注册时间
- 2006-3-13
- 最后登录
- 2024-9-30
- 主题
- 134
- 回帖
- 4949
- 精华
- 35
- 阅读权限
- 150
TA的每日心情 | 郁闷 2015-6-6 16:12 |
---|
签到天数: 52 天 连续签到: 1 天 [LV.5]女巫
超级版主
- 积分
- 34677
|
本帖最后由 贤知有您 于 2014-1-15 12:56 编辑
本着将ERA发扬光大的精神,且有沧海大师的无限激励,终于"研制"出战场上播放任意DEF的方法.
此方法属于ERM调用和修改内存达到目的.
原理如下:
1.首先我们都知道BM:V能够对某一堆栈播放一个内部魔法动画(动画编号从0-82,可参考ERM帮助找到相关资源)
2.BM:V播放的每个动画信息在[43F77E]指针指向的地址上,且每个动画带有3组信息,每组4字节,共12字节.
3.每个动画的3组信息分别是:指向魔法DEF文件名的字符型指针,指向魔法名字的字符型指针,该魔法的播放标志信息.
4.修改的原理是把指向魔法DEF文件名的指针指向改成我们自定义的z变量位置上.改z变量存储我们需要播放的DEF文件名.
5.修改了DEF文件指向,然后调用BM:V播放动画索引,就能达到播放指定任意DEF的目的.播放后需还原指针指向.
6.上述已经能够实现播放DEF动画,但还有一个特殊问题,此问题困惑了我很久,所以一直无法完善.
该问题主要在,游戏系统内部每次调用播放魔法动画,都会用一个地址记录当此动画索引和DEF指向信息.如果是首次播放该DEF,则需要先卸载(销毁)原DEF,再加载新DEF.
当下一次再调用动画播放时,对比动画信息,若动画索引跟上次一样,则直接播放上一个DEF指向.不会销毁和重新加载,纵使我们更改了DEF的指向.
举个例子:
我们使用0索引动画来模拟播放新DEF,按照上面1-5方式更改指向并播放0号动画,新的DEF被播放且DEF又重新指向旧的祈祷魔法DEF.
当我们此时英雄施法祈祷时,直接播放的是之前那个新的DEF动画,而非原来的祈祷动画.因为内部并没有销毁和重新加载DEF.
后来找到了记录点,分别是战场内存点偏移[132E8]和[132EC]的位置.我们在调用和还原时直接清除这2个内存数据即可解决上述问题.
另外,BM:V播放只能针对堆栈来做.实际上还有一个内存函数可以实现对空地施放魔法动画.先介绍一下此函数的调用方法:
!!UN:C6919200/4/?y10; [战场内存位置]
!!SN:E4810128/2/y10/<动画ID0-82>/<战场坐标0-187>/<延时=100>/0; [延时正常下用100毫秒的速度]
然后,我们结合这个内存函数,使用修改魔法DEF指向的原理,实现战场位置上播放任意DEF的功能.
这里必须一提的是,由于DEF的构造问题,所播放的DEF和指定战场坐标不一定能重合,甚至偏离严重.
具体的魔法DEF制作方面知识请向KSWDIY绘画大师请教.
还有沧海大师已经把此项播放技术运用到 怪3 上,大家拭目以待.
下面给出具体的ERM代码,有ERM方面知识的鞋童们可以研究研究.
- ZVSE
- !?CM4; [战场场景]
- !!CM:F?y1 I?y2 S?y3;
- !!FU|y1<>512/y2<>2005/y3<>14:E; [右键点信息栏按钮]
- !!CM:R0;
- !!VRz3:S^zm152z.def^;[播放新动画]
- !!FU9999916:P0/3/93/100/0/0/0;[借用0号动画]
- !?FU9999916;[ERA-战场位置施放外调DEF动画ByHawaiing007-140110]
- **x1=借用的BM:V动画编号(0-82)注意不是所有编号都能在正确的位置播放动画(需修改播放标志)
- **x2=存储"外调的DEF动画名字"的z变量索引(不能使用负数z变量)
- **x3=播放的坐标位置(0-186)
- **x4=延时(播放速度,一般用100)
- **x5=播放标志,施放动画的位置(0-4)(BM:V时会考虑堆栈的体积)--默认用0和1
- **(经测试) =0动画底部为基准,=1以动画中心为基准,=2,3,4其它位置
- **x6=播放标志,是否透明化(0否,1是)
- **x7=是否自行修改播放标志(0否,1是)
- !!FU|x1<0/x1>82/x2<0/x2>1000:E;[错误的动画索引或Z变量索引]
- !!VRx3|x3<0/x3>186:S93; [错误位置,放战场正中]
- !!VRx4&x4<0:S100;
- !!VRx5|x5<0/x5>4:S0; [默认用0]
- !!VRx6|x6<0/x6>1:S0; [默认用0]
- !!UN:C6919200/4/?y20; [y20=战场内存]
- !!VRy21:Sy20 +78568; [动画DEF]
- !!VRy22:Sy20 +78572; [动画索引]
- !!UN:C4454270/4/?y1;[BM:V调用动画时用到的基址]
- !!UN:Cy21/4/0 Cy22/4/-1;[清除内存多余数据]
- !!VRy2:Sx1 *12 +y1; [魔法动画名字的指针地址]
- !!VRy3:Sy2 +8; [魔法动画播放标志的内存(这里可由x5和x6组成)]
- !!VRy4:Sx2 *512 +9597416;[z变量对应的内存地址(ERA下)]
- !!VRy5:Sx6 *256 +x5; [自定义播放标志(否则采用x1动画的原有标志)]
- !!UN:Cy2/4/?y10;[原动画名指针]
- !!UN:Cy3/4/?y11;[原有播放标志]
- !!UN:Cy2/4/y4; [新指针]
- !!UN&x7<>0:Cy3/4/y5; [自定义播放标志]
- !!SN:E4810128/2/y20/x1/x3/x4/0;[调用内部函数播放战场动画]
- !!UN:Cy2/4/y10; [还原]
- !!UN&x7<>0:Cy3/4/y11;[还原]
- !!UN:Cy21/4/0 Cy22/4/-1;[清除内存多余数据]
复制代码
附带一张,测试播放大型DEF的GIF动画
|
评分
-
5
查看全部评分
-
|