操作方式:用鼠标操作人物在地图上行走。
用鼠标直接点击敌人可进行攻击,按数字键1可以补血。
己方血量耗尽则游戏结束。
如果血瓶耗尽则进入计分系统,打败敌人越多分数就越高哦!
制作思路:可根据小地图的色点来判断敌人在画面中的位置,进而用鼠标点击
参考脚本
鹤羽原创,请勿翻版
//释放插件
PutAttachment ".\plugin","*.dll"
//--------------------------------------------------------------
//获得游戏窗口句柄和位置尺寸等信息以便使用后台操作
hw=Plugin.Window.mousepoint()
clintrect=Plugin.Window.GetClientRect(hw)
rect=split(clintrect,"|",-1,1)
xoffset=cint(rect(0))
yoffset=cint(rect(1))
xwinsize=cint(rect(2))
ywinsize=cint(rect(3))
//系统和窗口初始化完毕------------------------------------------
//
//以下语句判断是否获得的是游戏窗口(游戏窗口尺寸是550x400)
If xwinsize<>550 or ywinsize<>400 Then
    Call messagebox("请将鼠标放在游戏窗口内启动脚本。")
    Goto QMScript_end
End If 
//
//以下程序段用于参数设置
//补血百分比,这个比例在应用的时候用户根据具体情况调整,可保证安全的前提下达到最少加血次数
UserVar fillredscale=14 "补血百分比"
//参数设置完毕--------------------------------------------------
//
//以下程序段用于定义关键点(所有点位均以游戏窗口左上角为基准零点)
//之所以把一些关键点位都集中在一起定义是为了方便以后修改
//
//1、血条关键点及颜色(因为是半圆形血条,所以用圆心和半径来定义血条,用角度来分来确定补血百分比,其中xcenter,ycenter为
//圆心,r为半径
xcenter=49: ycenter=46: colorred="0000FF": r=32
//通过下面的公式来计算对应补血百分比所要检测的点的位置(其中的ang代表补血百分比所代表的弧度,因为sin,cos函数都是用弧度
//来计算的)
ang=(3.1415926*fillredscale/100)
xred=cint(xcenter-r*sin(ang))
yred=cint(ycenter+r*cos(ang))
//
//2、怪物血条基准点和颜色(用怪物血条边框的黑色来判断怪是否打死)
xbar=209: ybar=25: colorbar="000000"
//
//3、小地图范围和怪物颜色(1和2分别为左上角和右下角点)
xmap1=420 :ymap1=20 :xmap2=530 :ymap2=100: coloranimy="0000CC": colorme="009900"
xmapcenter=475: ymapcenter=60
//
//4、人物头发的黑色可以用来判断游戏是否结束
xhead=47: yhead=33: colorhead="000000"
//
//定义基本点完毕------------------------------------------------
//
//****************************************************************
//
//挂机程序正式开始
Rem start
//先将鼠标移动到窗口右下角位置以免影响取色
MoveTo xoffset+xwinsize/2,yoffset+ywinsize/2
//建立两个变量分别记录血瓶数量和打怪个数
redbt=50: killanimy=0
//记录程序运行时间
timestart=now
//
Rem 寻找敌人
//在小地图上搜索敌人并转换为大地图的坐标
////用中心向外的找色方式,以确保找到的怪距离自己最近,范围向内收缩两个像素点,为了避免怪物太靠边,找到了但点不到的情况
ret=Plugin.BkgndColor.FindCenterColor(hw,xmap1+2,ymap1+2,xmap2-2,ymap2-2,coloranimy)
If ret="-1|-1" Then
    //小地图没有找到怪则调用人物移动子命令,并重新寻找敌人
    Call 人物移动
