6.代码部分

第一次接触游戏脚本,所以参考资料是必不可少的,我主要借鉴的是B站上的一个视频,墨迹归墨迹,讲的还是很详细的,适合我这样的人。

说实话之前python写的也不少了,但是面向对象的思想包括代码写的比较少,这次算是一个不错的实践。

之前说过如何去加载大漠插件,之后所有内容都以大漠为主。那么按照面向对象的思想,我需要把方法封装在类里。还有就是加载的过程我可以封装在构造函数里

6.1构造函数

直接开始写。

class OperationClass():
    def __init__(self):

        self.hwnd = FindWindow("CknNkfBhSEg6cvaeM",None)        
        self.path = os.getcwd()
        regdm = WinDLL(r"%s\DmReg.dll" %self.path)
        regdm.SetDllPathW(r"%s\dm.dll" %self.path)
        self.dm = client.Dispath("dm.dmsoft")
        ret = self.dm.Reg("注册码在这里")
        self.Bind()

以上就是具体的构造函数部分,主要做了两件事,一件是将dll文件进行加载,也就是载入脚本。另外一件事是做了绑定操作,在这边使用了自己写的方法Bind,绑定是一个非常重要的过程,它打通了程序和游戏,一旦绑定成功,程序就可以自由的对游戏进行控制。

下面介绍一下除了构造函数之外,我们还定义了什么方法。

6.2 绑定函数Bind

关于绑定方式,这里要说的主要内容是绑定方式,对于不同的游戏,绑定方式是不同的,需要尝试不同的组合,具体的需要在大漠插件的绑定测试工具中进行,一旦成功,我们将自动生成的代码复制进我们的代码就可以完成。

def Bind():
    self.dm.BindWindowEx(self.hwnd,"gdi","dx.mouse.position.lock.api|dx.mouse.position.lock.message|dx.mouse.clip.lock.api|dx.mouse.input.lock.api|dx.mouse.state.api|dx.mouse.api|dx.mouse.cursor","dx.keypad.input.lock.api|dx.keypad.state.api|dx.keypad.api","",2)

     self.dm.SetSimMode(0)
        
     self.dm.EnableRealMouse(2,20,30)
        
     self.dm.EnableRealKeypad(1)
    
     self.dm.SetDict(0,"%s\ziku.txt" %self.path)
    
     self.GetClientSize()

在这部分代码中,除了绑定外,还调用了几个函数,比如模拟真实鼠标键盘操作的函数,调用字库等等。

6.3 解绑

有绑定自然有解绑,只是解绑的过程相对简单一些。调用自带的UBindWindow函数就可以。

6.4 点击操作

大漠插件提供鼠标左键右键的操作,单击双击等等,但是在这里我们将点击的操作二次封装,以便更不容易被识别到。主要就是在点击的时候在提供精确坐标的同时加上一定的偏移量。在下面以单击鼠标左键为例来说明。


def LeftClick(self,x1,y1,xr,yr,delay=uniform(0.3,0.8)):
    x = x1 + randint(1, xr)
    y = y1 + randint(1, yr)
    self.dm.MoveTo(x,y)        
    self.dm.LeftClick()        
    time.sleep(delay) 

这里一方面加入了坐标的偏移量(randint),另一方面在每次点击操作后,加入了一个delay,这个delay的取值也是随机量(uniform)。

6.5 获取窗口大小

当前窗口的大小是一个很重要的量,因为一切定位操作都基于这个数据。

def GetClientSize():
    
    ret = self.GetClientSize(self.hwnd)
    self.width = ret[1]
    selfheight = ret[2]

6.6 按键操作

按键比起点击更简单一些,直接调用函数就可以。

def KeyPress(self,n):
    self.dm.SetWindowState(self.hwnd,12)
    self.dm.KeyPress(n)

6.7 FindStrFastEx识别字符

对画面中的字符串进行识别,这是一个常见的功能。我们将插件中提供的方法进行封装。

def FindStrFastEx(self,x1,y1,x2,y2,string,color_format,sim,n=0):
    ret = self.dm.FindStrFastEx(x1,y1,x2,y2,string,color_format,sim)
    if len(ret)>0:
        ss = ret.split("|")
        num = len(ss)
        s = ss[n].split(",")
        self.x = int(s[1])
        self.y = int(s[2])
            return 1
        else:
            return 0

6.8小结

这就是我们所写的操作类里的方法,做了详细的介绍,对于大漠插件本身提供的方法,可以简单的通过手册进行查询。

下面放出的是一个简单的展示。识别文字并进行点击。

c = OperationClass()

for i in range(10):
    
    if c.FindStrFastEx(0,0,int(c.width),int(c.height*0.5),"力破奇案有担当","ffffff-111111",0.9):
        c.LeftClick(c.x,c.y,20,10)
        print("found")
        break
    time.sleep(0.5)


time.sleep(10)

效果就不在这里展示了。接下来我们需要更进一步,自动完成一个完整的任务,思路上比较简单,就是摸清楚所有的流程并进行自动化。这部分内容将在接下来的第六部分进行探索。