天龙八部手游怪物抗性怪物状态冰劲是怎么来的

自己写个网游工具天龙八部键盘连点之3:如何判断怪物血量
在天龙八部里面,近攻门派挂机打怪比较烦,因为要跑到怪物身边才能攻击,而一个怪打死的时间又是不固定的,所以按键间隔不好设置,设置短了容易照成一个怪没打死,又跑过去打另一个,搞得满地图跑,每个怪可能都还没打死。我一开始玩的是明教,现在越来越觉得不好玩了。不只说是挂机刷经验没效率这点,就是现在的副本Boss也都跑来跑去的,近攻的打起来操作累,也没效率,没意思。不像那些远攻的,站这不动就能打着怪,多省事。
哎,不说了,题外话。那么如何实现判断怪物血量打怪呢?很简单,读怪物血条位置的颜色来判断血量。这就是一种基于颜色识别开发辅助工具的方法。这实现起来容易,但缺点也是明显的,就是屏幕不能被遮挡,否则看不到血条也就无从读取颜色值了。而且颜色受多个因素的影响:Windows的主题,天龙八部游戏的显示设置等。
写这代码的时候我的Vista设为Windows经典的样式,游戏显示设为速度优先,再调为32色。注意速度优先默认使用16位色,调为使用32位色是,速度优先那个下拉表自动变为用户自定义了,这不用再管它了,就让它那样子。
首先要自己度量出怪物血状态条和游戏窗口的相对位置。可以截个图,在Photoshop上用矩形选择框来算出位置。上面有我算出的相对游戏窗口左边框和上边框的偏移。
为保险起见,我读取偏移283像素出的颜色值,因为是红色,我取出其R分量,判断如果&=200,说明是有红色在,怪物活着,否则就认为死了。但这样其实可能误判的,比如万一选择的不是怪物而是BB或者人物,我无法判断,而当血条被遮挡更无法判断了。但这是一个游戏辅助工具而已,无需太严谨的考虑那么多例外...
下面是我判断怪物是否死了的函数:
int IsMonsterKilled(void)
&CBitmap B
&CRect TLBBWinRect, SearchR
//hWndTLBB是个全局变量,游戏窗口的句柄。这里判断它是否指向一个有效的窗口
//比如游戏已经退出但hWndTLBB还是原来的值,这时候这句柄就无效了 返回-1代表无法判断怪物血量
if (!IsWindow(hWndTLBB)) return -1;
//获取游戏窗口的位置,其实就是一个矩形范围,这里是整个窗口范围,包括边框,标题栏等。
//其位置是屏幕坐标,即相对屏幕左上角
&::GetWindowRect(hWndTLBB,
&TLBBWinRect);
//设置屏幕搜索区域,尽可能在小范围搜索,加快速度啊
&SearchRect.left = TLBBWinRect.left + 250;
&SearchRect.top = TLBBWinRect.top + 30;
&SearchRect.right = TLBBWinRect.left + 280;
&SearchRect.bottom = TLBBWinRect.top + 50;
&Bitmap.LoadBitmapW(IDB_MONSTER_BAR);
//SearchBMPOnScrn是我写的一个很关键的函数,作用是在屏幕找特定的位图,并返回找到的位图左上角左边
//搜索的方法就是逐一像素比较,但不能用CDC类里面的GetPixel来逐一读取像素,
//因为它速度实在太慢了,我是将SearchRect矩形指定的屏幕范围的像素颜色数据保存在内存,然后
//直接访问内存来读取每个像素的颜色,这样速度很快,全屏查找40x40大小的位图都在200毫秒左右。
//用GetPixel基本在3秒,慢15倍左右
//这里用主要是判断是否有怪物状态条,因为如何什么都没选择,那个位置是地图场景,没有框框的
flag = SearchBMPOnScrn(&Bitmap, SearchRect, 1,
10, 90, CMP_IGNOREBKCOLOR, Pos);
//记得加载了位图,用完后删除,尽管系统在出了变量定义范围也会删除,但及时删除释放内存是好习惯
Bitmap.DeleteObject();
&//如果没有怪物状态条, 认为怪物已死
&if (!flag){
&&_cprintf("Monster status bar
not found\r\n");
&&return 1;
&HDC hDC =
::GetDC(NULL);&//传入参数NULL,就是取得屏幕的DC
&//怪物血条在TLBBWinRect.left +
280之后,取偏移283处的值做判断
&//这里有2种情况:一是怪物死后消失了或状态条还在但已经没有了血,二是没有选中怪物状态条不存在
&//如果没有怪物状态条而背景地图是红色的话的有可能误判
//取得屏幕特定位置的颜色值,因为hDC指向屏幕DC,所以GetPixel的坐标也是相对屏幕左上角的&
clr = GetPixel(hDC, TLBBWinRect.left + 283, TLBBWinRect.top +
//千万记得GetDC和ReleaseDC一定要配对使用,忘记释放了会照成内存泄露。这就是用图形函数的麻烦之处,
//否则一不小心就内存泄露了,可能要等程序持续运行了几个小时之后忽然出现非法退出,短时间难发现问题
//我在写自动采药功能时就是因为忘记删除对象照成程序运行几个小时就出错了!&
&::ReleaseDC(NULL, hDC);
&//如果红色分量值不低于200,认为红色颜色在,因此怪未死,返回0
//最好不要判断颜色相等,防止万一游戏更新后血条颜色有小改变就失效
&if (GetRValue(clr) &= 200){
&&return 0;
&return 1;
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。热门标签:
您当前的位置:&>&&>&
天龙八部3服务端怪物具体掉包里的物品及掉包率
出处:网游动力作者:本站发布时间:阅读次数:
进入正题,我玩天3端,想打出重楼装备来,结果打了NNN久时间都没有掉出来,后来我琢磨从服务端的文件修改。以我修改的为例子吧:
用winscp3从服务端找到tlbbPublicConfig 目录,把EquipBase.txt 和MonsterAttrExTable.txt复制出来(二进制)
同样在服务端找到tlbbServerConfig 目录下,把MonsterDropBoxs.txt 和DropBoxContent.txt复制出来(二进制)
我的修改步骤如下(全部用UE修改,不然上传服务器有可能出现错误):
1、打开EquipBase.txt ,找到重楼装备的编号,我把所有重楼装备的编号都找出来了 、 、
打开MonsterAttrExTable.txt,找到怪物寻宝豪杰(宝藏洞四层)编号为860、 861& 、1175 、1176 和1177
打开MonsterDropBoxs.txt,找到对应怪物寻宝豪杰的编号(第一列):860、861、和1177,把DID2改为425(这是掉落包的编号),DID2、DID3.......后面的所有都改成-1
打开DropBoxContent.txt, 找到对应掉落包编号425,把BoxValue(掉落包价值)改为20,把Item1ID、Item2ID、Item3ID和Item4ID 分别改成重楼装备的编号:、 、
和 ,剩余后面的,全部改成-1
把以上改过的MonsterDropBoxs.txt和DropBoxContent.txt保存后用winscp3重新上传至tlbbServerConfig 目录,覆盖掉以前的,然后重启服务器,上游戏就行了
上一篇文章:
下一篇文章:

参考资料

 

随机推荐