1跳舞类游戏
《跳舞类游戏》
操作方式:按顺序输入由方向键组成的音符序列,然后在重音拍按下空格键。
制作思路:可以根据不同方向的朝向来抓颜色点进行判断要按的方向键。
参考脚本
//V1.1 1-解决上个版本怪在某些特殊位置出现导致的问题
// 2-修正了判断层位置时的BUG
// 3-加入了平时对技能的支持
// 4-退出时弹起所有按键
//V1.2 1-加入了寻找蓝球加蓝
// 2-加入了对玩家高度高于目标二层时下落一层时行走方向的再次判断
// 3-对层次判断提取为一个子函数
//V1.3 最终版--解决最右边层蓝球的问题。
//**************************************************************************
UserVar HpPer = 50 "使用血瓶的血量百分比"
UserVar MpPer = 30 "寻找蓝球时的百分比"
UserVar UseSkillMpPer = 70 "平时使用技能的蓝量百分比"
//定义变量与初始化
Dim hWnd, ClientRect, Ret(4), HpStep, HpX, HpY, MpX, MpY, UseSkillMpX, UseSkillMpY
Dim GameLeft, GameTop, GameRight, GameButtom
Dim MonX, MonY, PlayerX, PlayerY, BallX, BallY
Dim MonFloor, PlayerFloor, BallFloor, tempHigh, tempFloor
Dim HPColor, MpColor, MonColor, PlayerColor, FloorColor, SideColor, BallColor
Dim AttackMaxDis, MagicDis, AttackedDis, RelativeDis, GameState, FindBallState, MonDir, KeyNum
//MonColor 怪物的特征色--棒子 PlayerColor 人物的特征色--手臂 FloorColor 每层高度的特征色--绿色 MonFloor 怪物所在的高度层 PlayerFloor-玩家所在的高度层
HpColor = "0066FF": MpColor = "FF6600": MonColor = "4C7299": PlayerColor = "0033CC": FloorColor = "0B8648": SideColor = "004E88": BallColor = "D7720E"
MonFloor = 0: PlayerFloor = 0: BallFloor = 0
//GameState --含义 -1 没有发现怪物 0 发现怪物 1 普通攻击 2 魔法攻击
AttackMaxDis = 120: MagicDis = 330: AttackedDis = 104: GameState = -1: FindBallState = -1: MonDir = 1: KeyNum = 39: HpStep = 0.88: MpStep = 0.88
//--------------------------------------------------------------
//获得游戏窗口句柄和位置尺寸等信息以便操作
hWnd = Plugin.Window.mousepoint()
ClientRect = Plugin.Window.GetClientRect(hWnd)
//以下语句判断是否获得的是游戏窗口(游戏窗口尺寸是550x400)
If StrComp(Right(ClientRect, 7), "550|400") <> 0 Then
Messagebox("请将鼠标放在游戏窗口内启动脚本。")
EndScript
End If
Rect = Split(ClientRect,"|",-1,1)
GameLeft = CInt(Rect(0))
GameTop = CInt(Rect(1))
GameRight = CInt(Rect(0)) + CInt(Rect(2))
GameButtom = CInt(Rect(1)) + CInt(Rect(3))
HpX = GameLeft + 80 + CInt( HpStep * HpPer)
HpY = GameTop + 31
MpX = GameLeft + 80 + CInt( MpStep * MpPer)
MaxMpX = GameLeft + 80 + CInt( MpStep * 90)
MpY = GameTop + 61
UseSkillMpX = GameLeft + 80 + CInt( MpStep * UseSkillMpPer)
UseSkillMpY = GameTop + 61
//系统和窗口初始化完毕------------------------------------------
While True
Call AddHp
Call PlayerMove
//Call GetBallInfo
Call GetMonInfo
Call GetPlayerInfo
Call MoveToMon
Call MoveToBall
Call AttackMon
Wend
//左右移动
Sub PlayerMove
If GameState = -1
//判断地图边界则是通过地图最下面的二颗树的枝来判断的 //MinDir 行动方向, 1 向右 -1 向左
Call FindColorEx(GameLeft + 140, GameButtom - 3, GameRight - 140, GameButtom - 1, SideColor, 0, 0.9, SideX, SideY)
If SideX > 0 Then
KeyUp KeyNum, 1
If SideX < GameLeft + 200 Then
MonDir = 1
Else
MonDir = -1
End If
End If
KeyNum = 38 + MonDir
KeyDown KeyNum, 1
End If
End Sub
//得到怪物信息
Sub GetMonInfo
Call FindColorEx(GameLeft, GameTop + 60, GameRight, GameButtom - 60, MonColor, 0, 0.9, MonX, MonY)
Delay 2
If MonY >0 Then
//得到怪物X中心坐标
MonX = MonX + 15
tempHigh = MonY
Call GetFloor
MonFloor = tempFloor
End If
End Sub
//得到玩家信息
Sub GetPlayerInfo
Call FindColorEx(GameLeft, GameTop + 60, GameRight, GameButtom - 60, PlayerColor, 0, 0.9, PlayerX, PlayerY)
Delay 2
If PlayerY>0 Then
PlayerDir = 0
// 默认认为玩家面象为左边,这里通过玩家特征点的坐标加偏移找玩家眼睛来判断面象
Call FindColorEx(PlayerX + 12, PlayerY - 15, PlayerX + 16, PlayerY - 19, "DFDFDF", 1, 0.8, HeadX, HeadY)
If HeadX >0 Then
PlayerDir = 1
End If
tempHigh = PlayerY
Call GetFloor
PlayerFloor = tempFloor
End If
End Sub
//得到蓝球信息
Sub GetBallInfo
Call FindColorEx(GameLeft, GameTop + 55, GameRight, GameButtom - 60, BallColor, 0, 0.8, BallX, BallY)
Delay 1
If BallY>0 Then
tempHigh = BallY + 35
Call GetFloor
BallFloor = tempFloor
End If
//吃蓝是特殊情况 --因为在最右边,要想吃的话,得从左边上去。中间会导致找不到蓝球。所以强制置X坐标
If BallFloor = 4 and BallY < 0 Then
BallX = GameRight
End If
End Sub
//得到所在的层数
Sub GetFloor
If tempHigh > GameTop + 250 Then
tempFloor = 0
ElseIf tempHigh > GameTop + 170 Then
tempFloor = 1
ElseIf tempHigh > GameTop + 110 Then
tempFloor = 2
ElseIf tempHigh > GameTop + 85 Then
tempFloor = 4
ElseIf tempHigh > GameTop + 60 Then
tempFloor = 3.5
End If
End Sub
//走向怪物
Sub MoveToMon
GameState = -1
If MonX > 0 and PlayerX > 0 Then
GameState = 0
FloorDis = MonFloor - PlayerFloor
//如果玩家高度高于怪物,先移动到怪物的下面
If FloorDis < 0 and (NearMon = 0 or tempFloorDis <> FloorDis) Then
tempFloorDis = FloorDis
NearMon = 1
Call JudgeMoveDir
//如果怪物处在第三层,特殊处理
ElseIf MonFloor = 4 Then
//说明我已在第一层了
If FloorDis < 3.5 Then
If (Abs(MonX - PlayerX) >= MagicDis) Then
Call JudegMoveDir
Else
Call StopMove
GameState = 2
End If
Else
tempTopDis = -90: tempButtomDis = 0: tempXDis = 65
//没有在第一层,则找到第一层相对于玩家的位置
Call JudgeFloorPos
End If
//玩家与怪物的高度小于3格,在最大攻击距离内跳砍就能打到
ElseIf FloorDis >= 0 and FloorDis <> 3 Then
//如果玩家和怪的X距离大于最大攻击距离
If (((Abs(MonX - PlayerX) >= AttackMaxDis) and (FloorDis < 3)) or ((Abs(MonX - PlayerX) >= 20) and (FloorDis > 3))) Then
Call JudgeMoveDir
Else
Call StopMove
GameState = 1
End If
End If
ElseIf NearMon = 1 Then
Call StopMove
End If
End Sub
//向目标移动
Sub JudgeMoveDir
KeyUp 39, 1
KeyUp 37, 1
If MonX > PlayerX Then
KeyDown 39, 1
//置玩家行走方向和当前面向相同
MonDir = 1
Else
KeyDown 37, 1
MonDir = -1
End If
End Sub
//停止移动
Sub StopMove
FindBallState = 0
NearMon = 0
KeyUp 39, 1
KeyUp 37, 1
Delay 30
End Sub
//移动到蓝球
Sub MoveToBall
//蓝自动回到大于90%时不再找蓝球回蓝
Call FindColorEx( MaxMpX, MpY, MaxMpX, MpY, MpColor, 0, 0.9, FindBallX, FindBallY)
If FindBallX > 0 Then
FindBallState = 0
BallFloor = 0
End If
If GameState < 0 Then
//判断是否要找蓝球回蓝
Call FindColorEx( MpX, MpY, MpX, MpY, MpColor, 0, 0.9, FindBallX, FindBallY)
If FindBallX < 0 and FindBallState = 0 Then
FindBallState = 1
End If
If FindBallState <> 0 Then
Call GetBallInfo
Call StepToFloor
End If
End If
End Sub
//得到层与层之间的关系
Sub StepToFloor
If BallX > 0 and PlayerX > 0 Then
GameState = -2
FloorDis = BallFloor - PlayerFloor
//如果玩家高度高于怪物,先移动到怪物的下面
If FloorDis < 0 and (FindBallState = 1 or tempFloorDis <> FloorDis) Then
tempFloorDis = FloorDis
FindBallState = 2
Call JudgeMoveBallDir
ElseIf FloorDis = 0 Then
Call JudgeMoveBallDir
//已吃到蓝球,蓝球位置置0
If Abs(BallX - PlayerX) < 35 Then
BallFloor = 0
End If
ElseIf FloorDis > 0 Then
tempLeftDis = 0 : tempRightDis = 0
//处理找蓝球加蓝时可能会导致的一个问题
If BallFloor = 1 Then
If BallX > PlayerX Then
tempLeftDis = 250 : tempRightDis = 0
Else
tempLeftDis = 0 : tempRightDis = -250
End If
End If
If PlayerFloor = 3.5 Then
tempTopDis = 40: tempButtomDis = 60: tempXDis = 150
Else
tempTopDis = -90: tempButtomDis = 0: tempXDis = 65
End If
Call JudgeFloorPos
End If
ElseIf FindBallState = 2 Then
Call StopMove
End If
End Sub
//得到层与层之间的关系
Sub JudgeFloorPos
//没有在第一层,则找到第一层相对于玩家的位置 从中间左右判断上一层相对于玩家的位置
Call FindColorEx(GameLeft + tempLeftDis, PlayerY + tempTopDis, PlayerX, PlayerY + tempButtomDis, FloorColor, 2, 0.8, FloorX1, FloorY1)
Call FindColorEx(PlayerX, PlayerY + tempTopDis, GameRight + tempRightDis, PlayerY + tempButtomDis, FloorColor, 0, 0.8, FloorX2, FloorY2)
If FloorX1 < 0 and FloorX2 < 0 Then
KeyDown KeyNum, 1
ElseIf (FloorX1> 0 and FloorX2 > 0 and (FloorX2 - PlayerX >= PlayerX - FloorX1)) or (FloorX1 > 0 and FloorX2 < 0) Then
KeyUp 39, 1
KeyDown 37, 1
MonDir = -1
ElseIf (FloorX1> 0 and FloorX2 > 0 and (FloorX2 - PlayerX < PlayerX - FloorX1)) or (FloorX1 < 0 and FloorX2 > 0) Then
KeyUp 37, 1
KeyDown 39, 1
MonDir = 1
End If
If Abs(FloorX1 - PlayerX) < tempXDis or ABS(FloorX2 - PlayerX) < tempXDis Then
KeyPress 32, 1
Delay 500
End If
End Sub
//向目标移动
Sub JudgeMoveBallDir
KeyUp 39, 1
KeyUp 37, 1
If BallX > PlayerX Then
KeyDown 39, 1
//置玩家行走方向和当前面向相同
//MonDir = 1
Else
KeyDown 37, 1
//MonDir = -1
End If
End Sub
//攻击怪物
Sub AttackMon
If (GameState > 0) Then
//玩家和怪物背向则调整面象
If MonX > PlayerX and PlayerDir = 0 Then
KeyPress 39, 1
Delay 30
ElseIf MonX < PlayerX and PlayerDir = 1 Then
KeyPress 37, 1
Delay 30
End If
//相隔不同层时的延时处理
JumpDelay = 0
If MonFloor - PlayerFloor > 0 Then
KeyDown 32, 1
Delay 200
If MonFloor - PlayerFloor = 2 or MonFloor - PlayerFloor = 3 Then
JumpDelay = 250
ElseIf MonFloor - PlayerFloor = 2.5 Then
JumpDelay = 275
End If
Delay JumpDelay
KeyUp 32, 1
End If
If GameState = 1 Then
//判断平时是否使用技能 限制在相隔一层的范围内效果比较好
Call FindColorEx( UseSkillMpX, UseSkillMpY, UseSkillMpX, UseSkillMpY, MpColor, 0, 0.9, UseSkillX, UseSkillY)
If MonFloor - PlayerFloor < 1.5 and UseSkillX > 0 Then
KeyPress 83, 1
Else
KeyPress 65, 1
End If
Else
KeyPress 83, 1
End If
Delay JumpDelay + 200
End If
End Sub
//加血
Sub AddHp
IfColor HpX, HpY, HpColor, 1 Then
KeyPress 49, 1
Delay 50
End If
End Sub
//防止有按键没有弹起
Sub OnScriptExit
KeyUp 32, 1
KeyUp 37, 1
KeyUp 39, 1
End Sub
2网游自动加血
《网游自动加血》
游戏分析:血条生命值是一个游戏屏幕上的人物HP指示,当受到攻击时会减少HP值。生命值在网游中的展现有如下几种方式:横向的血条、竖向的血条、圆形的血球、不规则型等。生命值在网游中是最关键、最敏感、最值得关注的参数之一,而血条作为人物生命值的直观展现,几乎所有的实用脚本都要与血条打交道,几乎所有的实用脚本都首先关注人物的生死存亡,几乎所有的打怪练级加PK类网游脚本都首先提供自动加红加蓝等基础功能。
操作方式:每个血条或者蓝条都会随着时间而减少,按下相应的快捷键或者鼠标点按钮,就可以帮相应的血条补满血哦!
制作思路:根据血条的颜色或底色来找色判断,特殊血条形状用数学公式解决。
参考脚本
//脚本思路:
//1、加血加蓝类无非就是在血或蓝达到指定的条件的时候按下游戏里相应的设置键(放了血瓶或蓝瓶的键)进行加血或加蓝!
//2、一般常见的有百分比加血和血量加血。
//2.1、百分比加血是将血(蓝)槽的长度按等份平分,血槽长度是——满血时的坐标减去没血时的坐标; 平分血槽一般常 见的是将血槽长度除以100(你觉得除以100不够仔细你也可以除以1000甚至10000),也就是把血槽长度平均分成100小段,在根据用户设置的百分比来计算。
// 这种加血方法的优点是速度快、制作容易;缺点是精准不是很高,容易被干扰。
// 注意:起始坐标要加上最小值的坐标。
//2.2、血量加血是更具血的显示数值进行加血,数值获得可以利用大兵、一只鱼、星星火、91等作者的插件获得。获得数值后在和用户设置的数值作比较。来进行加血判断。
// 这种加血方法的优点是高精准,干扰性低;缺点是制作麻烦(需要做字库),判断速度慢。
//3、现在我们来看网页所给的3个例子进行分析。
//3.1、先分析血条的颜色、看血条是否会变色。三种血条就圆形的血条不变色,第一种血条是渐变的以血的颜色来判断血比较麻烦。第二种中间存在干扰物,可以利用左右两边进行判断(干扰刚好没在那个点上)。
// 我们在对血条底色进行分析。分析结果是3种血槽底色不存在变化,所以我们可以从判断底色进行判断血量。
//4、如何制作
//4.1、根据底色如何判断呢??比如我们判断血是否大于一半(50%)如果血大于50%的话那么血槽中间就看不到血槽的底色。也就是判断血槽中间点是否是血槽底色。是那么血就少于50%不是的话血就多余50%。 判断出血少于了50%该如何加血呢??其实很简单(看第一条),给我们试验的游戏的"Q"键就是给横向血条加血的。只要当血少于50%我们就让脚本按一次"Q"键(KeyPress 81,1)。
//5、关于更具数值来判断的我就不啰嗦了,感觉没什么难度。直接用2.2提到的几位大大的插件就搞定了呵呵。
//分析结束,接下来就该你动手了。祝您成功!
//○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○
//===========以=下=为=范=例=脚=本============
//○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○○
//用户设置和变量定义
Dim hwnd,rect,jxbfb,jlbfb,jxl,zxz,jll,zlz,dw,dwx,dwy,ajz,ys,xzbz(5),yzbz(5)
UserVar ms=DropList{"百分比模式":0|"数值模式":1|"推荐模式":2}=0 "设置内容"
jxbfb=40 //血少于百分之几加血
jlbfb=40 //蓝少于百分之几加蓝
jxl=40 //血少于多少时加血
zxz=100 //你的总血量是多少
jll=40 //蓝少于多少时加蓝
zlz=100 //你的总蓝量是多少
//获得鼠标所指向的窗口的句柄
hwnd=Plugin.Window.MousePoint()
//获得窗口左上角的位置和窗口的大小
rect=Plugin.Window.GetClientRect(hwnd)
If InStrRev(rect,"550|400")=0
MessageBox "请将鼠标放在游戏窗口内在启动游戏"
EndScript
End If
//获得窗口左上角的坐标,并将坐标作为参考坐标
dw=Split(rect,"|"):dwx=dw(0):dwy=dw(1)
If ms=1
//将数值血量转换为百分比数值
jxbfb=jxl/zxz*100
jlbfb=jll/zlz*100
ElseIf ms=2
jxbfb=40
jlbfb=40
End If
//按键值数组,ARRAY是用于引用数组元素的表示符,由跟随有括号的变量名组成,括号中包含指示所需元素的索引号
ajz=array(81,87,65,83,68,70)
//颜色值数组
ys=array("D9D9D9","D9D9D9","ffffff","ffffff","e6e6e6","e6e6e6")
//设置横向血和蓝的判断点
xzbz(0)=(845-614)/100*jxbfb+dwx+64:xzbz(1)=(845-614)/100*jlbfb+dwx+64
yzbz(0)=dwy+33:yzbz(1)=dwy+77
//设置竖向血和蓝的判断点
xzbz(2)=dwx+82:xzbz(3)=dwx+170
yzbz(2)=dwy+303-(590-402)/100*jxbfb:yzbz(3)=dwy+303-(590-402)/100*jlbfb
//设置圆弧形血和蓝的判断点
xzbz(4)=-67*sin(3.1415926*jxbfb/100)+dwx+382 : xzbz(5)=67*sin(3.1415926*jlbfb/100)+dwx+386
yzbz(4)=67*cos(3.1415926*jxbfb/100)+dwy+204 : yzbz(5)=67*cos(3.1415926*jlbfb/100)+dwy+204
While true //WHILE true 是一个特意设置的死循环
i=0
//因为有3种形态的血和蓝,所以循环6次
For 6
//判断学或蓝是否满足加血条件
IfColor xzbz(i),yzbz(i),ys(i),0
KeyPress ajz(i),1
End If
i=i+1
next
//设置一个延迟、缓解CPU
Delay 10
Wend
3回合制打怪
《回合制打怪》
操作方式:地图上按方向键行走会随机遇到敌人,然后进入战斗场景。在战斗场景中双击敌人可进行普通攻击,或按热键1或“攻击”选中敌人普通攻击,按热键2选中敌人可以释放技能,按热键3可以补血(大地图上也可使用)。
制作思路:根据判断颜色或图形来确定是否进入战斗模式,多用标记和子程序。
参考脚本
//获得游戏窗口句柄和位置尺寸等信息以便使用后台操作
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 attackmode=DropList{"普通":0|"技能":1}=0 "攻击模式"
UserVar fillredscale=30 "补血百分比"
//参数设置完毕--------------------------------------------------
//以下程序段用于定义关键点(所有点位均以游戏窗口左上角为基准零点)
//之所以把一些关键点位都集中在一起定义是为了方便以后修改
//1、血条左边界点和血条长度及颜色(这个游戏的血条大约是90个像素点)
xred0=82: yred=36: dxred=90: colorred="0066FF"
xred=xred0+cint(fillredscale*dxred/100)
//2、迷你小地图上的人物标志点和颜色(如果进入战斗状态小地图上会出现蓝色方块表示人物位置,因此可用来判断是否遇敌)
xme=495: yme=70: colorme="CC9900"
//3、回合标志(回合标志取第一个字上的点,为了判断什么时候开始攻击)
xround=208: yround=26: colorround="003399"
//4、mini地图上的敌人位置和位差(最左侧敌人为1,右侧敌人按位差移动)
xanimy1=448: yanimy1=62: dxanimy=25: dyanimy=-9: coloranimy="0066FF"
//定义基本点完毕------------------------------------------------
//****************************************************************
//挂机程序正式开始
Rem start
Call Plugin.Bkgnd.MoveTo(hw,0,0)
//一直向上移动,直到遇敌,因为无地图限制所以往一个方向运动即可
KeyDown 38,1
Rem 等待遇敌
//获得小地图上的定义点,判断是否出现蓝框
color1=Plugin.BkgndColor.GetPixelColor(hw,xme,yme)
//如果不遇敌则反复判断。
If color1<>clng("&H" & colorme) Then
Delay 100
Goto 等待遇敌
End If
//检测到小地图蓝框则执行下面的遇敌处理
//遇敌后首先停止移动
KeyUp 38,1
Delay 100
Rem 等待攻击
//再次判断人物蓝框和回合标志
color1=Plugin.BkgndColor.GetPixelColor(hw,xme,yme)
//如果人物蓝框消失,表示战斗结束
If color1<>clng("&H" & colorme) Then
Goto start
End If
color1=Plugin.BkgndColor.GetPixelColor(hw,xround,yround)
//如果没有回合标志镖师还在等待战斗状态
If color1<>clng("&H" & colorround) Then
Delay 100
Goto 等待攻击
End If
//回合标志出现,按顺序搜索小地图上的敌人
i=0
While i<3
color1=Plugin.BkgndColor.GetPixelColor(hw,xanimy1+dxanimy*i,yanimy1+dyanimy*i)
If color1=clng("&H" & coloranimy) Then
//如果找到任何一个敌人,则实施攻击并回到等待攻击状态,等待下一回合
Gosub 战斗
Goto 等待攻击
End If
i=i+1
Wend
//没有找到敌人,表示攻击结束,进入移动状态
//因为此游戏补血没有消耗,所以战斗结束后补血一次
KeyPress 51,1
Goto start
//程序结束
Rem QMScript_end
EndScript
//战斗子程序
Sub 战斗
//战斗前先检查血量,如果血量少于设定值则补血并退出战斗
color1=Plugin.BkgndColor.GetPixelColor(hw,xred,yred)
If color1<>clng("&H" & colorred) Then
KeyPress 51,1
Goto fightfinish
End If
//不需要补血则攻击
//根据设定的要求进行普通或者技能攻击
If attackmode=0 Then
KeyPress 49,1
Else
KeyPress 50,1
End If
Delay 200
Call Plugin.Bkgnd.MoveTo(hw,xanimy1+dxanimy*i,yanimy1+dyanimy*i)
Delay 100
Call Plugin.Bkgnd.LeftClick(hw,xanimy1+dxanimy*i,yanimy1+dyanimy*i)
Rem fightfinish
Delay 500
Call Plugin.Bkgnd.MoveTo(hw,0,0)
Delay 200
End Sub
4即时制打怪
《即时制打怪》
操作方式:用鼠标操作人物在地图上行走。用鼠标直接点击敌人可进行攻击,按数字键1可以补血。己方血量耗尽则游戏结束。如果血瓶耗尽则进入计分系统,打败敌人越多分数就越高哦!
制作思路:可根据小地图的色点来判断敌人在画面中的位置,进而用鼠标点击。
参考脚本
//获得游戏窗口句柄和位置尺寸等信息以便使用后台操作
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
5横板动作
《横板动作》
操作方式:按左右键进行移动,空格键跳跃,A键攻击,S键放技能,数字键1可补满血,吃到蓝球可补满蓝。在规定时间内打倒越多的怪物,则分数越高。
制作思路:考验各种基本知识的应用,难度比较大哦~
参考脚本
//V1.1 1-解决上个版本怪在某些特殊位置出现导致的问题
// 2-修正了判断层位置时的BUG
// 3-加入了平时对技能的支持
// 4-退出时弹起所有按键
//V1.2 1-加入了寻找蓝球加蓝
// 2-加入了对玩家高度高于目标二层时下落一层时行走方向的再次判断
// 3-对层次判断提取为一个子函数
//V1.3 最终版--解决最右边层蓝球的问题。
//**************************************************************************
UserVar HpPer = 50 "使用血瓶的血量百分比"
UserVar MpPer = 30 "寻找蓝球时的百分比"
UserVar UseSkillMpPer = 70 "平时使用技能的蓝量百分比"
//定义变量与初始化
Dim hWnd, ClientRect, Ret(4), HpStep, HpX, HpY, MpX, MpY, UseSkillMpX, UseSkillMpY
Dim GameLeft, GameTop, GameRight, GameButtom
Dim MonX, MonY, PlayerX, PlayerY, BallX, BallY
Dim MonFloor, PlayerFloor, BallFloor, tempHigh, tempFloor
Dim HPColor, MpColor, MonColor, PlayerColor, FloorColor, SideColor, BallColor
Dim AttackMaxDis, MagicDis, AttackedDis, RelativeDis, GameState, FindBallState, MonDir, KeyNum
//MonColor 怪物的特征色--棒子 PlayerColor 人物的特征色--手臂 FloorColor 每层高度的特征色--绿色 MonFloor 怪物所在的高度层 PlayerFloor-玩家所在的高度层
HpColor = "0066FF": MpColor = "FF6600": MonColor = "4C7299": PlayerColor = "0033CC": FloorColor = "0B8648": SideColor = "004E88": BallColor = "D7720E"
MonFloor = 0: PlayerFloor = 0: BallFloor = 0
//GameState --含义 -1 没有发现怪物 0 发现怪物 1 普通攻击 2 魔法攻击
AttackMaxDis = 120: MagicDis = 330: AttackedDis = 104: GameState = -1: FindBallState = -1: MonDir = 1: KeyNum = 39: HpStep = 0.88: MpStep = 0.88
//--------------------------------------------------------------
//获得游戏窗口句柄和位置尺寸等信息以便操作
hWnd = Plugin.Window.mousepoint()
ClientRect = Plugin.Window.GetClientRect(hWnd)
//以下语句判断是否获得的是游戏窗口(游戏窗口尺寸是550x400)
If StrComp(Right(ClientRect, 7), "550|400") <> 0 Then
Messagebox("请将鼠标放在游戏窗口内启动脚本。")
EndScript
End If
Rect = Split(ClientRect,"|",-1,1)
GameLeft = CInt(Rect(0))
GameTop = CInt(Rect(1))
GameRight = CInt(Rect(0)) + CInt(Rect(2))
GameButtom = CInt(Rect(1)) + CInt(Rect(3))
HpX = GameLeft + 80 + CInt( HpStep * HpPer)
HpY = GameTop + 31
MpX = GameLeft + 80 + CInt( MpStep * MpPer)
MaxMpX = GameLeft + 80 + CInt( MpStep * 90)
MpY = GameTop + 61
UseSkillMpX = GameLeft + 80 + CInt( MpStep * UseSkillMpPer)
UseSkillMpY = GameTop + 61
//系统和窗口初始化完毕------------------------------------------
While True
Call AddHp
Call PlayerMove
//Call GetBallInfo
Call GetMonInfo
Call GetPlayerInfo
Call MoveToMon
Call MoveToBall
Call AttackMon
Wend
//左右移动
Sub PlayerMove
If GameState = -1
//判断地图边界则是通过地图最下面的二颗树的枝来判断的 //MinDir 行动方向, 1 向右 -1 向左
Call FindColorEx(GameLeft + 140, GameButtom - 3, GameRight - 140, GameButtom - 1, SideColor, 0, 0.9, SideX, SideY)
If SideX > 0 Then
KeyUp KeyNum, 1
If SideX < GameLeft + 200 Then
MonDir = 1
Else
MonDir = -1
End If
End If
KeyNum = 38 + MonDir
KeyDown KeyNum, 1
End If
End Sub
//得到怪物信息
Sub GetMonInfo
Call FindColorEx(GameLeft, GameTop + 60, GameRight, GameButtom - 60, MonColor, 0, 0.9, MonX, MonY)
Delay 2
If MonY >0 Then
//得到怪物X中心坐标
MonX = MonX + 15
tempHigh = MonY
Call GetFloor
MonFloor = tempFloor
End If
End Sub
//得到玩家信息
Sub GetPlayerInfo
Call FindColorEx(GameLeft, GameTop + 60, GameRight, GameButtom - 60, PlayerColor, 0, 0.9, PlayerX, PlayerY)
Delay 2
If PlayerY>0 Then
PlayerDir = 0
// 默认认为玩家面象为左边,这里通过玩家特征点的坐标加偏移找玩家眼睛来判断面象
Call FindColorEx(PlayerX + 12, PlayerY - 15, PlayerX + 16, PlayerY - 19, "DFDFDF", 1, 0.8, HeadX, HeadY)
If HeadX >0 Then
PlayerDir = 1
End If
tempHigh = PlayerY
Call GetFloor
PlayerFloor = tempFloor
End If
End Sub
//得到蓝球信息
Sub GetBallInfo
Call FindColorEx(GameLeft, GameTop + 55, GameRight, GameButtom - 60, BallColor, 0, 0.8, BallX, BallY)
Delay 1
If BallY>0 Then
tempHigh = BallY + 35
Call GetFloor
BallFloor = tempFloor
End If
//吃蓝是特殊情况 --因为在最右边,要想吃的话,得从左边上去。中间会导致找不到蓝球。所以强制置X坐标
If BallFloor = 4 and BallY < 0 Then
BallX = GameRight
End If
End Sub
//得到所在的层数
Sub GetFloor
If tempHigh > GameTop + 250 Then
tempFloor = 0
ElseIf tempHigh > GameTop + 170 Then
tempFloor = 1
ElseIf tempHigh > GameTop + 110 Then
tempFloor = 2
ElseIf tempHigh > GameTop + 85 Then
tempFloor = 4
ElseIf tempHigh > GameTop + 60 Then
tempFloor = 3.5
End If
End Sub
//走向怪物
Sub MoveToMon
GameState = -1
If MonX > 0 and PlayerX > 0 Then
GameState = 0
FloorDis = MonFloor - PlayerFloor
//如果玩家高度高于怪物,先移动到怪物的下面
If FloorDis < 0 and (NearMon = 0 or tempFloorDis <> FloorDis) Then
tempFloorDis = FloorDis
NearMon = 1
Call JudgeMoveDir
//如果怪物处在第三层,特殊处理
ElseIf MonFloor = 4 Then
//说明我已在第一层了
If FloorDis < 3.5 Then
If (Abs(MonX - PlayerX) >= MagicDis) Then
Call JudegMoveDir
Else
Call StopMove
GameState = 2
End If
Else
tempTopDis = -90: tempButtomDis = 0: tempXDis = 65
//没有在第一层,则找到第一层相对于玩家的位置
Call JudgeFloorPos
End If
//玩家与怪物的高度小于3格,在最大攻击距离内跳砍就能打到
ElseIf FloorDis >= 0 and FloorDis <> 3 Then
//如果玩家和怪的X距离大于最大攻击距离
If (((Abs(MonX - PlayerX) >= AttackMaxDis) and (FloorDis < 3)) or ((Abs(MonX - PlayerX) >= 20) and (FloorDis > 3))) Then
Call JudgeMoveDir
Else
Call StopMove
GameState = 1
End If
End If
ElseIf NearMon = 1 Then
Call StopMove
End If
End Sub
//向目标移动
Sub JudgeMoveDir
KeyUp 39, 1
KeyUp 37, 1
If MonX > PlayerX Then
KeyDown 39, 1
//置玩家行走方向和当前面向相同
MonDir = 1
Else
KeyDown 37, 1
MonDir = -1
End If
End Sub
//停止移动
Sub StopMove
FindBallState = 0
NearMon = 0
KeyUp 39, 1
KeyUp 37, 1
Delay 30
End Sub
//移动到蓝球
Sub MoveToBall
//蓝自动回到大于90%时不再找蓝球回蓝
Call FindColorEx( MaxMpX, MpY, MaxMpX, MpY, MpColor, 0, 0.9, FindBallX, FindBallY)
If FindBallX > 0 Then
FindBallState = 0
BallFloor = 0
End If
If GameState < 0 Then
//判断是否要找蓝球回蓝
Call FindColorEx( MpX, MpY, MpX, MpY, MpColor, 0, 0.9, FindBallX, FindBallY)
If FindBallX < 0 and FindBallState = 0 Then
FindBallState = 1
End If
If FindBallState <> 0 Then
Call GetBallInfo
Call StepToFloor
End If
End If
End Sub
//得到层与层之间的关系
Sub StepToFloor
If BallX > 0 and PlayerX > 0 Then
GameState = -2
FloorDis = BallFloor - PlayerFloor
//如果玩家高度高于怪物,先移动到怪物的下面
If FloorDis < 0 and (FindBallState = 1 or tempFloorDis <> FloorDis) Then
tempFloorDis = FloorDis
FindBallState = 2
Call JudgeMoveBallDir
ElseIf FloorDis = 0 Then
Call JudgeMoveBallDir
//已吃到蓝球,蓝球位置置0
If Abs(BallX - PlayerX) < 35 Then
BallFloor = 0
End If
ElseIf FloorDis > 0 Then
tempLeftDis = 0 : tempRightDis = 0
//处理找蓝球加蓝时可能会导致的一个问题
If BallFloor = 1 Then
If BallX > PlayerX Then
tempLeftDis = 250 : tempRightDis = 0
Else
tempLeftDis = 0 : tempRightDis = -250
End If
End If
If PlayerFloor = 3.5 Then
tempTopDis = 40: tempButtomDis = 60: tempXDis = 150
Else
tempTopDis = -90: tempButtomDis = 0: tempXDis = 65
End If
Call JudgeFloorPos
End If
ElseIf FindBallState = 2 Then
Call StopMove
End If
End Sub
//得到层与层之间的关系
Sub JudgeFloorPos
//没有在第一层,则找到第一层相对于玩家的位置 从中间左右判断上一层相对于玩家的位置
Call FindColorEx(GameLeft + tempLeftDis, PlayerY + tempTopDis, PlayerX, PlayerY + tempButtomDis, FloorColor, 2, 0.8, FloorX1, FloorY1)
Call FindColorEx(PlayerX, PlayerY + tempTopDis, GameRight + tempRightDis, PlayerY + tempButtomDis, FloorColor, 0, 0.8, FloorX2, FloorY2)
If FloorX1 < 0 and FloorX2 < 0 Then
KeyDown KeyNum, 1
ElseIf (FloorX1> 0 and FloorX2 > 0 and (FloorX2 - PlayerX >= PlayerX - FloorX1)) or (FloorX1 > 0 and FloorX2 < 0) Then
KeyUp 39, 1
KeyDown 37, 1
MonDir = -1
ElseIf (FloorX1> 0 and FloorX2 > 0 and (FloorX2 - PlayerX < PlayerX - FloorX1)) or (FloorX1 < 0 and FloorX2 > 0) Then
KeyUp 37, 1
KeyDown 39, 1
MonDir = 1
End If
If Abs(FloorX1 - PlayerX) < tempXDis or ABS(FloorX2 - PlayerX) < tempXDis Then
KeyPress 32, 1
Delay 500
End If
End Sub
//向目标移动
Sub JudgeMoveBallDir
KeyUp 39, 1
KeyUp 37, 1
If BallX > PlayerX Then
KeyDown 39, 1
//置玩家行走方向和当前面向相同
//MonDir = 1
Else
KeyDown 37, 1
//MonDir = -1
End If
End Sub
//攻击怪物
Sub AttackMon
If (GameState > 0) Then
//玩家和怪物背向则调整面象
If MonX > PlayerX and PlayerDir = 0 Then
KeyPress 39, 1
Delay 30
ElseIf MonX < PlayerX and PlayerDir = 1 Then
KeyPress 37, 1
Delay 30
End If
//相隔不同层时的延时处理
JumpDelay = 0
If MonFloor - PlayerFloor > 0 Then
KeyDown 32, 1
Delay 200
If MonFloor - PlayerFloor = 2 or MonFloor - PlayerFloor = 3 Then
JumpDelay = 250
ElseIf MonFloor - PlayerFloor = 2.5 Then
JumpDelay = 275
End If
Delay JumpDelay
KeyUp 32, 1
End If
If GameState = 1 Then
//判断平时是否使用技能 限制在相隔一层的范围内效果比较好
Call FindColorEx( UseSkillMpX, UseSkillMpY, UseSkillMpX, UseSkillMpY, MpColor, 0, 0.9, UseSkillX, UseSkillY)
If MonFloor - PlayerFloor < 1.5 and UseSkillX > 0 Then
KeyPress 83, 1
Else
KeyPress 65, 1
End If
Else
KeyPress 83, 1
End If
Delay JumpDelay + 200
End If
End Sub
//加血
Sub AddHp
IfColor HpX, HpY, HpColor, 1 Then
KeyPress 49, 1
Delay 50
End If
End Sub
//防止有按键没有弹起
Sub OnScriptExit
KeyUp 32, 1
KeyUp 37, 1
KeyUp 39, 1
End Sub
6农场种植
《农场种植》
操作方式:用鼠标进行操作,点击左下方的播种然后选择种子,再把种子放在空田上,就可以种下果树。果树成熟后,点击摘取按钮就可以收获果实。此外还可以经常光顾朋友的农场偷取果实,点击右上方的好友按钮可呼出好友菜单。最后可以点击右上方的仓库按钮,将收获的果实卖出,兑换金钱。
制作思路:多应用循环语句解决繁琐的鼠标移动过程。
参考脚本
dim Fruit,FruitL
UserVar Fruit=18 "当摘取多少次果实后自动卖出"
FruitL=0
MessageBox "请将鼠标移到Flash游戏窗口上面,脚本测试到游戏窗口后会再次提示才开始挂机 "
Call 检测鼠标下是否游戏窗口
MessageBox "游戏窗口验证成功,三秒后开始挂机 "
Delay 3000
Call Plugin.Window.Active(WinF)
Rem 开始
Call 跳到自己的农田
Call 播种
Call 收获
Call 好友果实
Goto 开始
Sub 检测鼠标下是否游戏窗口
While WinSWH(2)<>"550" and WinSWH(3)<>"400"
//得到鼠标下的句柄
WinF=Plugin.Window.MousePoint()
//得到鼠标指向的句柄的窗口客户区大小
WinS=Plugin.Window.GetClientRect(WinF)
//分割坐标
WinSWH=Split(WinS,"|")
Wend
End Sub
Sub 跳到自己的农田
//检测指定坐标点的颜色
MeC=Plugin.Bkgnd.GetPixelColor(WinF,36,28)
//如果不符合则跳到自己的农场
If MeC<>"000000" Then
//鼠标移动到指定坐标
Call Plugin.Bkgnd.MoveTo(WinF,440,30)
Delay 300
//鼠标在指定坐标单击
Call Plugin.Bkgnd.LeftClick(WinF,440,30)
Delay 300
End If
End Sub
Sub 播种
//i初始值为9
i=9
//下面是选择种子准备播种
Call Plugin.Bkgnd.MoveTo(WinF,70,350)
Delay 300
Call Plugin.Bkgnd.LeftClick(WinF,70,350)
Delay 300
Call Plugin.Bkgnd.MoveTo(WinF,65,320)
Delay 300
Call Plugin.Bkgnd.LeftClick(WinF,65,320)
Delay 300
//循环9次,即检测农田的九块地
For 9
//调用农田坐标
Call 农田坐标
//得到农田坐标点的颜色
FarmlandC=Plugin.Bkgnd.GetPixelColor(WinF,FX,FY)
//如果颜色符合则对相应的农田进行操作
If FarmlandC="38587B" Then
Call 对农田操作
End If
//每检测一块地后向后一块地检测
i=i-1
Next
End Sub
Sub 收获
i=9
//移动到指定坐标
Call Plugin.Bkgnd.MoveTo(WinF,130,350)
Delay 300
//在指定坐标单击
Call Plugin.Bkgnd.LeftClick(WinF,130,350)
Delay 300
For 9
//调用农田坐标
Call 农田坐标
//得到指定坐标点的颜色
FarmlandC=Plugin.Bkgnd.GetPixelColor(WinF,FX,FY)
//颜色符合则对坐标的地进行操作
If FarmlandC="2FA9C8" Then
Call 对农田操作
//收获一次后记录一次给变量FruitL
FruitL=FruitL+1
//如果收获数量到了用户设置的数据后出售果实
If FruitL=Fruit Then
//调用出售果实子程序
Call 出售果实
End If
End If
//每检测一块地后向后一块地检测
i=i-1
Next
End Sub
Sub 好友果实
//得到指定坐标点的颜色
Friend=Plugin.Bkgnd.GetPixelColor(WinF,510,165)
If Friend<>"000099" Then
//条件符合移动鼠标到指定坐标并点击
Call Plugin.Bkgnd.MoveTo(WinF,490,35)
Delay 300
Call Plugin.Bkgnd.LeftClick(WinF,490,35)
Delay 200
End If
Call Plugin.Bkgnd.MoveTo(WinF,510,165)
Delay 300
Call Plugin.Bkgnd.LeftClick(WinF,510,165)
Delay 500
Call 收获
End Sub
Sub 出售果实
Call Plugin.Bkgnd.MoveTo(WinF,444,30)
Delay 300
Call Plugin.Bkgnd.LeftClick(WinF,444,30)
Delay 500
Call Plugin.Bkgnd.MoveTo(WinF,270,266)
Delay 300
Call Plugin.Bkgnd.LeftClick(WinF,270,266)
Delay 500
Call Plugin.Bkgnd.MoveTo(WinF,390,130)
Delay 300
Call Plugin.Bkgnd.LeftClick(WinF,390,130)
Delay 500
FruitL=0
End Sub
Sub 对农田操作
//移动鼠标到指定坐标点并单击
Call Plugin.Bkgnd.MoveTo(WinF,FX,FY)
Delay 300
Call Plugin.Bkgnd.LeftClick(WinF,FX,FY)
Delay 200
Call Plugin.Bkgnd.MoveTo(WinF,FX+100,FY+100)
End Sub
Sub 农田坐标
//下面分别是每块地的坐标点,对农田进行制作前调用
If i=1 Then
FX=87
FY=222
ElseIf i=2 Then
FX=159
FY=182
ElseIf i=3 Then
FX=229
FY=142
ElseIf i=4 Then
FX=165
FY=259
ElseIf i=5 Then
FX=236
FY=219
ElseIf i=6 Then
FX=308
FY=179
ElseIf i=7 Then
FX=242
FY=296
ElseIf i=8 Then
FX=314
FY=255
ElseIf i=9 Then
FX=385
FY=216
End If
End Sub
7挖宝石
《挖宝石》
操作方式:规则很简单,宝石出现时,用鼠标左键单击宝石,即可加分,每关命中率只要高于50%以上就可以过关,进入下一关后,宝石的出现速度将变快,总共十关。
制作思路:主要还是找色、循环功能的应用。
参考脚本
hwnd=Plugin.Window.MousePoint()
//获得窗口左上角的位置和窗口的大小
rect=Plugin.Window.GetClientRect(hwnd)
If InStrRev(rect,"550|400")=0 Then
MessageBox "请将鼠标放在游戏窗口内在启动游戏"
EndScript
End If
//获得窗口左上角的坐标,并将坐标作为参考坐标
dw=Split(rect,"|"):dwx=dw(0):dwy=dw(1)
//设置宝石颜色和开始(下一关)的颜色
ys=array("1A85CD","AD2D2D","C0C064","3333CC","2EC7C7","7C20B9","FFFFFF")
//设置一个变量用来控制点开始的次数
ks=0
//无限循环找色
While true
i=0
//6种颜色+开始(下一关)按钮的颜色等于7种颜色,循环寻找下这7个色
For 7
//以中点向四周找色找到定义的颜色
Call FindCenterColor(dwx+21,dwy+87,dwx+529,dwy+384,ys(i),x,y)
If x>0 and y>0 Then
//判断找到的这个色是否是白色(开始(下一关))的颜色
If ys(i)="FFFFFF" Then
// 判断这个颜色是否大于等于10
If ks>=10 Then
//等于10的话也就是第十关结束了,可以结束游戏了
MessageBox "游戏全通关"
EndScript
End If
//不等于10还没到第10关,也就是将到下一关。我们将变量加大1
ks=ks+1
End If
//点击刚才找到的颜色
MoveTo x,y
LeftClick 1
End If
//减缓CPU的计算降低CPU用量,根据自己电脑CPU设置。
Delay 1
i=i+1
Next
Wend