Else 
    //找到了怪则拆分出坐标值
    zuobiao=split(ret,"|",-1,1)
    x1=zuobiao(0)
    y1=zuobiao(1)
    //小地图和大地图像素比例为1:5 ,根据这个比例,把小地图上怪和人的位差换算到大地图上,从而得到怪的坐标点
    xanimy=xwinsize/2+7+(x1-xmapcenter)*5
    //上面公式中加了一个7,是因为在调试中发现大地图上人物的头的中心并不在整个窗口中心,而要往右偏7个像素点左右
    yanimy=ywinsize/2+(y1-ymapcenter)*5
    Call 战斗
End If 
//此处判断一下游戏是否结束,可用左上角人物头像的头发颜色来判断
color1=Plugin.BkgndColor.GetPixelColor(hw,xhead,yhead)
If color1<>clng("&H" & colorhead) Then
    Goto QMScript_end
End If 
Goto 寻找敌人
//程序结束
Rem QMScript_end
//计算挂机时间和播报战果
howlong=datediff("n",timestart,now)
Call MessageBox("鹤羽工具:游戏结束。你共挂机约 " & howlong & " 分钟时间。")
EndScript 
//
//
//战斗子程序
Sub 战斗
    //点击怪物
    Call Plugin.Bkgnd.MoveTo(hw,xanimy,yanimy)
    Delay 50
    Call Plugin.Bkgnd.LeftClick(hw,xanimy,yanimy)
    Delay 50
    Call Plugin.Bkgnd.MoveTo(hw,xwinsize/2,ywinsize/2)
    //
    time1=now
    //怪物血条出现表示攻击真正开始
    Rem 等待怪物血条出现
    color1=Plugin.BkgndColor.GetPixelColor(hw,xbar,ybar)
    If color1<>clng("&H" & colorbar) Then
        If datediff("s",time1,now)<3 Then
            //有时候怪物血条可能出现滞后,因此这里也增加检查血量的工作保证安全
            Call 检查血量
            Delay 20
            Goto 等待怪物血条出现
        Else 
            //如果点击怪物以后超过5秒还不出现怪物血条,说明有可能点空了,则退出战斗重新找怪
            Goto 战斗结束
        End If 
    End If 
    //打怪数量加1
    killanimy=killanimy+1
    Rem 等待战斗结束
    //战斗中随时检查血量,小于设定值立刻补血
    Call 检查血量
    //怪物血条消失才表示战斗结束,否则继续等待
    color1=Plugin.BkgndColor.GetPixelColor(hw,xbar,ybar)
    If color1=clng("&H" & colorbar) Then
        Delay 20
        Goto 等待战斗结束
    End If 
    killanimy=killanimy+1
    Delay 500
    Rem 战斗结束
    //战斗结束了还需要检查一下血量,因为有可能怪物死前最后一击导致已经很少血,下次攻击开使的时候可能来不及加
    Call 检查血量
End Sub 
//
Sub 检查血量
    color1=Plugin.BkgndColor.GetPixelColor(hw,xred,yred)
    If color1<>clng("&H" & colorred) Then
        KeyPress 49,1
        //如果喝血,血瓶数量减1
        redbt=redbt-1
        Delay 500
    End If 
End Sub 
//
Sub 人物移动
    //人物移动可采用随机方式,当然也有各种方法可以实现智能一点的移动方式,节省时间,但智能化较复杂,此处省略
    //为了获得最大的移动距离,此处可取游戏屏幕的四个角点为随机移动点,随机坐标可用如下公式获得
    randomize
    //获得0-3的随机数
    randpoint=cint(rnd*3)
    //巧妙的利用游戏窗口的尺寸参数和两个函数来得到移动距离最长的随机点
    xmove=xwinsize*(randpoint\2)
    ymove=ywinsize*(randpoint mod 2)
    //上面的公式的效果是,随机数0的时候左上角点,随机数1的时候左下角点,随机数2的时候右上角点,随机数3的时候右下角点
    Call Plugin.Bkgnd.MoveTo(hw,xmove,ymove)
    Delay 100
    Call Plugin.Bkgnd.LeftClick(hw,xmove,ymove)
    Delay 1000
    Call Plugin.Bkgnd.MoveTo(hw,xwinsize/2,ywinsize/2)
    Delay 2000
End Sub