轩辕春秋文化论坛 » 曹操传MOD制作交流 » 指针变量增减物品时避免出现BUG的方法


2009-9-8 22:44 showzhuge
指针变量增减物品时避免出现BUG的方法

首先先讲解一下指针变量的两个含义

指针变量p 是指内存地址
图中的4917723换算成16进制就是4B09DB
就是豆子的内存地址
[attach]80827[/attach]

指针变量*p 是指该内存地址的值 占四个字节
通常情况我用指针变量*p来增减物品数会是一个好方法


有两种情况指针变量会产生BUG 第一种情况是当第一个字节为豆子数为255时 若再加 增第二个物品就会增多
如图
[attach]80828[/attach]
加10以后
[attach]80829[/attach]

第二种情况就是物品数如果小于0 也会出现错误这里就略过了



本来我们可以通过这样的命令来避免这个情况
如下图
[attach]80830[/attach]
我要增加10颗豆子
当豆子大于等于245时 则豆子数直接为255


现在问题来了 因为我们知道 物品的数量只有一个字节 而实际山现在我的指针变量p 0 代表了4中物品的地址
也就实际上是4917723-4917726的值为 [color=red]37 02 01 01[/color]
[attach]80831[/attach]

正确的情况因为现在豆子数小于245 那么就应该加10变为65 值应该为  [color=red]41 02 01 01[/color]
但是实际上现在指针变量*p0并不是小于[color=red]F5[/color](也就是十进制245)的[color=red]37[/color](也就是55颗) 而是远远大于[color=red]F5[/color]的[color=red]37 02 01 01[/color]
所以按照判定大于245([color=red]F5[/color])时豆子变成了255([color=red]FF 00 00 00[/color])颗 其他三个物品消失
[attach]80832[/attach]

难道没有解决办法了吗?其实很简单,只要利用一个整型变量来暂存一下数据就行了。
我的目的是让指针变量*p在计算时保证只有第一个字节起作用,也就是说我需要指针变量*p的值是[color=Red]XX 00 00 00[/color]。也就是说我要让4917724-4917726这三个字节在计算的时候为0。
那么我直接把4917724赋值为0就行了。不过在计算后还要让这些物品回来,这里就需要用一个整型变量保存一下。方法如下
[attach]80833[/attach]



这样的话 最终结果如下图所示 就达到了我需要的效果

[attach]80834[/attach]







同理,当我道具数为图中所示
[attach]80835[/attach]

如果我要减10颗豆子
合理的设置应该如下
[attach]80836[/attach]


当豆子小于10颗([color=red]0A[/color])时,则豆子数为0。
我现在的豆子数为1颗,应该满足以上条件,但是问题是现在的指针变量*p值并不是[color=red]01[/color],而是[color=red]01 02 01 01[/color]远远大于[color=red]0A[/color]。
结果没有满足[color=red]01[/color]小于[color=red]0A[/color]所以等于[color=red]00[/color]的条件,而是变成了[color=red]01 02 01 01[/color]-[color=red]0A[/color]。
结果如下

[attach]80837[/attach]



正确的设置方法如下
[attach]80838[/attach]

[color=Silver][[i] 本帖最后由 showzhuge 于 2009-9-8 22:58 编辑 [/i]][/color]

2009-9-8 22:45 showzhuge
编辑完成

[color=Silver][[i] 本帖最后由 showzhuge 于 2009-9-8 22:54 编辑 [/i]][/color]

2009-9-8 23:33 godtype
方法不错。:unsure:
其实此BUG是必须从根本上在引擎中进行修改的,将指针变量的使用对象从DWORD改为BYTE,毕竟曹操传中最小单位仍然是BYTE。
不过我比较懒,能力也低,要我改这个就不太可能了,还是等几位引擎高人出手比较好。(虽然想法我是有,但实现起来比较麻烦。:sleep:)

不过我也有另外两套应对方法,一是对没用的71指令进行修改,再配合几个整形变量,来达到准确的数量测试和数量增减,二是调整一下78指令,同样可以达到准确的数量测试和数量增减。

2009-9-9 14:27 yeatss
能否讲解下如何用指针变量得到新增加的12件物品的详细步骤?谢谢

2009-9-9 15:24 showzhuge
回复 #4 yeatss 的帖子

武器和道具的储存方式不一样 武器是每一个储存一个BYTE 如果要用指针变量添加武器会非常麻烦
新武器请用整型变量4080指令
具体方法在STAR引擎配套文件的打包文件说明中有详细介绍

2009-9-9 17:31 yeatss
哦 没注意文件说明里有用法,谢谢了

2009-9-11 12:56 凤翔天血
:^%  楼主的技术贴很精彩,作为技术小白暂时还看不太懂,,,,支持一下

页: [1]


Powered by Discuz! Archiver 5.0.0  © 2001-2006 Comsenz Inc.