郁金香游戏辅助教程笔记-四-

郁金香游戏辅助教程笔记(四)

P146:157-游戏自动登录设计-保存及载入账号信息 - 教到你会 - BV1DS4y1n7qF

大家好,我是郁金香老师,那么这节课呢我们进行哈这个账号信息的一个保存,以及呃账号信息的一个自动的一个载入相关代码的设计。

那么首先我们打开156克的代码,当当当。

那么打开之后为了方便测试呢,在这里呢我们添加两个按钮做一个测试,那么一个是我们保存这个列表里面的一个信息到我们的配置文件,保存我们的账号信息嗯,那么另外一个我们用来是测试啊。

就是读取读取我们的账号信息存文件,那么最后我们调试成功的话,我们就可以了,给他把这相应的代码放到我们窗口的初始化的函数里边,那么以及我们在添加登录信息的时候呢。

把这个账号的信息呢更新到我们的文件里面就可以了,那么首先呢我们来设计一下啊,保存账号的这个信息。

当然这个函数呢在这里呢我已经把它写好了哈,那么我们一起来看一下它的一个原理,那么这里呢我们是直接把内存里边的这个数据啊,字节数据,那么直接以二进制的方式啊,也就是说原封不动的啊。

这个数据呢从内存里面写到我们的文件里面,那么我们这里呢需要用到这个二进制的这个格式,那么在写入的时候呢,我们这里呢呃它的这个参数呢是out啊,那么一个是二进制,一个是out啊。

那么这两这两个参数呢我们都需要用到,那么这里呢我们是用的这个啊o fs啊,这个就是输出啊,输出的一个流,用了一个流文件来操作的,它啊首先呢我们就是打开这个文件,然后呢对它进行一个写入的一个操作。

那么我们在这里呢这个账号信息的一个配置文件呢,我们保存在啊这个文件名里边,当然这个后缀名我们可以随意的变啊,随意的变或者不要后缀名都是可以的,或者叫txt或者叫i n i都可以,这个后缀名随便变啊。

这里我把它写成的是啊b n或者是cfg都可以啊,欢迎大这个后缀名我们是可以随便变的,然后呢在这里呢,那么我们还是首先把这个代码复制进去。

我们在来解释一下这个相应的代码,那么我们在这个地方呢进行复制,那么因为我们写的时候呢是写的这个内层面的函数,那么这样复制进去的话呃直接编译肯定是通不过的啊。

那么我们需要把这个相关的头文件呢来把它进行一个前置啊,把这个函数的说明复制一下,那么还有这前面的这个函数的说明啊,我们都需要对它进行复制,那么复制好了之后呢,我们把它放到图文件里面进行一个说明。

把它说明成是一个类的成员函数,好那么在这个public啊,这个位置呢我们加上我们的说明,这后面呢再加上分号好,那么这个时候呢我们编译实际上就已经能够通过了,对了还需要包含我们的一个图文件。

不然的话他也不能够认识啊,嗯那么我们再转过来到原文件里边,因为我们用到了文件流的一个操作,那么这里呢我们需要把相应的头文件也需要包含进来,等着,那么文件流的一个操作啊,需要包含这个图文件。

好那么这个时候我们就能够编译通过了。

那么我们可以来先来测试一下,再做解释,那么这里呢一共呢我们写了两个函数,那么一个函数呢,它的功能呢是把我们的账号信息保存到前面的这个文件里面,那么后边这个函数呢是从这个配置文件把这个数据来读取出来啊。

然后呢更新到我们的窗口。

好的,那么我们先进行测试啊,那我们再来说明,首先我们是save file保存信息,那么另外一个呢是读取信息是re,嗯by date to list country,好的,那么我们先来测试一下。

那么我们每次启动的话,我们都是要要手动的去输入这个账号,那么这样呢显然很麻烦啊,那么我们可以来把这个账号信息的保存在文件里面,那么下次的时候呢,我们就从这个文件里面读取。

那么比如说我们第二次在运行的时候。

那么我们就可以了,直接从这个文件里面读取我们的这个账号信息,好这样我们就能够把它读出来了,那么有了这个真解,我们也可以了,继续的把它添加进去。

那我保存信息,那么第二次的时候呢,我们就直接可以从文件里边呢把这个信息呢读取出来啊。

这样的话我们就很方便。

那么或者的话我们还可以来呃,直接的把这个从文件里面读取信息的这个函数呢,把它添加到我们的这个窗口初始化函数里面,那么这样的话就不用我们每次去手动的进行操作,这个感觉。

那这样的话我们自自己的自动的啊,他就会去读取啊。

那么这个保存账号信息呢,我们也可以来把它添加到我们的这个登录信息里边,不用每次都去呃,单击这个保存我们的信息,直接从这里啊。

好的,那么这个时候的话我们直接对还有文件这个选中行的时候呢,我们也需要把这个函数呢更新到里面了,啊,只要相应的数据有了这个变化。

那么我们就更新一次它的这个数据,好那么这个时候比如说我们把这一行的删掉,那么在新增加一个六,那么在这里呢再输入我们的密码,那么添加我们的登录信息,那么这个时候呢我们就用不着再来保存账号信息。

这里一共有四个账号,那么我们直接把它关闭掉啊。

第二次的时候呢,它就会自动的啊载入这些信息,那么这样的话使用起来就非常的方便啊,使用起来就非常的方便。

当然这两个呢我们也可以来呃,可以不显示这两个账号啊,最后我们测试成功之后。

那么直接我们就可以使用。

好那么这个时候读取都是自动的,那么这个时候我们相应的公认我们已经演示完毕了,那么我们接出来来看一下函数设计的一个原理,那么首先呢我们是对了啊,用这个呃文件流对这个文件进行操作。

那么文件流呢他的第一个啊我们需要打开我们的文件啊,那么打开文件的时候呢,第一个参数呢就是文件的名字啊,那么如果这个文件它没有在我们的当前目录下,那么我们需要用全路径的一个名字。

当然这个时候呢我们e x e来和这个文件呢它是在同一个呃路径下啊,也就是当前的呃这个进程的一个运行的一个路径的下边好的,那么后面呢这里呢这个参数来表示是二进制啊,这个out了表示是写入。

那么首先呢我们打开之后呢,我们用一个fire函数来判断是否打开失败啊,那,么如果打开失败的话,我们需要来做一些这个牛的一个清理工作,啊哈哈,那么清空我们的流,然后呢我们关掉了嗯。

这个呃进行一个关闭的操作,相当于是关掉啊这个相应的句柄啊,这一类的,然后呢我们就只能够直接返回了,因为我们这个时候的话,肯定我们文件打开失败之后呢,就不能够对这个文件进行操作。

那么如果当然这里的还可以的,打印一些调试信息,好那么如果打开成功的情况下,啊那么如果打开成功呢,我们就骗你这个维克特这个表,那么这个表头啊,前面我们已经介绍了,它里边就是存放的我们账号的信息。

那么实际上我们只要骗你这个表,把表里边的所有数据保证基这个二进制的形式,也就是内存里面它是什么形式呢,我们这个时候就以什么形式呢,把它保存到我们的文件,那么下次我们涂的时候呢。

也以二进制的形式来把它读出来就可以了,然后呢一个for循环进行偏离,偏离它里面的所有这个元素,那么偏离的时候呢,我们取出它的这个呃,这个指针,那么管里面的我们的呃大区用户名密码。

服务器陷入角色的这些信息,来依次的写入到我们的这个二进制的文件里面啊,一式的写入,那么注意,那么这里写入的这个顺序,那么读取的时候也要用这个顺序呢去读取。

当然我这里设计的话就是按照这个结构的顺序来的啊,那么这个结构啊。

最新的这里的一个游戏分区,我们是一一对应起来的,因为它读取的时候呢,就就是直接按照这个结构的大小来读取的,那么这样呢更快一些啊,更快一些,读取的时候可以一次性的读取,这样一个结构啊出来。

那么写入的时候呢是按照这个次序的,挨着挨着的来写入的啊,写入之后保存到我们的这个文件,它也相当于是一环内城区域这样来操作的吧,那么写入完成之后呢,当然也要进行一些清理工作啊,后面的啊,啊关闭一个文件里。

那么这就是我们呃写入数据到我们的这个流文件,那么在读取的时候呢,我们用另外一个啊这个s t d这个实际上它表示是读取啊这个i了,它实际上是可能是这个in啊这个字母的一个所有缩写。

那么同样的后面的这个打开的参数呢也要改变一下,那么这里呢它的这个参数呢也是in,那么in的话,这里呢表示的是读取,那么这里呢是以二进制读取的方式来打开的,那么同样的打开失败的话。

我们也做一些清理的啊工作啊,好,那么如果打开文件成功,那么我们就可以从里边呢来读取我们的数据,那么首先如果这个读取成功的时候来这里呢,我们可以刚在测试的时候的话,这句是肯定要要的。

不然的话它会重复的向里面添加数据,当然这个时候的话呃,这句就显得可要可不要了,因为在如果我们只是在这个窗口初始化的时候再来调用这个函数的话,这一步呢就显得有些多余啊,这句当然你自己考虑要不要。

那么这个呢我们是对这个表的一个清空啊,对这个worker动态数组的一个做一个清理的一个工作啊,清空,那么接下来呢我们就开始来从这个文件里面来读取我们的数据,那么这个呢是它的一个读的一个指令。

那么读取出来之后呢,我们是放在这个缓冲区里面,那么这个缓冲区的话,我们在前面的定义的就是我们刚才的这个类型啊。

结构类型定义了这样一个结构,那么这个结构呢肯定就是用来存放这些信息的。

那么它相当于直接把那个文件里面的相关的这个数据呢,按照它的一个大小啊,在周五按照这个结构的大小来进行一个读取,读取之后呢啊放在这个结构里面,那么一次来只读取这么多啊。

然后呢我们再把这个数据来啊进行一个压战啊,添加相当于是添加到我们的动态数组里边,天价的账号信息好动态数组或者是掉头,那么如果在这里呢,它读取失败,说明读到了我们的文件末尾啊,那么则退出我们的循环。

这退出我们的y循环,那么开始的时候呢,我们可以加上这一句,那么实际上我们是要读取整个文件的话,这一句呢我们也可以直接把把它设置为一啊,理论上也是可以的,当然这种写法来更好一些。

那么这个函数呢e f呢是用来判断判断我们的文件啊,比如是否啊这个读取到是否这个指针呢,文件流指针是否指向文件bo啊,如果指向末尾的话,就是说里边它或者是没有数据,或者已经读到我们的最后了啊。

那么我们也退出循环,那么这里的话呢它是读取失败了,那么呢我们也退出,我们的循环,那么如果读取成功的话,那么我们就把这个读取出来的这个元素呢,呃添加到我们的这个呃这个表里给啊。

那么我们之前的操作来设计的时候,都是对这张表的一个操作。

相当于相当于我们是把这个表的数据来与我们的这个控件的数据呢。

进行了一些关联,因为我们在添加登录信息的时候呢,我们每次呢也要向这个表里面添加一个元素进去啊。

那么所以说我们最后呢我们再再回来一下,再看一下。

那么所以说在这里呢我们把这个数据看更新到表里面之后呢,最后这个函数的调用相当关键,那么最后呢我们是把这个wink动态数组里面的,这些所有的账号信息的元素来通过我们之前写的这个函数呢。

更新到我们的呃这个窗口界面里面啊,好的,那么我们再来测试一遍。

好的,那么这个时候我们发现呢它就能够自动的带入这些信息了,那么因为我们这个调试环境的话,它实际上它的工作目录的话不是这个e x e所在的这个目录。

那么所以说我们进去的话,在这个第八个里边的话,他只能找到e x e,他找不到这个b,那么这个文件啊,那么当时这个文件在哪里呢,在他的一个工作的这个目录里面啊,一到十,美美的事情看起来这一。

啊就在这个目录里边。

实际上我们保存的这个文件的话,就在这这个文件里面,因为我们这个调试器它设置的这个进程默认目录目录的时候呢,是设置它的上一层,但是如果我们单独运行的话,它实际上呢呃,单独运行的话。

它应当是要保存在这个目录里面,但是呢这个时候呢他找不到这个文件啊,应当是第一次运行的时候,啊写入的时候呢应该是呃打开这个文件可能是失败了,那么我们把这个文件删掉之后。

我们再做测试一下,看有没有问题,调试的时候,那么这个时候呢如果文件不存在的话啊,它会出现一个这个错误。

那么我们来看一下我们有哪些需要改进的地方,那么出错的文件的话,我们把这个行号工具来打开看一下,那么我们看一下它执行到了什么地方,那么可能是在这个位置打开的时候啊,出现了这个错误。

那么我们再重新编译生成一下,嗯。

这,那么这个时候呢我们可以开启这个调试运行。

好,那么从我们这个添加的语句来看的话,应该是打开文件这里,它出现了这个问题。

哦是读取文件的时候出去出了这个问题啊,应当不是在保存文件,因为我们在这个窗口初始化,这里呢我们添加的是这个函数的,啊是从里边啊读取我们的这个数据,那么这里呢他有个文件打开的失败的一个处理,好的。

那么我们在这里呢加上一个铝碳一试一下。

那么从这里返回的话就不会出错啊。

但是呢这里好像他打开了也没有失败,那么如果我们从这里返回来再看一下,这个时候呢就会出错啊,因为他打不开我们相应的这个文件。

啊。

应当是这个trs语句啊,这里出的错啊,因为这里的话它输出的后面的这个格式化字符呢,他认不认不了,那么实际上不是我们打开文件啊,这里出的错,那么打开文件它不存在的时候,我们的思路是没有错的。

因为这里的格式化字符呢少了一个s,那么它在呃这个后面的这个字符格式化字符呢,造成他认不到。

啊这个时候就不会有错了啊,那么我们再试一下,那么一定要注意在我们输出这个调试信息的时候。

那么这里呢嗯的这个格式化字串啊,一定不要弄错了,弄错了的话。

我们可能呢就会出错啊,当然现在这个文件呢它存在啊。

可能就不会出错,但这个文件它不存在的时候的话,肯定就会出错的啊,这个地方好的,那么这节课呢我们就焦虑到这里。

P147:158-游戏自动登录设计-批量登录代码设计 - 教到你会 - BV1DS4y1n7qF

大家好,我是郁金香老师,那么这节课呢我们一起来看一下嗯。

你游戏账号的一个批量登录的相关代码的一个设计,那么首先呢我们打开157克的代码。

100。

那么由于我们之前已经设计过账号登录的这个函数,那么如果我们批量登录的话,我们所以说在设计的时候呢,实际上代码呢也很简单,那么我们可以直接调用这个water啊logo,那我直接调用这个函数来就可以了。

然后呢他的这个账号密码这些的来源呢就来源于我们的这个动态数组,这个微课堂的动态数组嘛,uual代替table,那么但是这两个结构的话,我们在设计的时候呢,这两个结构呢它有一点点的区别啊。

这两个结构那么造成了我们在使用的时候呢,需要把呃这个结构里边的数据呢需要复制在里边去啊,当然你也可以修改一下源源代码,统一一下这两个结构,好把它合并一下,那么我们使用同一个结构呢。

在调用这个waterlogan的时候,那么呢更加的简单一些啊,那么现在呢我们啊这节课来讨论一下,在不修改这两个结构的情况下,怎么实现实现我们的代码。

那么我们可以来另外写一个函数啊。

那么这个函数呢也很简单,就是把我们的呃,这个victor动态数组里面的账号和密码的相关信息来进行一个偏离啊,然后呢依次的登录,那么偏离了我们以前啊用的另外一种形式,用的这个iterector的这个指针。

那么这节课呢我们讲另外一种形式来建立这个动动态的数据。

那么首先呢这个呢我们size它有一个size函数,取得数组元素的个数,那么也可以看成是取得这个动态数组的一个大小啊,在你取得动态,那么也就是说里面它包含了多少个哈,账号信息。

然后我们根据这些信息来进行一个for循环,进行一个偏离啊,当然我们也可以直接的把这段信息呢替换到这里来都是可以的啊,然后呢依次的啊对它进行一个赋值,我们把里边的每一个呃元素里边的这个账号的信息啊。

分区以及我们的账号密码,这些信息呢嗯复制到我们的一个临时变量里面啊,最后呢我们再把这个临时变量的结构变量的地址传到这个waterlog里面,然后呢我们就实现我们的这个自动登录了啊,实际上是很简单的。

刚刚我们也可以统一一下结构啊,这个我们就做一个作业啊,大家呃自己去实现一下,做了我们就是把这两个结构呢啊进行修改,那么修改之后的话要求呢呃就只用这一个结构来实现,那么这个结构呢我们就可以删除掉啊。

呃应应该是只用这前面这个结构呢就能够实现,后面这个结构呢我们可以删除掉啊,是这样的一个要求,好的,那么现在我们在这里的话,由于我们的这个分区呢,它保存的保存的时候呢是从一啊,是从零开始的。

那呃那么所以说这里呢我们都要加上一啊,因为它里面的这个账号啊,分区啊这一类的呢,我们都是从他的这个呃都是标记了,都是从一开始的,那么这里呢我们也可以从两方面来修改,一个是这个地方加一。

那么另外一个呢是我们在这个添加信息的时候呢,我们就在这个地方呢来加一也是可以的,在保存的时候,我们就在这个地方呢进行一个加一的一个操作哈,分区啊,server是这个man这个地方加了一的话。

那么我们后面这个地方就不用加一啊,在这里呢就不用加一,那么具体是在什么地方回家啊,这个呢自己去考虑,它都要涉及到呃一部分的代码的一个修改,那么这里呢我们把这个信息呢相当于全部的就啊。

把这个wink的动态数组里面的某一个元素呢,就移植到我们的这个呃log date里面来,那么然后呢我们就把这个账号信息来传到这个mod log里面,然后呢我们就可以实现我们的自动登录了。

当然这里呢我们要等待几秒的这个时间,等待三秒或者是六秒的一个时间,那么实际上我们这个我他说跟你比呢,他已经啊有一个时间的等待啊,最后这里,那么这里呢还有一个等待。

就是来读取我们的这个人物信息啊的一个循环啊,那么这里的话实际上已经有了一个等待,大概是,这里是一秒,大概是等待一分钟的时间,那么一般来说是足够了啊,那么如果是不够不够的话。

那么这里呢我们可以把这个值呢呃修改大一些啊,修改大一些,好的,那么我们重新生成一下,然后我们来测试一下,看能不能够达到一个自动登录的一个目的,然后在这里的话我们把前面的这个代码呢就可以把它注释掉啊。

直接调用这个批量登录的代码,那么最好的办法呢是把这个代码呢放在一个县城里边哈,那这样的话它不会影响到这个主窗口,那么如果现在没有放在这个进程里面的话,我们现在调用了它,由于这个等待的时间线比较长。

那么这个呃登录窗口的话也会来会造成一个假死的一个状态。

好的,那么我们先来进行一下测试,啊删掉相应的行,然后这里呢把我们准备好的这些账号密码自己去申请几个账号或密码,然后呢实现它的一个批量的一个登录,好的,那么我们测测试一下哈。

实际上这里呢我们在测试的话的时候呢,只需要测试两个账号,实际上实际上就够了啊,那么我们点一下自动登录这个。

嗯嗯对,八,这是暗部,那么这个这个运行的时候呢,我们看一下它有时候也出现了一些问题,没有正常的达到我们的一个预期预期的一个效果,那么我们可以把相关的这个安全的软件啊退一下。

另外把登录的这个时间呢嗯做一下,相应的它有一些地方你可以做一下适当的修改,嗯,那么这个登录时间这里呢我们可以让他多等一会儿嗯,然后呢我们转到第一里边来看一下,还有其他地方等待登录器器打开之后。

选择分区分区,这大,那么这里呢我们等待的时间可以稍微改长一点,好的,那么我们重新再生成一下,再来看一下,那么同时呢这个呢我们需要把它先注释掉呃,先退出我们的这个游戏。

好的,然后我们再次尝试一下自动登录,嗯嗯,那么现在呢还没有进入到游戏的游戏里边呢,它就会一直到这个代码呢会等待啊检测,直到这个人物的信息读取完整之后,那么在开始开始了下一个账号的一个读取。

然后呢开始下一个账号的一个登录,那么这次的话我们的这个延迟的时间呢稍微改长一点之后,那么看起来的话呃,这个登录的过程比较顺利的进,啊这个呢是战马啊,这个密码输入错误了啊,所以说呢结束掉了我们的这个进程。

好的,那么实际上我们的这个批量登录的话已经ok了啊,那么这个呢是我们账号的一个问题啊。

密码的一个问题可能是我没有把它呃这个更改正确的,那么这节课呢我们就到这里了,那么下一节课呢,我们在编写一些这个看似开始我们的这个管脚本相关的,那么或者是我们这个掉线检测啊这一类的啊,掉线重新登录啊。

这一类的代码的一个编写。

好的。

P148:159-游戏自动登录设计-断线分析 - 教到你会 - BV1DS4y1n7qF

大家好,我是郁金香老师,那么这一节课呢,因为我们要涉及到一个呃自动登录的时候,涉及到一个断线的一个检测,那么我们需要来分析这个用来判断这个断线嗯。

相关的数据。

那么在这里呢我们可以把这个网络打开哈,然后呢把我们的这个本地链接啊,然后呢这里呢把它禁用啊,那么这里呢他就会实际上这个游戏呢它在断线的时候呢,它会弹出一个断线的一个窗口。

那么这个窗口的话需要我们选择这个服务器线之后呢,它才会出现啊,因为现在的话还没有开始与我们服务器的一个连线,那么我们与服务器连线之后呢,如果是在断线的话,它就会出现一个呃游戏断开链接的一个窗口。

那么我们可以先找到这个窗口,那么这是一种方法,那么另外呢我们也可以直接就这个掉线,有没有掉线的时候,一个数据的一个变化,当然我个人认为的话,直接搜这个窗口呢可能还要简单一些,所花的时间可能要少一些。

那么这个时候呢它已经与我们的服务器已经有这个连线了,然后呢我们断掉这个网络呢,它就会弹出啊,那么实际上我们就是检测这个窗口它是否存在,那么这个窗口是否存在的话,看也要看它是否是一个全局变量。

那么很有可能他他只是一个临时创建的这个对象,那么我们可能就找不到,但是呢我们可以呢可能他应该有其他的一个条件来判断它啊,嗯但是呢我们需要呢从这个窗口来入手,可能比较好入手一些。

另外呢我们也可以通过这个字符串来入手,与服务器断开这个字符串,那么我们可以来先搜一下,试一下这种方法可不可行,那么在这里呢把不可写的也铺上哈,嗯应该是这个字串,但是我们明显的看到这个字串的话。

它不是一个全局的呃一个变量,那么我们再次退出之后的话,它可能呢这个字串的话可能就没有了,好那么我们再次附加到游戏里面,那么这个时候的话我们发现了这个字串已经没有了。

那么所以说这种方式呢方法呢他用不是不可行的,那么我们这个时候呢可以来从我们的这个断线的一个判断的啊,相关的一些函数呢来进行分析,那么我们其中呢在判断断断线啊,是否有这个服务器存在的链接呢。

我们通常会你用这个api wa a一模能听到哈,这个英语的这个函数呢,用来嗯就是说枚举呃相关的一些产生的一些事件,那么其中呢它有一个事件啊,在我们这个关索抗日这个头文件,里面有定义啊。

那么它的事件的一个下标呢是就表示的是一个套接字的,一个就是说我们网络断开的啊,所产生的一个这个close的一个事件,那么产生这个事件的时候呢,因为这个这个数值是五,那么这个一像我们的左移五位的话。

实际上呢就是二进制的这个要五个零,那么这个数值的话我们看一下,那么是16进制的二零啊,那么也就是说这个事件它在我们的,我们把它记一下,这个关闭事件的话,那么呢会产生1~20。

但是为什么我们要说这这些相关的呃数据呢,我们来看一下这个函数在msdn里面的一个定义,那么第一个呢它是指定的一个套接字啊,套接字的一个标识,一个距离,这个是套接字。

那么第二个呢我们就是一个啊消息的一个事件的一个类型类型啊,看是一个事件的一个对象啊,那是一个事件对象,那么其中呢第三个啊这个是我们关心的最重要的一个结构,那么这个结构的话。

它里面呢就包含了我们所要的一些信息,那么这个是一个网络事件啊,那么就是说已经产生的这个网络事件,它都存放在这个long类型的变量里面,它有可能是同时产生了多个事件,那么这个事件的话它都,是以fd开头的。

那么比如说我们的这个fd close或者是下面的这个fd啊,max什么是不对啊,这一类的,那么另外还有一个呢,这里呢还有一个呃,这里呢它实际上是一个什么什么b体结尾的呢,是这个数组的一个下标啊。

那么下标那么从这个相应的这个下表里边的话,我们就能够取出相应的类型的一个事件,那么在这里呢我们说了这么多呢,实际上我们最关键的一点呢,也就是说在网络断开的时候呢,它一般来说会也就是说掉线的时候嘛。

啊它一般会产生一个这个close的这个事件啊,当然这,个超时的话,他应当来说呢也会造成这个事件啊,那么只要是这几种类型的网络断开,或者是呃链接取消,这个链接被对方重色哈。

这几种情况呢一般来说它都会产生一个关闭的一个事件啊,套接式的一个关闭事件,那么所以说我们就需要通过这些数据来来分析,我们的这个雕像的相关数据,那么呢它要获得这些数据来,肯定是要调用这个函数。

调用这个函数之后呢,那么相应的这些呃错误信息呢就存放在这个数组里边。

那么如果是没有相应的事件产生了,这里面的数值呢它是零,那么如果我们的这个关闭事件它产生了,那么这个值呢它是等于320x20 ,那么如果这个关闭事件啊,他没有出错的话。

那么呢这个相应的这个下标我们取得的第五,也就是说这个数组里面的第五个元素应该是第六个元素啊,那么里边呢呃它它的数值呢没有正常的情况下呢,里面是零,那么如果是出错的这个情况的话,那么可能有这几种情况啊。

那么我们一起来看一下。

那么我们先复制一下这个相关的呃套接字啊。

它的这个领取事件的这个函数。

然后我们转到这个地址,那么在这个地址呢我们给它下一个断点,那么马上呢我们就会断下来,这个时候我们发现,那么我们返回到上一层,我们看一下啊,那么在这里的话我们恰好能够判断呃,这里呢还有一个测试啊。

测试我们的这个3c是否等于我们的二零啊,那么我们看一下这个3c是什么地方,那么三四个我们看到的它是它的第一个亚站的一个参数,那么因为它是从右至左的呃,一个亚战的一个顺序啊,复习的一个顺序。

那么实际上这个参数呢是它的第三个参数,那我们再来看一下它的一个说明,那么也就是说它最先压榨的这个参数的话,实际上呢是最后的这个也就是压到了这样的一个结构进去啊,那么这个结构的话,他的第一项目。

那么也就是这个标志啊,事件的一个标志,具体是一个什么标志,那么我们刚才说了,如果是等于二零的话,就是产生了一个啊这个关闭套接字的一个事件啊,fd啊,closed这样的一个事件。

那么这里呢我们会把它标记下来,那么这里呢是做这样的一个判断,那么如果是这里他接e啊,如果是等于这个数值的话啊,不等于的时候呢就跳转,那么如果是等于这个事件的话,他们就会到这个地方执行,那么谁等于他呢。

那么也就是我们的,这个参数就是它的第一个参数相当于3c,我们可以看到在这里的话,实际上呢它的第一个地址啊,这个结构的第一个地址了,3c是指向这个位置的,那么它的第一个下标为零的时候。

就是因为它是负负数啊,那么就应该是三八,那么它的下边五一的时候呢。

相应的元素呢就是三四啊,因为我们要不停的加速嘛,这里是解,那么我们可以看到这里是三八,这里是啊,这里是三岁,这里是三八,那么这里呢就相当于是它它的相应的一个数组,那么这里的下标的话相当于这里是零。

这里是一,这,里是二,那么呢这里是三点,这里是四,这里是五,那么注意,那么它的下标为五的时候,我们可以看到啊,那么你就是这这一个下表啊,相当于啊呃关闭事件的下标,那么也就是说,来看一下。

也就是说在这里的话它指向了这里12345,那么也就是说24里面呢,它存放着这个相应的哈,关闭的时候的一个相相应的一个出错的一个代码啊,也就是这个减24例变,那么这里呢他又有一个比较啊。

与我们的e s i做一个比较,那我们找一下,那么在这里呢我们的es si呢它复制为零,也就是等于零啊,进行了一个相应的一个操作啊,抑或抑或之后呢,他肯定就这个数字呢就为零了啊。

那么这里呢实际上是把这个相应的里边的这个元素啊取出来,与我们的零做,比较那么如果是等于零的就跳过啊,那么如果是不为零呢,那么也就是说不为零的话,在这个地方的话就证明了啊,关闭出错。

那么也就是说这个关闭的事件出错,出错的话,就一般呢会有这几种情况啊,就是也是网络断开了啊,或者是我们的这个就是说呃超时或者是链接的一个取消,那么也就是说从这几种情况来看的话,我们呢都是啊掉线的啊。

都是掉线的,那么也就是说的话在这个位置的话,就是啊掉线的一个检测,那么掉线检测之后呢,他应当会调用相应的这个库,比如说这个扩为什么一定要调用这个库了,那么这个扩的话就有可能是我们的这个显示,断线的窗口。

那么我们具体是不是呢,我们可以把这个地方呢把它弄不掉啊,因为这里我们看到它谱写了一个参数,这里来进行的是一个屏障的一个操作,好的,我们先把这个地方呢把它弄不掉。

那么loop掉之后呢,我们在这里呢再把我们的这个本地面积来禁用,那么这个时候呢我们发现的话,它这里呢不会显示啊掉线,但是实际上呢它已经掉下来了,当然说,这个地方呢他可能也不会被执行到这里。

在前面的代码可能也不会被执行,那么证明的话这个地方呢呃应当是显示我们断线的这个窗口。

或者是与之相关的一些东西,好的,那么我们把它相关的代码复制出来,这个呢应当来说的话,已经找到这个关键的,在这个部分关键代码的附近,那这个时候呢他已经啊不能够产生这个链接。

我们看一下它能不能否进入我们的游戏。

那么我们可以转到,发送这个封包的这个函数去看一下它能否有这个断点,在这里我们下一个段,那么实际上我们可以看到的话,这个时候断线之后呢,他根本就不会啊发包了啊。

那么说明的话他肯定是某个变量里面有这个相应的一个标记啊,它进行了一个判断,然后就不会从这里经过了,那么首先呢我们把它关掉,也可以不关掉啊,呃我们可以直接在,因为刚才我们分析了一下。

那么这个括它有可能是我们的这个显示掉线的这个扣,那么我们把这个库调用一下,看它是否能够显示这个掉线率的窗口,好的我们注入到游戏里面看一下,那么这个时候呢没有任何的效果,那么我们接着再往后面看一下。

那么我们发现了他返回的这个ex呢,呃存放到了我们的,这个前四名的,这个临时变量里面啊,然后呢在与我们的这个零做了一个比较,那么如果它不等于零的时候,等于零的时候呢,跳过了啊,如果是不为零的时候呢。

再调入到下面的一个空,并且呢把上一个函数的返回值呢传到了ec x里面,那么ec x的话,我们知道一般人用这个ec x来保存的是一个对象啊,特别是在调用这个括之前,那么这个ecx的话一般是一个对象的地址。

那么他在这里的话,把这个e是ex呢送到e4 x里面,那我们猜测的话很有可能呢这前面的这个扩展,它是创建了一个窗口的对象,然后呢再通过这个空可能是来显示这个窗口,那么它也有一个参数。

我们再把它加进去看一下,那么这个时候出错了,我们再倒回来看一下我们的代理,那么我们为什么会出错呢,因为我们少写了一句,我们没有把这个ex对象的值呢放到我们的e4 x里面,因为这个扩的话。

在这里我们能够看到它啊,找一下他的e4 x,我们可以看到这个e4 x的在后边啊,直接复制到这个e是i的变形,那么说明的话这个e e sex肯定是一个参数,那么我们在之前的这个库里面来看的话。

那么呢他这里就为了没有涉及到e4 x,所以说他没有e4 x的这个参数,那么这里呢e4 x呢他也没有,进行一个赋值的一个操作啊,好的,那么我们再次启动一下游戏,那么我们直接调用一下这个课,看能否成功。

那么我们看一下我们复制的这一段代码,943829,往下边一个,6月3d,嗯嗯嗯。

然后我们再转到这个地址去看一下相应等待,嗯,啊,嗯这个时候呢我们发现的话它是可以直接测试的啊,嗯这个或者这两个货结合起来的话,就是呢打开我们的这个服务器啊,断开的这个通知啊,呃那么有了这个窗口的话。

说明我们的这个他判断的这些标志呢可能就在附近啊,那么关于他的这个标志的话,那么我们下一节课呢继续的分析啊查找。

P149:160-游戏自动登录设计-分析断线判断标志 - 教到你会 - BV1DS4y1n7qF

大家好,我是郁金香老师,那么这节课我们继续分析啊,分析断线的这个标志,啊。

那么首先我们打开游戏。

打开我们的游戏客户端之后呢,我们附加到游戏里边,因为我们在上一节课的话,应该已经分析到了我们的关键的数据周围嗯。

因为他需要这个相应的条件去判断。

判断之后呢,我们再进行这个断开网络的这个操作,那么我们就在它的周围去分析啊立项,那么我们找到这个显示窗口的,函数啊,这里是我们的显示窗口,这是我们上一节课的分析。

那么实际上我们可以看到啊,还有其他的这个相应的这个判断,从这里来看的话,那么还有其他的地方呢,它也能够呃,可能也是要创建这个掉线的这个窗口,也可能是,那么显示的话,这里呢它也有也有显示,我们。

断线的这个窗口,那么因为我们做的这个测试的话,呃只是呃在这里禁用掉我们的适配器的这种情况。

那么因为它这个掉线的话,就是与我们的网络连接断开的话,都可能是有多种情况的嗯,那么也有可能是服务器啊,呃它关掉了,关掉了之后呢,我们连链接的时候来超时,那么也可能我们这里呢呃相应的适配器啊。

这个按键的问题,那么或者是网线被拔掉了啊,路由器啊这些相关的啊。

那么可能呢它下下边呢都有相应的一些判断,因为它这里面都调用了同一个函数,那么我们从这个位置来看的话,一控呢嗯它有三个啊,有三个相应的这个判断,那么我们来看一下它的一个执行嗯。

这是我们正常的这种情况下是在这里啊,这里是我们的,禁用网卡,那么还有另外的情况,我们来看一下它是怎么到达的,那么另外呢就是从这个地方跳过来的嗯,这个地方跳过来的话,腾配啊,接1v3 ,那么这里是为一。

然后这里呢有一个标志啊,可能是这个标志呃,它可能是为其他的这个数值了,当然这个呢我们呃因为这个时候服务器它没有掉线啊,我们不能够做更多的这个测试啊,那么可能与这个标志位它有一些关系。

那么我们可以找一下什么地方,忘了这个标志位里面有写这个数据的,搜索一下有没有,那么有往这个数据里面写字的话是从这个地方开始的啊,那么我们进去看一下这里来有往这里面来写入一个字节。

那么我们看一下e bx的一个数值,这里写的是bl啊,忘了前边找一下,那么这里的话我们从他来看的话,这里呢也是负责这个初值呃,零,那么我们再找下一个啊,这里有个a a,那么这里呢是写入的一。

但是我们不知道它是由于什么原因写入的一,好那么我们把这里呢啊复制过来备用,那么有兴趣的可以继续的呃,分析一下后面的这些标记,那么我们再看一下参考,这个地方cl呢它也有写入,那么我们看一下e4 x的数值。

那么这里呢也是写零啊,那么零的话从我们前面的判断来看的话,他应该是没有掉线,或者是没有错误啊,这个时候我们暂时不能够呃确定它是没有掉线的时候呢,呃是为零,那么我们接接着看一下cl啊。

这里还有一个a看一下,这里可能多半也是也是为零,那么再看一下参考啊。

这两个地址呢是挨着挨得很近的,那我们再看一下这个a,以x啊,那么这里也是为零的,那么只有一个地方为一啊,就是这个地方比较特别的一个地方,我们再进去看一下,这里呢它是是直接对这个ex进行了赋值。

那么实际上复制之后呢,这个a或ax呢因为是他的呃低低位自己哈,所以说都是唯一的,然后呢往这个里边写入,那么这里边的话我们看一下吧,附近的一个判断的一个跳转,4a a910 嗯。

那么这个数字的话好像是发包的啊,我们来看一下这个数字呢。

感觉比较熟悉。

这是发包的这个库啊,这个地方是a910 ,啊还没有分析完成,让他分析一下,那我们在这里下个段看它会不会断一下,肯定是不会断的,这个地方,那这个地方它为什么会断在这里。

那么我们看这前面会不会会不会执行这个后,那么这里的话我们暂时不知道它是什么条件下会执行,但是这里呢是一个发包的一个孔,进来之后我们也能够看到我们的这个声道函数这一类的。

那么从这里呢能够找到一些字串的一个信息,那么可能是来发包过多的时候嗯,那么来可能会转到这个地方来,可能也不是哈哈这个应该呃,因为这个是很多地方都会断下的这个花苞的,这里的话肯定就会断下了,我们一直用啊。

这个时候就会断下嗯,所以说我们的这个原因的话,还是要到之前这个库里面来讲啊,好的,那么我们暂时不管它退回到我们之前的位置,嗯,那么首先呢它是从这个函数啊,呃这里开始,那么开始之后呢,他应当来说的话啊。

判断他已经呃掉线了,那么就应也就是说在显示了我们的这个窗口呃,之后的话,它应该呢嗯可能在某一个库里边啊,也可能就是在附近的一个代码里面,它应当对我们的这个掉线的相应的窗口呢。

呃应当有一个写入的一个操作啊,可能是写写这个标志哈,那么我们再找一下这个库附近啊,所有的这个写入的这个呃,找找一找这一类的机子,看有没有写入的啊,这也是比较的指令,那么我们往后边找。

那么这里呢也是比较的啊,没有写入我们的数值,这里也是比较的嗯,这里呢有有一个写入的呢,但是呢呃它不是对某个机子进行的一个写入啊,是一个局部的一个变量,那么我们后边继续找的话,这里都是读取的。

而且是一个循环,一般来说的话它不会在这个循环里边的,那么我们继续往前面找,在这里我们下一个段试一下嗯,我们看一下这个扩的话是会被反复的一个调用在循环,那么每一次下到你之后呢,立马就会断一下。

那么这个地方呢我们下一个段落,那么它也会反复的呃被断下了,但是这周围的话我们比较奇怪的是,都没有看到这个机子相关的,那么唯一有一条这个写入的这个木木的这个指令的话,写入的数字的话。

那么这个呢看起来比较靠谱,这里写出了一个-1,但是具体是不是这一个数字来判断的,那么我们呃还需要来进一步的求证,那么我们可以来嗯来看一下在这里这个加幺零的这个bx加一零的话,在前面这里哈。

我们注意在这个位置的话,它又取它的值,然后呢做一个判断啊,嗯这里呢有一个跳转,那么如果这里的数字呢等于这个-1,如果是按照我们的一个猜测的话,这里的话如果是写入-1的话,就是呃应该是已经掉下。

已经退断开哈,因为我们执行到了这个地方的话,这前面的这个嗯二零这里是我们的fty close,是这个事件,然后呢我们后边的它又有一个比较啊,24这里,但是这里的它的下标数下是01234。

那么这里的话相当于是我们的电,close dj相当于是我们的相应的这个数组的这个下标的位置,那么取出来如果这个地方它有这个关闭事件的时候,如果有错误啊发生的话,嗯那么这里的话它是与零比较啊。

肯定就不等于零啊,那么不等于等于零呢就直接跳过啊,那么不等于零的时候呢才会继续的啊,执行在下面的这个操作,当然这里呢我们看它大部分时间呢都是为零的,嗯,然后呢往下执行,这里呢就是我们的掉线的一个窗口。

然后呢如果我们这里呢它有一个判断,判断我们的对象窗口设创作成功,那么不成功的话,他可能返回的就是一个空指针啊,实际上是在判断这个ex是否是一个空指针,如果为空的话。

肯定就不能够调用这个显示掉线的这个窗口啊,好的,那么我们再次来看一下它的一个真正的数值是什么,从这个地方来看一下,那么我们现在看一下dd 5 dex加一零里面的数字是508啊,那么我们继续往下执行。

看一下这个ex的一个趋向,1c x,那么我们还发现一个问题,这个ex的话最后作为了我们的这个每一局哈网络事件的呃,第一个参数,那么我们再来看一下msd里边,来看一下它的第一个参数是什么。

那么我们发现了它的第一个参数的话是这个套接字啊,那么也就是说我们在发包的时候也会调用到这个5v8 ,那么我们来看一下是不是这样八在这里下一个段,然后我们走上两步,那么我们看到这里的的确是这个套接字啊。

说不通啊,那么原来的话我们现在才知道了,他可能就是用这个套接字来做的一个判断,那么如果这个套接字呢,它这个距离不是为-1的话。

那么就判断它是没有掉线的,那么为-1的时候呢,掉下,那么大概是这样一个问题,那么我们可以来进行一下赏识啊。

再按减号退回来,那么现在这个地方呢,下一个断点,禁用,那么禁用之后的话。

他所有的发包啊,应当来说都没有了,那么可能还有其他的一个标志会被打开,那么我们来看一下现在再次走路的时候,它会不会有相应的这个发泡,那么这个时候我们走路的时候,我们就发现了,他不会在这个地方断下来。

那么我们看一下它还有没有其他的标志啊,那么这个地方也为-1,当然这个地方呢它因为从前边这里的一个判断,我们看这个地方哈啊这个地方会被反复的执行到啊,因为这里的话它等于-1的,你比较哈,那么呃不等于负。

所以说这里就不会跳,就从这里来,一直会跳到这个函数的末尾就跳过了,那不然的话应该是这里边有相关的啊发包的这个内容啊,这里边可是我们的这个函数包可能就是从哦这里是js我们发包的啊。

好,好的,那么我们先把这个地方的机子先把它找到,可以在这个位置,在他前面啊,能够断下到这个位置,那么我们看一下1b x是多少,那么我们看一下什么地方对这个e b x有这个相应的访问啊。

用我们的c一角一小。

或者是直接在这里边,我们找一下有没有常亮,啊这里面是没有的。

那么我们在c e里面搜索一下16进制。

那么最后呢我们找到一个五一的一个f3233880 ,a f33880 ,我们看一下这个机子有没有,好这个机子呢,这里边好像还没有找到,嗯也有,那这个就是那个发包的ecx的这个参数啊,就是从这里来的。

那么实际上它就等于这个数值,那我们来试一下,那么也就是说发包的时候呢,他可能也会先判断这个套接字,那么如果这个套接字都都为-1了,他肯定就不会进行相应的这个发包的这个操作,好的,那么我们再来看一下。

可以接着分析一下s,包包的这个函数,那我随便找一个地方看看有没有这样的一个判断,那么这是它的这个ecx,这个地方应当还是会被调用才对,唉对它实际上走路的时候呢,它也会被调用,但是被调用之后呢。

他应该会对e4 x加一零这个地方呢进行一个判断啊,这里呢就有一个判断,我们执行下来看一下,啊按减号再退回来,那么实际上这里呢它也是对这个地方的判断呢,呃套接字是否可用,不可用的话,那么这里的话直接来。

就不发包了啊,这个地方实际上这个地方的e d i7810 ,就是这个-1 e d i的这个数字呢就是这个mc c3188 。

嗯,好的,那么这就是我们这节课呢分析的最终的一个成果,那么主要的是实际上这个机子的话应该是很好找,那么主要的是我们分析的这个啊过程啊,这些嗯,对oad的这些操作呢,呃大家要经常的把它熟悉一下,嗯嗯嗯。

那么这一节课的分析呢。

我们就到这里,当然我们还可以进一步的用我们的c a e来来证实一下。

我们的这个想法,那么这个时候呢我们看一下啊,这是套接字的这个具体,那么如果掉线的情况啊,他肯定呢嗯这个数值呢就会为-1,啊这个时候呢它的数值呢马上就变为了-1啊。

这里的这个相应的这些图像呢也没有刷新出来,那么所以说我们只要读这个机子,读到它它的这个数值为-1的时候呢,我们就可以了嗯,当然我们是有符号数数,带符号数量是-1,那么如果是这个d word的类型呢。

就是啊八个这个f或者是十进制的话,就是这个4294967295,那么这个数值,那么好的,那么如果是出现这种情况的话,我们就可以直接的终止掉这个进程,那么关于相关的这个代码呢,我们下一节课一起来编写。

P15:026-封装选怪功能-写代码 - 教到你会 - BV1DS4y1n7qF

大家好,我是瑞金香老師,客風15033的永秀,今天這集我們就一起來對選外的功能來進行一下封裝,我們打開第23顆的代碼,打開之後我們先添加機子,下面我們在這裡添加一個分類,然後我們再加一個結構的分類。

塞進去,這樣我們看出來可能要清晰一些,那麼首先我們是一個玩家對象的機制,殺對象的,那麼另外一個是我們的所有對象的數據,我們可以把這個公司來進行一下封裝的方式,我們可以把公司粘在後面,那麼機子就這兩個。

後面的是它相關的一個偏移,那麼這裡我們管理機制,那麼偏移我們添加在後面的遊戲結構,那麼我們先封裝玩家的對象,複製一下,代碼最後,嗯,~ 前方大魔王生物中的大魔王 - 蜂巢 ~。

前方大魔王生物中的大魔王 - 蜂巢 前方大魔王生物中的大魔王 - 蜂巢 前方大魔王生物中的大魔王 - 蜂巢 前方大魔王生物中的大魔王 - 蜂巢 ~。

前方大魔王生物中的大魔王 - 蜂巢 前方大魔王生物中的大魔王 - 蜂巢 前方大魔王生物中的大魔王 - 蜂巢 前方大魔王生物中的大魔王 - 蜂巢 ~。

前方大魔王生物中的大魔王 - 蜂巢 前方大魔王生物中的大魔王 - 蜂巢 前方大魔王生物中的大魔王 - 蜂巢 前方大魔王生物中的大魔王 - 蜂巢 ~。

前方大魔王生物中的大魔王 - 蜂巢 前方大魔王生物中的大魔王 - 蜂巢 前方大魔王生物中的大魔王 - 蜂巢 前方大魔王生物中的大魔王 - 蜂巢 ~。

前方大魔王生物中的大魔王 - 蜂巢 前方大魔王生物中的大魔王 - 蜂巢 前方大魔王生物中的大魔王 - 蜂巢 前方大魔王生物中的大魔王 - 蜂巢 ~。

前方大魔王生物中的大魔王 - 蜂巢 前方大魔王生物中的大魔王 - 蜂巢 前方大魔王生物中的大魔王 - 蜂巢 前方大魔王生物中的大魔王 - 蜂巢 ~。

前方大魔王生物中的大魔王 - 蜂巢 前方大魔王生物中的大魔王 - 蜂巢 前方大魔王生物中的大魔王 - 蜂巢 前方大魔王生物中的大魔王 - 蜂巢 ~。

前方大魔王生物中的大魔王 - 蜂巢 前方大魔王生物中的大魔王 - 蜂巢 前方大魔王生物中的大魔王 - 蜂巢 前方大魔王生物中的大魔王 - 蜂巢 ~。

前方大魔王生物中的大魔王 - 蜂巢 前方大魔王生物中的大魔王 - 蜂巢 前方大魔王生物中的大魔王 - 蜂巢 前方大魔王生物中的大魔王 - 蜂巢 ~。

前方大魔王生物中的大魔王 - 蜂巢 前方大魔王生物中的大魔王 - 蜂巢 前方大魔王生物中的大魔王 - 蜂巢 前方大魔王生物中的大魔王 - 蜂巢 ~。

前方大魔王生物中的大魔王 - 蜂巢 前方大魔王生物中的大魔王 - 蜂巢 前方大魔王生物中的大魔王 - 蜂巢 前方大魔王生物中的大魔王 - 蜂巢 ~。

前方大魔王生物中的大魔王 - 蜂巢 ~,缺少一個封號,我們這裡把我們添加一個封號,看一下這個口號延伸到哪裡,出來,這裡,這個標籤我們應該建在前面,這個地方,長亮區,這裡多了一個封號,我們寫好了之後。

我們進行一個相應的測試,在測試的時候,我們就以測試ID的話,我們就用我們對象列表裏面的,就是怪物列表裏面的第一個,做一個測試,我們移到Hook的單元,然後在測試,注射掉之前,那麼同樣的這個玩家對象。

我們添加到一個全局變量裏,那麼這些全局變量的一個聲明,我們應該是放在這個CPP的一個單元,然後我們再到這個全局變量的圖文件,這裡加一個,表示要套出,加上這樣一個前綴,不然的話在包含的時候。

有可能會出現一個重建意義,那麼我們在這裡,我們就可以標用這個玩家的對象,然後選中某個對象,那麼這個對象的話,我們又可以從怪物列表裏面,然後我們取到怪物列表裏面的第一個怪物,然後取得它的一個下標。

下標成員,之前我們沒有添加到怪物列表的屬性裏面,那麼所以說我們要回過頭來,在怪物列表裏面添加相應的成員,怪物對象,那麼我們在之前添加一個,那是0x01z這個地方,它有一個ID,ID。

那麼它有這樣一個數字,同樣的這個數字,我們需要轉到Getty裡面來進行一個初始化,那麼這個數字的話,它的偏移是0x04,取出來,後面可以添加備註,那麼我們取出這個下標,然後我們再轉到這個單元來。

這裡取得這個相應的下標的一個數字,那麼給它傳進去,那麼我們就可以選中一個相應的一個怪物,好,偏移我們先執行一下,對了,這個時候,執行到這裡,我們進入到最後一個窗口,所以說我們要改一下,測試點上。

當然您的窗口名叫什麽就改回,好,那麼再次運行,掛接到主線上,然後我們開一下調試信息的查看器,看有沒有異常,我們看是否選中了怪物,如果選中了怪物的話,我們按這個空氣的話,它就是攻擊這個強力的怪物。

那麽證明我們的這個選擇沒有成功,沒有成功,我們看一下,重新在這裏打印一下相應的調試信息,看是不是執行到了這裡,或者我們在這個Sale Object裏面去打印一下調試的一個信息,我們先看一下。

它是否執行到了這裡,再重新編譯一下,對了,這裏我們這個標槍可能是跳過了,我們是標槍的位置,應該是在前面,在這裏之後,它才會有這個寫入的一個動作寫進去,可能是在這裏,好了,我們再次輸入到遊戲裏面。

掛接主線上,然後我們選中,那麼我們傳入了勝離,來這裏,我們看一下問題出在哪裏,為什麽會傳入勝離,然後我們移到這個地方,看一下該體代替裏面它有沒有初始化,我們是在這個地方初始化,我們把這個數字移到這裏。

那麼這個數字我們來看看,是大一把,它的大小我們在這裏改一下,或者你可以把這個數字定義成紅,我們再編譯一下,再進去看一下,在這裏定義的話,我們這個值可能沒有寫進去,如果出現這種情況的話,無空,繼續,繼續。

如果這個邏輯的話應該是沒有錯的,那麼我們在這裏把它的音響改一下,改成我們綠色的這個音響,這個音響,繼續,繼續,那麼這裏它傳入的數字還是可能是相應的位置,它沒有怪物對象。

那麼我們用OB進遊戲先查看一下。

我們先查看相應的數據,這裏它是有對象的,然後進去的話,加設這個位置應該是1252才對,那是為什麽剛才沒有,我們退出一下。

再來檢查一下我們的代碼,首先我們打印一下這個數字是多少,再轉到這個單元,我們去看一下,從0開始,取出來之後判斷它是不是怪物,加上偏移,加上零色的偏移,轉出來,然後我們再測試一下。

那麼這裏我們取得的數字就是零,為什麽我們沒有初始化成功,那麼我們再檢查一下初始化單元,在這裏的時候,我們打印出相應的價標,那麼,一個是打印出這個I的數字,那麼,另外是打印出相應的寫入的數字。

我們來看一下,還是拿了出來錯,那麼我們再用一下,化成出現詞,然後我們來看一下,它是從1開始,然後沒有重新開始,我們再來看一下,它執行了兩次,它的下標都是從1開始,它沒有從0開始,這個下標。

我們再推到裏面來看一下,為什麽這裏它是從1開始,到這個位置的話就1了,這裏應該是從0開始,難道它是第一格,它取出來的時候,這個數字它為空了,或者說第一個對象,它不是我們的怪物,可能第一個對象是玩家。

那麼我們可以把這一行取消掉,我們就知道結果了,那麼這裏我們看到一個1252,1252的話,這個應該是玩家的一個對象,可能就是我們自己或者是其他的玩家,所以說它沒有選中,這個時候就能夠傳進來了。

就能夠傳進來,那麼我們在怪物這裏,但是我們有需要,所以說我們當時沒有做一個相應的判斷,在這裏,好的,那麼我們再把上面的代碼再改一下,那麼這個地方,我們就改為1,做測試的時候,當然後面我們在選怪的時候。

肯定要增加相應的一個條件判斷,在騙你這個數值的時候,好的,我們再重新來測試。

掛接出現成,然後我們選中,選中了之後,我們按一下相應的技能,這個時候它就會跑去來攻擊選中的怪物,當然我們選中的怪物來有點遠,好,那麼我們再次選中,看一下,當然這個時候再次選中的話。

我們又是選中的剛才怪物,這個時候另外選了一個怪物,刷新了,死掉的怪物了,沒有在這個地標裏,好,那麼這個時候我們就基本上就解決了,選中了這個女人,那麼如果我們是選中這個怪物的話,再來選中一下。

看看能不能夠正常,選中這個,再按進一下我們的選中按鈕,看選到哪裏去,選中了這個女人,再選中一下,再選中,這個時候它能夠取消這個選項的一個顯示,也能夠選中我們相應的怪物,好的,那麼測試是成功的。

那麼這期我們就講到這裏,那麼下一期看到我們再見。

P150:161-游戏自动登录设计-遍历所有游戏进程-遍历所有游戏窗口 - 教到你会 - BV1DS4y1n7qF

那么这节课呢我们设计呃断线检测的这个代码啊。

也是自动登录呃的一部分,那么首先呢我们是要骗你所有的游戏,窗口啊,那么骗你这个所有的游戏窗口呢,我们可以根据它窗口的这个呃聚品,然后来获得这个进程的i d,然后呢才能够去读取它的一个呃。

就是说在线的一个状态,那么如果按这个数值呃等于-1的话,那么这个时候呢我们实际上就是检测到它的一个掉线状态,那么原理就是这样,那么首先呢我们需要枚举所有的游戏进程,那么我们在之前呢可以枚举,游戏窗口。

那么从游戏的窗口呢,然后呢再得到所有的这个游戏的进程,具体,应该是这样的一个过程啊,好的,那么我们也是打开158克的代码,打开之后呢,我们首先设计一个函数呃。

用来骗离我们所有的这个游戏的窗口,那么为了方便地使用它的这个呃窗口的控件哈这一类的,那么我们把它添加为这个类的一个成员函数,那么这里的话参数呢我们暂时呢呃可以不需要,那么直接呢我们就添加一个这样的函数。

用来了偏离所有的,这个窗口句柄,然后我们在这个成员函数里边呢添加我们的,或者是添加一个全局的变量啊,breakt用来存放我们的,用来存放我们的这个窗口句柄,那么我们在这里呢建立一个结构吧哈可以说是。

那么第一个呢我们这个结构里面呢包含的是游戏的窗口,具体那么第二项的话,我们在这里的包含的是体系的相应的这个进程的p i d,那么最后这一个呢是呃游戏进程的一个剧评,啊。

然后呢我们用这个这个类型来定义一个全局的一个变量啊,这个变量呢我们把它定在定义在这个路里面,这个我们包包含一下这个wink的,想到,咋了,那么定义好了这个数组之后呢,我们就可以来开始偏离。

把相关的这个数据定义到我们的哦,存到我们的这个变量里面去,然后在这个位置的话,我们可以开始骗离我们所有的这个窗口。

那么首先呢我们可以来来查一下mdn呃。

枚举窗口这个函数的,格式和引用的格式我们来看一下,那么首先呢它有一个可以传一个参数进去啊,这个是可以是一个结构指针,那么也可以是其他的任何的一个数据啊,那么这里呢是一个回调函数。

那么我们主要来看一下它回调函数的这个格式,好那么这里呢是它的一个回调函数啊,这里是窗口的一个距离,那么这是传进来的呃,这个参数,那么在这里呢这个参数我们因为呃定义的时候呢,我们定义的不是一个全局变量。

那么所以说要在这个回调函数里面来使用的话,呃我们需要把这个维克等的这个指针呢给它传送传送进去,好的那我们把这个格式好复制一下,那么如果我们就是说按照他的一个说明的话,这个返回值的话也很有讲究啊。

那么如果要继续的枚举后面的这个窗口的话,他的反馈自然必须是一个增值,那么如果要停止啊这个枚举的话,那么它返回的数值呢是一个价值,那么我们一直返回文针就可以了,哈哈哈,然后在这里的话。

我们呢首先呢要把这个传进来的参数呢呃进行一下转换,八,那么这里呢我们要限制它的这个作用域啊,加上s t d的这个前缀啊,因为我们前面的没有使用这个命名啊通道。

那么在这里呢我们需要把后面的这个参数呢跟他进行一下转换,八,那么这样呢我们就把它的这个返回值来,最后写进这个相应的这个结构里面啊,调用的时候呢,我们呢在这里呢呃简单的写一下啊。

那么第一个呢也就是我们的一个窗口的一个距离,你们问的吗,那么第一个呢是窗口的一个回调函数,那么第二个就是我们的这个维克的一个地址,好首先呢我们编译生成一下,好的那么大大致就是这样一个格式哈。

那么这里呢把我们的需要用来保存数据的呃,进程游戏进程的这个剧评啊,还有这个窗口的i d这一类的信息呢,就保存在这个动态数组里面,然后呢到了这里边呢,他用指针的方式呢对这个呃我们的成员变量来进行一个操作。

那么这里呢我们要加上一些判断,那么判断了我们这个剧评,是否是游戏的窗口区,那么如果是游戏窗口的句柄,那么只要保存到这个动态数组里面啊,不会开通的,那么判断的时候呢。

我们可以根据这个游戏窗口的录影名来进行一个判断。

那么当时这个标题的话,我们进入游戏之后呢,我们会更改它,那么所以说在这里的话,我们呢需要得到得到它,它这个游戏窗口的一个对比,绿的名字,我们把它复制下来。

那么要进行判断的话,首先呢我们要取得这个相应句柄的类的一个名字,那么我们先建立一块缓冲区的,哒哒哒,然后取得了之后呢,我们做一个比较啊,在这里,那么这里实际上我们还要做呃,做一个动作啊。

也就是我们需要来对我们传进来的这个动态数组,来先进行一个清空的一个操作,好那么从这个位置开始的话,我们就可以往里面添加我们的这个元素了,那么在添加之前呢,我们需要呢呃定义一个相应的结构。

那么这次呢我们需要取得他的这个进程的p i d,也是叫相应的api函数,啊,当然还有一个是我们进程的一个相关的一个距离,在这里呢我们对它进行一个初始化,相应的启动,打倒,好的,那么我们再次编译生成一下。

好的这样理论上来我们就可以了,嗯获得我们所有这个进程的这个剧评,那么我们在这后面呢写一个偏离的函数呃,来测试一下呃,相应的这个动态数组它是否被我们初始化了,那么我们在这边的啊测试按钮。

我们把它的属性设置为,visable设置为true啊,考件啊,然后我们在这里测试一下,明白,然后我们对这个动态数组来进行一下偏离的输出,它的所有信息,好的,这里是进程句柄,进程的id,进程的聚品啊。

这是我们窗口的句柄,那么我们再次原因深深影响,真的,那么后面的话这个时候呢我们偏离的话呃,他的这个进程数组呢相当于是为空的,那么在这里呢我们先自动的登录一下,那,好的。

那么这个时候呢我们可以来测试一下我们进程的相关信息,对了我们还少写了一段代码啊,造成了我们的这个呃片也没有成功嗯,因为我们在之前的,这个每一局的这个呃回调函数里边呢。

我们需要把这个相关的元素呢需要添加到我们的动态数组里面,还差这么一步,这个,那么在这里的话我们应当是用来获取这个呃窗口的这个录屏。

而不是获取它的一个标题名,那么所以说刚才这里呢它造成了一个比较的失败啊。

因为习惯性的啊失去嗯,我们习惯性的呢容易去取这个进程到这里,这个游戏窗口的这个标题好,那么这个时候呢我们的进程句柄就出来了,那么我们可以一起转到里面来看一下,这次的它的这个p i d,我们把它排一下序。

一个是529885928这个,那么另外一个呢是3404盘,这是我们的游戏的这个进程,当然这个句柄的话它是随机的啊,实际上我们打开之后呢,它就可以用啊,它在内核里边啊创建了相应的这个呃真实的句柄。

那么这里呢相当于是他的一个具体的一个在内核里面的一个索引啊,这一类的,那么游戏的这是游戏的一个窗口的一个区别啊,因为后面的取得的这个数据都是正确的话,那么这里肯定也是正确的。

那么我们还可以呢呃取得它的一个标题哈,添加到里面去,那么标题呢也就是他账号的这个名字,那么实际上这里我们还可以来继续的话添加一段信息,转到相应的头文件里面啊,在这里呢我们再增加一段信息。

因为这个游戏窗口的标题的话,我们已经改动了很多时候啊,很多时候呢这个游戏窗口标题的按照我们写的思路的话,它就是一个呃游戏的一个账号,来到了,好的,那么我们再次生成一下,同时我们在偏离的时候呢。

代码呢我们打印的信息呢也增加一个游戏的标题,哈哈哈哈。

啊那么这个时候呢他账号的兴起呢也会显示出来啊,相应的这个标题,当然这个有多个窗口的时候呢,肯定它也可以了,嗯,进行相应的一个偏离,那么比如说我们再一次打开一个窗口,因为这个时候多开哈。

只能从这里面来打开一个窗口,好的,那么其他的呢我们就不做过多的这个测试了。

它大致的原理呢都是这样,现在的话相当于我们就已经获得了这个进程的一个,呃相应的一个相关的一个信息,我们所要的啊进程句柄这一类的,那么下一节课呢我们再来骗你读取所有进程的这个在线的一个状态。

那么这节课呢我们就到这里。

好的。

P151:162-游戏自动登录设计-监视游戏进程状态 - 教到你会 - BV1DS4y1n7qF

大家好,我是郁金香老师,这节课呢我们嗯继续编写相关的代码呃,读出了我们游戏的一个在线状态,以及其他的一些呃相关的信息呢,我们都可以来呃读取到我们的这个结构里面,那么在这里呢我们再次来修改一下这个结构啊。

等会我们直接在代码里边呢进行一个修改,那么首先呢我们打开161克的代码。

哈哈哈哈,在这里呢我们为了方便管理呢,可以把这个机子的图文件呢把它添加进来,然后我们移到资源选项卡,测试这个位置,我们修改的代码的话,主要是在这个回调函数里面修改,那么在修改之前呢。

我们需要先修改一下这个结构啊,游戏进程信息的这个结构,那么我们可以直接转到这个头文件里边来修改,在这里的话,我们另外的建建一个布尔类型的变量,或者是一个呃d word 4字节的一个变量。

用来存放这个套接字啊,游戏里边的,那么也就是一个在线状态啊,实际上也是,啊然后呢我们在后边呢还可以呢呃显示一些其他的信息,比如说我们游戏的这个人物,角色的这个名字,这些呢我们都可以把它读出来啊。

那么人物角色的话最多32级,20多个字节来应该就够了,一般来说的话它支持呃五六个汉字的一个位置,那么所以说这里的话32个自己足够用了,我这角色一次,当然其他的信息如果有用的着的呢,也可以读取啊。

比如说血量啊这些啊,人物的一个死亡状态啊,这些呢我们都可以的把它读取出来啊,这个看领域程序了,怎么设计好的,那么这里呢只是举个例子啊,那么细节上的呢自己去实现一下,那么定义了这两个标志之后呢。

我们可以来借助了在它的弧调函数里面来进行一个修改,获取游戏标题之后呢,我们就可以了,在这里呢读取游戏啊,在线状态,然后来读题游戏冷落角色的手,那么前面我们已经有了这个进程的句柄。

在这个位置呢我们可以直接用the real process慢慢来来读取,那么第一个位置的话,这里呢就是它的一个机子,首先呢我们需要把它转换成一个指针,bicycon s的代替啊。

这个然后呢我们需要建立一个缓冲区来读取啊,这个指针在这里呢,我们在前面哈进行了一个d word类型的来读取这个尺寸,那么另外再建一个变量来读取它的一个数据,那么读取的都是四个字节在这里。

那么后边呢我们不需要和他实际读取的这个字节呢,我们不需要啊,直接就省略掉,然后呢我们再次读取,那么这个指针读出来之后,我们需要再次加上一个偏移来读取,哈哈哈。

因为它的这个偏移加上16进制的一零才是最终我们套接字的呃,这个地址,那么我们读出这个套接字的内容啊,这个时候,那么我们先编译一下,看有没有错误,那么有错误的话,我们及时来排除这个错误。

好那么这样的话如果是正常的情况下呢,我们就能够把对了,我们还需要一个缓冲区啊,在这里第八分,那么读出来之后呢,我们就可以如果是正常的情况下,我们可以直接来把这个数字来写到我们的这个标题里面去。

呃但是为了方便啊,就是说这里的设计的话呃为了一个可读性呢,我们最好的是呃我建议把这个地方呢把它设设置为一个布尔类型,我们都知道布尔类型的话就就是一个零和一个非零的一个状态,那么零的话就表示呃不在线。

那么在线的话就是一个非零的一个状态啊,但是这样设计的话,但是我们游戏里面呢它掉线的时候呢是-1,那么所以说在这里的话,我们还需要转换一下,那么如果这个buff的值,那么等于-1的情况下呢。

我们把它设置为一个掉线,知道知道你打的,那么这个变量命名的时候呢,nd来表示呢,它实际上还是一个四字节类型的啊,只是说变量的名字啊,类型在定义的时候定义的布尔类型,那么实际上这个大的这个不行呢。

它实际上同样的是一个整数,它的空间呢同样是四个字节的,那么在这里呢我们把它复制为呃掉线的情况呢,在线状态呢就只为fx,那么其他的这个情况,那么我们就可以不管他啊。

嗯直接的应该是复制为这个读取出来的这个八分,啊读取出来的好介词,好那么这样的话我们就能够正常的把在线状态来读取出来,那么另外我们还可以读取其他的信息。

那么这里呢我以这个游戏里边啊人物角色的这个名字来为例为例,来说明一下哈,读取其他数据的情况,那么人物角色的话,我们这里呢不是我不确定,然后呢我们也也是读取它的机制指针,读取出来之后呃,他的这个偏移的话。

在一八这个位置,名字的这个偏移,但是这里的话呃缓冲区的话,我们用这个四字节的显示是不够的,那么我们直接来把这个人物角色的啊名字的这个缓冲区来个map,32个字节的这个数据来跟它传送进进去。

当然这里呢肯定就是读取32个字节,那么可也可以用三个of来表达,因为我们在这里的话,为什么不去判断这个游戏里面的这个人物名的长短啊,因为这是完全是没有必要的,我们可以直接的尽可能多的读取这个字节啊。

几十个字节,20个字节实际上也是足够了啊,因为在读取的这个字串里面呢,它自动的就有这个字串的一个结束标志,所以说这个多读一点这个缓冲区数据出来了也是没有问题的,好那么这样的话我们就完成了。

我们注意一定要在这个啊put it back之前来读取这些信息,如果这个在后面去的话,他就加不进去好,那么读取成功之后呢,我们在测试的时候呢,可以呢把这些信息呢把它打印出来,那么嗯在线状态。

还有就是一个人物的一个名字,那么就是这两项啊,首先呢我们生成一下啊,编译生成,那么接下来的话我们就可以进行相关的测试。

那么首先呢我们自动登录一下,那么自动登录的这个过程有点慢啊,我就把这段过程呢先把它屏蔽掉啊,等它正常的登录之后,那么我们再来做一个测试,好的,那么登录成功之后呢,我们来读取一下啊相关的这个信息。

那么这个时候的话我们在线的状态啊,实际上它也出来了,但是呢这里呢我们是用十进制来显示的,我们还可以把它改一下啊,在线的状态呢我们用16进制来显示一下。

啊实际上这个呢就是我们的套接字的一个句柄,这是窗口的句柄进程的这些我们都可以在里面可以看一下,31366912哈,说明我们所有读取的这个信息呢都是正确的,那么我们再来测试一下啊,掉线状态下的啊。

这个检测看它能否检测到,当然也可以,你可以把这个网网线来把它拔掉啊,或者是路由器关掉,再来做这个相关的这个测试好,那么这个时候呢已经显示了呃。

断开,我们注意这里要调试信息,那么这个时候在线状态的话,就是您啊也就表示了啊,没有没有在线嗯好的,那么这节课的代码编写呢,我们就到这个地方嗯,那么下一节课呢我们再见,那么同时还有一个问题。

自动登录这里呢,我们会卡这个窗口啊,不能够操作这个窗口,我们可以来啊,把这个函数来放到我们的线程的原因啊,这样呢它就会卡这个窗口啊,那么这个呢大家自己下去完成一下,用这个cp se。

那么用这个函数去创建一个独立的线程,那么它就不会被影响到我们这个窗口的这个界面啊,也就不会有这个呃呃卡掉啊,窗口界面的这个这个动作好的,那么这节课呢我们就到这里。

P152:163-游戏自动登录设计-断线重连设计OffLineReLogin - 教到你会 - BV1DS4y1n7qF

大家好,我是郁金香老师,这节课我们编写断线重连的代码,那么打开了162克的代码,那么首先我们转到内里边添加相关的这个函数。

那么或者我们自己手动的转到投影键里面去添加我们的函数,然后添加我们的函数,那么我们现在可以看到我们的函数都已经添加在内了,我们现在可以看到我们的函数都已经添加在内了。

那么我们现在可以看到我们的函数都已经添加在内了,我们现在可以看到我们的函数都已经添加在内了,那么我们现在可以看到我们的函数都已经添加在内了,那么我们现在可以看到我们的函数都已经添加在内了。

那么我们现在可以看到我们的函数都已经添加在内了,那么我们现在可以看到我们的函数都已经添加在内了,那么我们现在可以看到我们的函数都已经添加在内了,那么我们现在可以看到我们的函数都已经添加在内了。

那么我们现在可以看到我们的函数都已经添加在内了,那么我们现在可以看到我们的函数都已经添加在内了,那么我们现在可以看到我们的函数都已经添加在内了,那么我们现在可以看到我们的函数都已经添加在内了。

那么我们现在可以看到我们的函数都已经添加在内了,那么我们现在可以看到我们的函数都已经添加在内了,那么我们现在可以看到我们的函数都已经添加在内了,那么我们现在可以看到我们的函数都已经添加在内了。

那么首先我们要检测看游戏是否断线,那么首先我们要检测看游戏是否断线,那么首先我们要检测看游戏是否断线,那么在检测的时候,我们首先要对相应的动态数据断线进程数据相关的数据进行初始化。

我们首先要对相应的动态数据断线进程数据相关的数据进行初始化,我们首先要对相应的动态数据断线进程数据相关的数据进行初始化,我们首先要对相应的动态数据断线进程数据相关的数据进行初始化,进行一个初始化。

(音量注意),(音量注意),那么初始化这个数据之后,我们就可以开始遍离相关的一个数据,当然我们还有另外的一种写法,我们就是直接在回调函数里面去改它,那么也是可以的,这一种方法。

但是这里我们把它分开的处理,这样的设计我个人觉得可能要好一点,那么这个时候开始遍离我们的进程信息,那么找出断线的掉线的进程,(音量注意),(音量注意),(音量注意),(音量注意),(音量注意)。

(音量注意),(音量注意),(音量注意),(音量注意),(音量注意),那么加上标准库的程序,(音量注意),(音量注意),(音量注意),那么遍离的时候我们就判断一下,看是某个进程有掉线的一个情况。

(音量注意),那么如果他不在线的话,也就是掉线,(音量注意),(音量注意),(音量注意),(音量注意),那么如果是掉线的情况,这里我们就进行一个掉线的处理,就重新连接相应的。

重新登录我们相应的账号和密码,那么我们实际上在这里边的话,我们已经保存了他的账号和密码,在这个结构里边我们可以直接用,那么游戏标题这里,实际上就是他的游戏账号,当然我们也可以。

当然这个是通过取得这个标题来获得,他的这个账号,那么另外我们也可以读取这个内存,来获取这个游戏的账号,那么我们有了这个账号之后,再去查询这个表格里边的相应的密码,那么我们就可以实现他的一个登录。

那么暂时我们就用这个SizeK不行了,来充当我们的账号,他本来也是账号,现在这个时候,好,那么我们再倒回来,在这里的话,我们就是查询整个表,那么之前的话我们有一个表,VTUidetab。

那么我们需要骗你这个表去找到账号的,所在的相应的用户信息,所以说我们还要进行一次骗你,那么这个时候,我们主要是用来获取我们用户的一个登录的一个信息,(音樂),(遊戲畫面),(遊戲畫面),好的。

我們先編譯生成一下,看一下代碼有沒有錯誤,如果沒有錯誤的話,我們在這裡就取出它的標題,與我們的用戶名做一個比較,這是我們的用戶名,另外我們的用戶信息裏面的,我們需要它帳號的一個登錄名字。

User Name,這兩個名字實際上如果是相同的話,那麼我們就查找到所要的登錄信息了,那麼重新登錄的時候,我們還需要關掉,首先我們要結束掉這個調線的進程,一個Telemetry進程,之前也有用。

在前邊的時候,(遊戲畫面),(遊戲畫面),首先這裡是進程的一個劇本,然後我們這裡退出的代碼,隨便傳一個整數進去就可以了,表示是我們結束的,那麼結束掉進程之後,那麼這裡我們可以有一個等待的時間。

所以一秒鐘左右的一個等待時間,應該是足夠了,那麼結束掉進程之後,我們就可以開始重新的登錄,我們看一下我們的Login,我們可以把自動登錄裏面的代碼,複製一部分過來,應該是批量登錄裏面的代碼。

複製一部分過來,(遊戲畫面),(遊戲畫面),那麼我們在頭文件裏面找一下,這個函數名我忘記了,看一下批量登錄的代碼,那麼我們把這段代碼把它複製一下,在這段代碼的基礎上我們進行一下修改。

當然這個地方我們就不用相應的Forge,我們就用不著,只需要對這個數據進行一下LogData,進行一下填充,然後這裏我們也不需要它的一個下標,我們直接替換成我們找到的這個指針,好,那麼這個指針替換之後。

我們就可以在這裏嘗試我們的重新登錄,(遊戲畫面),我們再來看一下相應的邏輯,然後我們可以把它單獨的放在一個定時器裏面,或者是把它放在一個現成裏面,開啟一個單獨的現成,仿佛的檢測。

然後我們肯定也需要在設計的時候,也需要進行一個時間間隔,比如說10分鐘或者是20分鐘左右,我們來檢測一次,這個時間的話可能就差不多,那麼我們再重新編譯申請一下,(遊戲畫面),然後我們開始來測試一下。

調現好重新登錄的這個函數,(遊戲畫面)。

好的,那麼我們先自動的登錄兩個遊戲,方便我們做測試,那麼遊戲登錄之後,這個時候我們讓它調現,(遊戲畫面),那麼再讓它重新連接上,再次的我們這個時候我們才開始測試。

(遊戲畫面),那麼我們還需要這個代碼還需要一點改動,(遊戲畫面),到最後,那麼這裏我們重新登錄了之後,登錄完成之後,我們應當還是有一段等待的時間,再進行接下來的一個檢測,當然這個時候。

因為我們很多地方都掉了一個Sleep,那麼所以說它這個現成在這裏是一個主賽的一個模式,在運行相當於,那麼我們的窗口的話,它也會夾死,好的,我們先做一下測試,因為這個Word Login裏面。

它本身有這個延遲相關的判斷。

那麼我們應該可以直接這樣用,先做測試,(遊戲畫面),那麼這個時候我們發現有一個掉線的已經被檢測到了,那麼它嘗試了去重新登錄它,但是這個時候我們發現了,它不會正常的去輸入我們的賬號和密碼,(遊戲畫面)。

那麼我們再次測試一下,那麼好像是在某個位置來卡住了,它未檢測到我們的客服端,好的,那麼我們再重新來一下,(遊戲畫面)。

那麼剛才這個界面的話,應當是它沒有檢測到我們的服務端,而且這個時候它還會重新的登錄一次,如果我們是循環的檢測的話,(遊戲畫面)。

這個時候應當是我們登錄失敗了,那麼我們大致來這幾個我們先設計在這裏,那麼關於這個代碼的完善,我們在下一集看,我們再具體的來完善它相關的代碼,好的。

那麼我們這節課我們暫時就到這裏,下一節課再見。

P153:164-游戏自动登录设计-解决路径冲突问题 - 教到你会 - BV1DS4y1n7qF

大家好,我是郁吉翔老師,這期我們繼續自動登錄的設計,主要是解決斷線之後重新連接的時候,有一個路徑,重複的衝突,我們舉一個例子,因為在這裡我們確保了一些不同的路徑,來登錄我們的遊戲。

那麼這樣才能夠最終的實現一個多開,那麼如果我們的帳號不同的帳號,他在登錄的時候,選擇了一個同樣路徑的客戶端的話,那麼他在啟動的時候,就肯定是不能夠正常登錄的,因為他就不能夠繞過相關的一個檢測。

那麼這個時候我們就需要先檢測一下,指定的相應的編號我們有沒有使用,那麼另外的一種方式,我們也可以檢查路徑,是否在我們的進程列表裡面已經存在了,相應的客戶端他已經運行了,那麼這種思路都是可以的。

那麼今天我講一下,我來解決衝突的一個辦法,那麼首先我們也要重要的是用到一個API,函數,GetMode、FindLane、EX這個函數。

那麼我們先來說一下這個函數的功能,那麼它需要一個進程的一個劇本,那麼第二個是一個模塊的劇本,這個是返回的一個進程的全幕禁名,包含它的進程的EXE,那麼這個是緩衝區的大小,前面這個緩衝區。

這兩個都是與我們的返回值相關的,那麼當我們第二個劇本它為空的時候,我們返回的也就是進程的EXE的路徑,那麼如果我們第二個模塊是動態鏈接庫,這一類的一個劇本的話,那麼返回的就是某個動態鏈接庫。

模塊的一個路徑,那麼這裡當然我們是要組程序的,所以說第二個這個參數我們就為空。

這就是它的一個調用的形式,那麼調用之前我們需要給它分配一塊,緩衝區,支付串流用來存放進程的路徑,然後最後這個是它緩衝區的大小,那麼我們先來認識一下這個函數,等會我們再來編寫相應的函數。

用來獲取一個可用的進程的一個索引ID,比如說這裡的是3,這幾個路徑我們舉個例子,這幾個路徑在我們的進程當中都已經運行,那麼我們就可以來從1到255這樣進行遍領,或者說從1到我們的多開的一個上限。

比如說我們最多用品多開20個,那麼我們就從這裡1到20來做一個判斷,看它相應的索引在我們的進程裡面有沒有打開,那麼比如說我們檢查這個進程之後,我們從1開始檢測,那麼1這個存在,那麼我們跳過再檢查2。

那麼檢查2的時候,我們發現了,與這後面的這些所有進行了一個查詢比較之後,我們發現這個所有可以用,那麼我們就用這個路徑來啟動我們的一個遊戲的一個客服端,大概就是這樣的一個思路,好的。

那麼我們來看一下相應的代碼,那麼這個代碼的設計的話,同樣的是每一局窗口,那麼每一局窗口之後,我們將獲得在這裡來設計了一個動態訴訟的表,那麼這個表就用來獲取已經運行的,這裡是已經運行的這個索引值。

或者是已經運行的路徑,那麼我指的索引值的話,就是這裡的01,這裡的03,這裡的06,06,就是我們的這個索引值,那麼我們先把163個的代碼打開一下,在他的基礎上,我們來進行測試。

比如說現在這裡還運行了兩個01和02,這兩個賬號,那麼我們可以在這裡或者是上面進行測試都是可以的,那麼我們選擇上面一個按鈕進行測試,那麼在測試的時候,我們在這裡編輯了兩個相應的函數。

那麼一個就是用來獲取它的一個反覆一個可用的一個索引號,01,02,03這一類的一個外天籠型的一個索引號,那麼我們先把它複製進來,到最後,當然這個因為是你的內的一個成員函數。

我們在解決方案裡面找到相應的頭文件,添加他的一個說明,這樣我們編譯的話,他不能夠通過的,因為還涉及到一個他的回調函數,那麼這個回調函數,我們還需要給他寫好,這前面就是我們寫的回調函數。

那麼首先我們VD index動態,數據已經運行了一個索引值,是用來存放返回的數值的,這裡建了之後,他本身並沒有數值,那麼在這裡,他的回調函數的時候,我們作為一個參數,把它的指針地址傳送進去。

然後在回調函數裡面,我們對他進行相應的操作,當然我們還要做一點,這個函數的話,現在他不能夠認識他的,那麼我們也需要包含相應的一個頭文件,我相應的這個Apple庫的一個支持。

那麼把這一段兩句代碼加到我們的頭部,好的,那麼我們再次編輯申請一下,那麼我們再來看一下我們剛才的代碼,應當是說到這裡,那麼首先我們在這裡是轉換它的一個類型。

把它轉換成我們Wikipedia動態數據的類型,然後這裡是用一個指針來指向他,那麼等會我們在這後邊計算出相應的數值之後,那麼我們再把這裡已經運行的索引,添加到,那麼這裡我們把相應的這個數據添加到裡面來。

那麼我們來看一下,那麼取得索引號的一個過程,那麼首先我們也要判斷,在沒取窗口的時候,我們要判斷,通過他的內的一個名字,這裡是取得我們指定窗口取的內名,那麼取得窗口的內名之後。

我們保存到我們這個Size Class內裡面,然後與我們的遊戲的窗口論明做比較,那麼如果比較它這裡相等的話,這是0%,那麼就會執行到這個位置,執行到這個位置之後,表明它肯定就是我們的遊戲的窗口。

那麼我們可以通過遊戲窗口的這個劇本,獲得進程的PID,然後再獲得進程的劇品,那麼獲得進程劇品之後,我們再調用這個Get Modify Name,那麼就能夠獲得進程的路徑。

那麼我們可以在這裡把進程的路徑打印出來看一下,那麼我們就從這個位置來載斷之後,我們看一下,那麼從這裡返回之後,讓他繼續片面,我們看一下他執行的一個結果,測試,那麼測試的時候,我們需要調一下這個函數。

那麼我們就把這個函數調到這個位置上,然後我們可以進入這個遊戲的畫面,那麼我們可以在這裡進入這個畫面,然後我們可以進入這個畫面之後,我們可以辨認這個畫面是否正確的,那麼我們進入這個畫面之後。

我們可以看到這個畫面的設定是正確的,那麼我們可以進入這個畫面之後,我們可以看到這個畫面的設定是正確的,那麼我們可以進入這個畫面之後,那麼顯示一下相應的按鈕,那麼我們可以看到這個時候獲得的進程路徑的話。

他就是我們的完整的一個進程路徑,但是我們注意這裡是大寫的,這裡是小寫的,那麼這個路徑裏面的話,他可能有一個大小寫的一個區別,那麼現在我們就是要搜索路徑裏面的取得這兩個字符串。

那麼取得之後再把它轉化成一個整數,那麼這樣就能夠得到我們已經在運行當中的一個索引號,就是要取得這兩個數字把字符串轉換成整數,那麼我們可以在編寫代碼的時候,我們繼續來看一下,那麼我們把這一句給它除掉。

繼續看後面的代碼,那麼後面的代碼,因為我們路徑裏面可能有大寫,可能有小寫,那麼我們先從字符串,你停這個位置到他最長的這個String的位置,我們進行一個什麼大小寫的一個轉換。

那麼我們看一下大小寫轉換之後的一個情況,那麼從這裡,同時我們在後面這個位置再次反映一下相應的字串,那麼我們可以看到,那麼下邊這一行的話,全部都是大寫的,那麼這樣的話就便於我們一會兒的字符串的一個搜索。

那麼我們要搜索的字符串就是CLIE,那麼這個字串,那麼這個時候馬上我們就可以調用一個搜索字串的函數,查找我們的CLIE,那麼就用這個str str來查找這個字串,查找之後,他將定位到這個位置。

也就是他會指向後面這一個字串,但是同樣不是我們所要的,那麼如果我們查找成功,他不為空的話,將執行到最後面這個位置,那麼我們看到CLIE,他佔了四個字節,所以說我們讓這個字加4,往後移。

那麼加4的話就指向了0這個位置,01,或者是00這個位置,那麼到了這個位置之後,我們就可以用我們的A2I,把字串轉換成我們的整數,好的,那麼我們再來看一下轉換成整數之後的情況。

那麼這個時候我們就可以直接運行,再測試,那麼我們可以看到這是轉換成整數之後的一個情況,那麼這前面是這個Number用16進制來格式化的,後面這個是字串,這是字串,我們看兩個的輸出的話,實際上是一致的。

當然我們也可以使用進制,那麼所以說我們取得的我們運行當中縮影的話,他已經成功了,那麼已經成功了之後,我們還要什麼,還要計算一下要取得一個什麼,要取得一個,要取得一個未使用的,ID。

然後返回供我們的登錄函數來使用,那麼所謂說我們動態輸出成功的取得初始化之後,那麼是在這個位置,我們不斷的添加了已經運行的縮影號,那麼所以說我們這個時候需要自己計算出一個縮影號,那麼這個縮影號。

他沒有在我們的進程當中運行過,那麼這個時候,我們可以從0到16來騙你,當然你也可以設為25,或者0xff都可以,那麼也可以設大一點,也可以設小一點,反正就是得多開的上限,你想多少開的時候。

這裡就設置多大,一般來說這個遊戲的話,10開左右可能就幾十開,這個內存數都大的情況下,內存數大的話,那麼像我的電腦的話,可能最多能夠開十多個號,那麼在這裡我們做測試用的話,就設為20就可以了。

或者你要設大一點也是可以的,那麼我們去騙你,他就設為60,那麼我們就從0到59進行一個騙你,這裡因為一個等號就是到60,那麼我們騙你的時候,我們就到這個數據裡面去找,我們編號在裏面是否已經運行。

那麼運行的話,我們動態訴訟裏面相應的元素,那麼取出來,他肯定就有一個與我們當前查詢的,這個相等,那麼如果是相等的話,這裡我們就break,break就會執行到這個地方,那麼這個地方,我們就要判斷判斷他。

這裡是就是說是由於break來退出的,還是由於我們的這個運行完之後,再退出的,那麼如果是他整個剖循環都騙你完成了,那麼這個界在上面這個界,在我們的動態訴訟裏面,他不存在,那麼就像我們這裡有1和2。

這兩個所以已經使用了,那麼如果我們在裏執行到1和2的時候,他直接就會從這個地方,就可能就退出了,在裏面找到了他的一個數字,但是找到的時候,這裡應該說大於,這裡應該是,大於等於的是,都應該是反過一個針子。

那麼也就是說這個循環完了之後,那麼完了之後的話,我們都沒有找到的話,那麼證明這個I的這個數值的話就是可用的,就是可用的,那麼如果我們在這裡,他提前退出了,比如說他本身的數值這兩個的話。

這裡應該是他的大小應該是為2,那麼為2的時候的話,那麼他會查詢到1的時候,1和2的時候,他實際上都能夠查詢到在裏面查詢到這個數字,從這裏他會退出,然後我們到這裏來,就是說0和1的時候,他應該會退出。

在這裏的話,因為他借的值來等於0或者是1,那麼他就不大於這個2,那麼說在這裏的話,他始終不會被執行到,那麼只有這個數值借的數值等於2的時候,也就是說他的下標是第三個下標為2的時候。

那麼我們繼續在裏面來查詢這個數字2,那麼數字2的話,因為他裏面這個數字實際上只包含了0和1,我們在這裏能夠看到他的下標只包含0和1,那麼所以說2這個下標的話,他在裏面都查詢不到,查詢不到了。

這句代碼一直不會被執行,所以說這裏比較完了之後,他的值等於我們size的時候的話,他依然沒有查詢到,那麼所以說他會退出這個循環,會執行到這裏,這個時候就會返回一個可用的一個索引。

那麼我們把它也打印出來看一下,看一下他的一個返回時間,好的,那麼我們再次生存一下,測試一下,那麼我們發現的話,他已經使用的這個索引號有01001,但是可以使用的最小的數字的話就是02。

他肯定是返回最小的一個,那麼實際上可用的話,還有0304 0506,那麼這些索引的話都可以用,但是我們要根據我們的這個遊戲進程的目錄來。

那麼如果我們建的過多的話,他會影響我們的硬盤,因為我們每一個目錄的話都有幾十兆,好的。

那麼這節可能我們暫時就到這裏,那麼下一節可能我們還要解決其他的一些問題,比如說我們的遊戲的客服端進程,他異常的退出了,我們要做這一類的檢測,那麼異常退出的話,我們也要重新登錄,要遍離這個表。

那麼遍離這個表,比如說我們檢測到這個帳號,他所在的這個進程的話已經被關閉了,或者異常的退出了,那麼我們也需要重新登錄這個帳號,好的。

那麼我們下一節再見,當然還有一些值得優化的一個地方,那麼比如說我們在測試的時候來發現,我們在登錄的時候看一下,在PIN上登錄的時候,我們最後如果他是帳號重新登錄的話,他也會斷開鏈接。

那麼可能他就會異常的退出,那麼異常的退出之後,我們在這個位置的時候,那麼在讀取人物信息的時候,在這裏是60,那麼這裏是2000,足足要等待兩分鐘的時間了,他才能夠退出,但是這個時候可能進程他已經退出了。

所以說他始終不可能讀到人物信息的,那麼我們可以在這個位置編輯優化的函數,檢測,那麼如果指定的進程,我們通過這個劇本去判斷他,如果他都沒有,已經沒有運行的話,那麼我們就可以來什麼,就可以退出了。

就可以直接的退出這個區塊,那麼我們可以給寫個函數,可以寫一個函數,那麼也可以通過這個ReaderProcess Memory,他的返回值來做一個判斷,那麼如果他是讀取不成功的話,他的返回值將會是0。

好像,我們可以查詢一下,看一下他的一個返回值,那麼如果這個函數成功的話,他返回來是一個非0的值,那麼失敗的話,就是返回一個0值,所以說我們只需要判斷他的一個返回值就可以了,如果讀取失敗的話。

直接我們就退出這個循環,不用再等待了,那麼我們也可以寫出這個函數的信息,那麼可能更方便判斷一些,好的,那麼我們下一節課再討論這一類的問題,那麼這節課我們暫時就到這裡,下一節課再見,對了。

我們還有一個地方可以改進的,再退回,那麼我們剛才已經寫了這個函數,那麼寫了這個函數的話,我們在批量登錄的時候,我們就應該要用,Votanlog,那麼這裡我們就需要改,我們需要把我們計算的可用的數字。

把它替換掉這個NP index,這兩行我們就需要注釋掉,因為這個值不是像這樣來,累加計算的話很容易做錯,很容易就是說造成登錄的失敗,那麼我們把這個值提到它的前邊,作為一個參數,傳送性的,好的。

那麼我們看什麼地方調用到了這個數值,那麼在這裡的時候,我們就直接的每次來可以用我們的,getty,剛才我們寫的這個函數叫什麼名字,我們看一下,那麼就可以直接用這個來返回一個,鎖引值,來檢測一下。

那麼這樣的話就可以避免相應的問題,當然我們還需要了把這個做一個前置的,一個說明,看一下,這個不是我們的綠成員函數,賬號平台登錄的,那麼我們還需要來把它也寫成綠成員函數,才能夠訪問我們的綠。

那麼在投文件裡面,加一下,還有一個地方,好的,那麼這樣的話就不會有我們的一個,就解決了一個路徑的一個衝突,好的,那麼我們下一節課再見,嗯,请不吝点赞 订阅 转发 打赏支持明镜与点点栏目。

请不吝点赞 订阅 转发 打赏支持明镜与点点栏目,请不吝点赞 订阅 转发 打赏支持明镜与点点栏目,请不吝点赞 订阅 转发 打赏支持明镜与点点栏目。

P154:165-游戏自动登录设计-完善掉线重连功能-进程退出检测 - 教到你会 - BV1DS4y1n7qF

大家好,我是徐吉祥老师,那么这节课我们继续完善掉线重连的功能,那么这节课呢我们主要增加一个对已经登陆的这个账号的进程,它的一个异常退出的一个检测啊,那么首先呢我们打开165克,160 64克的代码。

那么首先呢我们找到啊离线登录的这个函数,那么我们也把它的功能呢加在这里边,那么之前呢我们是找出来他已经登录之后,这个进程呢它本身呢是在运行的啊,呃就是说他已经掉下啊这种情况的一个检测。

那么另外还有一种情况呢,就是这个呃进程呢他就是说已经由于某种原因,可能是由于我们手动的,那么可能也是由于登录的时候呢,他异常的已经在退出了这个登录账号的进程呢,它已经不存在了。

那么也就是说我们指定的账号,我指定的这个账户呢为正常的登陆,那么也可能与这种情况呢也是瑞士的,那么所以说这种账号的话,它没有正常的登录了,我们需要重新的跟他登录一下。

那么所以说我们需要来写一段代码来进行一个检测,那么这是之前的一个离线的一个检测,掉线啊,检测结束,那么这里呢我们检测为正常登录的这个账号,那么也可以这样的理解,或者是已经异常退出的这个进程。

那么我们来看一下它相关的代码,那么在这里呢我们首先呢第一个相应的呃,这个数组变量用来保存一个呃指定账号的一个运行的一个状态,那么如果指定的账号它已经正常的就是说登录了啊,不管它是掉线还是未掉线。

只要他是正常的啊,这个账号登录之后呢,只要这个进程还在运行,那么我们在这里呢这个数组里面呢,我们就给他啊,是一个增值啊,那么如果这个账号呢他没有指定的呃进程在运行,也就是说它未正常的登录了。

那么我们给它起一个假设嗯,好的,那么首先呢我们是依次来骗离我们需要登录的这个账号的数据,那么这个账号数组呢,比如说我们先从这个里面的账号一啊,那么取出来之后,我们保存到这个指针里边。

然后呢我们把这个指针里面的这个user类啊取出来,与我们这里的啊,重新的就是说已经在运行当中的这个进程账号来进行一个比较,那么如果整个这个循环,整个在运行当中的这个账号呢,我们都查找遍了。

都没有找到我们需要登陆的这个账号的话,那么说明这个账号呢他已经呢就是说呃异常退出了,或者说这个账号呢为正常的登录,那么如果找到了哈,在里面呢,我们这里呢正常登录的,那么我们做一个啊正常登录的一个标记。

那么等这两个循环完成之后呢,那么所有正常登录的这个账号的话,我们来都会在这个数组里面呢有一个对应的一个标记,那么接下来才是最关键的一个地方,接下来我们再次用一个循环,来检测这个标记数组。

那么这个标记数组呢我们呢主要是还有一个下标的一个限制,它的一个限制的话,就是我们的这个需要登录的这个账号的数组的一个大小啊,这里的一个size啊,零到size,注意这里不能加等号啊。

因为它的下标是从零开始,我是从一开始的,那么这样我们去偏离它,那么如果他指定的账号,他,未在线,或者说这里呢我们,等于fx,那么也就是说不在线这个条件未正常登录,哒哒哒哒哒,那么或者说另外一种说法呢。

就是说登录的这个账号信息的啊,这个进程呢以及异常退出相应进程,啊相应的包含了这个账号信息的进程呢已经异常退出,当然这里边取出来的呢,我们做了这个比较之后呢,他能够得到一个相应的呃数组的一个下标啊。

就是之前的,那么这个下标就是我们之前,实际上这里呢我们没有保存它的一个下标啊,就是我们在骗你的时候,他指定的这个账号的一个下标,但是这个下标呢我们可以通过这里的一个判断呢重新把它取出来。

当然我们也可以在这里设计的时候呢,直接保存相应的这个下标也是可以的,但是我们不用多此一举,那么直接在这里呢它等于fs的时候,就说明了它相应的这个账号呢已经异常退出了,那么遇到这种情况的话。

我们相应的账号呢就需要啊看这个接下标,我们直接就把这个用下标的表示方法,来取出这个动态数组的相应的这个元素,把它的分区账号密码啊重新取出来,存放到这个logo det里面。

然后呢我们重新的进行一下登录的一个链接啊,那么这里呢我们也需要改一下哈,嗯上一节课我们已经流血啊,bpm dex好用这个函数来改一下,那么我们这里呢也需要来获得一个可用的一个客户端的一个路径。

所以说这需要改,好的,然后呢,我们保存一下,重新生成,那么还有一个地方呢我们也可以做一个更改,那么上一节课呢我们呃说到了这个有一个指定进程,如果他已经结束了哈,那么呢我们就不需要再去等待。

那么这里呢我们另外写了一个函数,用来判断我们的游戏进程呢呃是否正常的在运行,那么它的原理呢也就是去读取我们的这个窗口句柄,那么如果读取的这个数值啊,它返回值为零的话。

那么说说明的话就是说这个指定的进程呢已经关闭了,那么如果读返回的数字是非礼,那么当然了,我们就是那个游戏进程了,他正常的运行,当然我们也可以加上后面这段代码啊,他可以的呃。

更详细的给出一些这个错误信息好,那我们就把它先放到前边,那么这一段呢是可要可不要的啊,也可以把这段注释来取消掉,也是可以的啊,那么在这里的话。

12b呢他表示了实际上就是这个windos的他只完成了一部分啊,那么另外一种你x6 的话就表示我们的呃传传送的这个剧本的话,它是一个啊五个效的一个句柄啊,那么这两种情况的话。

我们都返回这个fans都直接返回就行了啊,但是这个显得有一点多余啊,那么只是呢我们这样呢可以了,更清楚的了解这个标题,mau啊,这个获得最后的一个出错的一个代码啊,这段加上不加上都是可以的。

好那么这一段的话我们需要在什么地方用呢,我们需要在这个读取人物信息的时候啊,使用,嗯那么这里我们上一节课说了,要检测指定进程是否在运行啊,那么实际上也可以根据它的一个反馈值。

那么只是说我们在这里另外写一个函数呢,啊从性能的封装上来可能要好一点,那么如果我们在这里检测哈,它指定的进程都没有在运行当中已经退出了,那么我们这里的话就没有必要再去等待啊,几分钟的时间啊。

这里一直要等待两分钟的时间,那么呢我们就可以马上的返回,马上的反馈,好的,那么我们再次测试一下,那么首先呢这两个账号我们自动登录一下,来,那么这个时候好像是选线的时候刚出来一点问题。

可能是等待的时间不够还是还是什么问题,那么测试的时候呢,我们最后来把这个360这一类的话,我们把它退掉,那么这个时候来登录失败了哈,继续登录第二个,那么我们看一下,好孩子。

好那么第二次登录的时候登录成功了,那么这个时候呢我们就来测试一下我们的离线登录呃,离线登录的代码我们看有没有添加到零去,我这个时候呃要做一个离线的登录的话。

一般我们是用定时器或者是在在一个单独的线程里面开始啊。

那么这里是我们断线重连的底线登登录,那么我们再次测试一下啊,那么这个时候呢我们发现了,他马上就应当是发现我们第一个这个账号了,呃,这个进程呢没有运行,所以说呢他也把它重新的进行一个登录啊,账号机。

那么这个时候呢相当于进行一个补救,那么这个时候的话我们两个账号呢都正常的登录了,当然我们再次去测试的时候呢,由于我们这个列表里面的两个账号都是正常登录的时候,都是正常登录的,所以说它不会有任何的反应。

那么当时当我们这两个账号某一个它掉线了,或者是呃比如说这个账号会有飞机场的呃,非正常的结束掉了,那么我们再次测试的时候,它就会检测到哈,那么检测到这个账号来被正常的退出了。

那么所以说呢他会重新再登录一次,会反复的去检测啊,登录这个账号,那么这个大致是没有问题了,那么还有另外一种情况,就是呢这个他掉线了。

掉线的这种情况呢它又不一样,因为它服务器的话。

实际上呢这种掉线的话,它服务器的实际上它相应的这个套件自然没有关掉,那么所以说造成它检测的时候呢,他第一次登录的话,它不能够正常登录的,这个是分明是我们来看一下这种情况。

那么首先呢它会检测到这个呃零三这个账号呢断线啊,他会去尝试试去重新链接,但是这个时候呢它本身呢也会与我们的这个服务器断开,那么所以说这个时候的话,他的操作呢会造成我们的呃点击的时候呢。

会造成这个相应的账号呢啊都会被关掉,在离线的情况下,好像是操作这个鼠标,它也会被卖掉,那么所以说你看一下这个时候的话啊,只要我们反复的去检测它,它同样的也能够啊,再一次呢正常的登录。

只是说他登录了要重复几次这个时间,因为我们两种状态呢都有检测,一个是掉线的检测一个是进程啊,未正常呃,登录它也会检测没有在运行当中,但是我们要注意这个时候的话。

实际上我们这个窗口呢嗯这个窗口的话它是呃就是说不能够动的,是成一个假死状态,因为我们的这个离线检测的这个函数呢,它没有运行在单独的这个县城里边啊,我们实际上呢我们最好的办法呢。

需要把这个函数呢放到一个单独的线程里面进行一个运行。

这,那我可能是这个时候我们的这个录制教程的这个软件呢,它占用的cpu啊好像也不是很高啊,是我我已经忘了。

好的,那么我们再次检测一次,哈哈哈哈哈,那我可能也是一个网络速度的一个问题啊,我这边链接这个游戏的话比较慢啊,进入这个游戏,那么实际上现在这个整个操作的这个过程的话,它已经是没有任何的问题,这,哈哈哈。

好的这样呢,最终呢它就能够实现我们正常的登录了,那么如果他正常的登录之后,那么我们再单击这个按钮,它不会有更多的作用,但是当某一个游戏它掉下,那么或者是结束之后啊,那么我们再调用它。

它就会自动登录这个未在线啊,为正常运行的这个账号,好的,那么这节课呢我们的内容呢就到这里。

P155:166-死亡回城CALL分析 - 教到你会 - BV1DS4y1n7qF

大家好,我是郁金香老师,那么今天呢我们一起来分析一下啊,死亡回城的一个分析。

那么我们首先打开我们的ot哈,和强大的游戏里比哈哈。

那么首先我们回程的话,这一类呢他肯定要向服务器发送我们的信息,那么比如说我们直接回城的话,取消了,他也会发一个信息到我们的服务器进行一个相应指令的传送,那么如果是这个死亡保护了,他也会啊发一个包啊。

我们选择的时候先把其他断点进去取消掉。

那么因为他会来去向服务器查询一下我们是否有足够的呃这个元宝,那么有足够的元宝呢,它才能够回城,那么如果这两项啊,因为前面两项都需要查询这个元宝的这个数值,那么如果是在有元宝的情况下。

那么我们这两种死亡回城的方式呢,呃相对比较好分析,那么我们再来看一下啊,下一个断点。

然后我们选菜单机,那么这个时候呢我们有两种方式可以回城啊,一种是选择菜单,那么菜单里边呢他肯定有一项啊,有一项就是应该有一项是回城的啊,那么回程成功了之后呢,嗯它在取消掉我们这个窗口。

那么如果是弧形的指令没有成功的话,也就是没有足够的元宝的情况下呢,嗯那么它就会显示另外的一个窗口出来,那么这个时候呢我们可以一层一层的呃找到我们发包的这个函数,首先那么在这里的话。

我们应该可以再上一层啊,在这个位置呢我们应该就可以通过啊发包啊,直接发包的话就能够进行一个嗯这个菜单一的一个指令的,向服务器发送一个指令,那么如果你足够元宝的情况下,那么呢也是能够回城的啊。

而且不会掉精炼,那么这是我们分析的第一个点子,把它处理下来,但这个的话就不用去测试了,我想的话应该是可以的啊,再次按下ctrl键加f9 键啊,就是菜单里边的执行到返回,那么这里呢也是一个死亡返回的。

一个点,把它复制下来,那么再次按下ctrl f9 会返回到这个位置,那么我们也把它复制一下,然后我们再,次返回到上一层,那么返回到这一层的时候的话哈,这个库呢我们就比较常见的呃,经常在这个地方调用。

那么这个地方的话他说很多地方呢都会断下,会反复的断线啊,所以说这个地方我们就不用考虑,那么我们再倒回来,主要看一下这个地方,那么平时的话它不会断下嗯,只有对我们的窗口进行操作的时候呢。

这个扩了才会断一下,而且它断下的话,不同的窗口呢应该是通过这个窗口的i d啊,就像我们的按钮的一个资源i d一样,它有一个i d的一个编号,用来分别用来区分不同的这个操作。

那么我们再次来看一下我们选择菜单一的时候,它的一个呃它的ip呢是1385,这个时候菜到一我们把它坐实一下,好,那么这是菜单的音,那么我们这里选取消的话是38b啊,也是这个地方。

而且它的e c x的值的话,这个时候呢没有变,把ec x取出来,但是这个取消我们可能用不到哈,这是选单一,选单二的话是386,那么注意一与二之间呢,它只相差了一个数字一啊,那么我们再选择三看一下。

要取消耗,这个时候取消,那么再看一下这个这个菜单的山,在这里的时候,我们按g按下,那么我们发现了他刚好是387,那么所以说我猜测的话,这个地方的话可能就是我们菜单选择的,那么我们先把它复制下来。

这个时候呢已经回到城里边了,我们再次到一个地方,让这个角色呢挂掉啊,死亡了啊,然后呢我们再来测试一下,这个空先写一下,那么首先呢把这几行数据复制一下,那么删掉这前面的特征码,我第一次,到,好的复制一下。

打开我们的代码输入器,那么首先这个ex我们要把初始化是一个对象的地址,我们刚才在这里呢也获得它的数值,不初始化的话,我们调用的话很有可能就会出错,好那么我们再次看到,到这个地方呢。

我们需要等待这个人物角色死亡,那么人物角色死亡之后啊,我们来看一下调用它的这个菜单,那么ex呢我们替换成385,先试一下,那么这个时候呢它就会显示了元宝不足,那么我们在6386再来试一下。

啊那么这个时候呢也有一个元宝播出啊,啊那么这里这里取消的时候好像是38b,啊也是可以的,那么如果元元宝不足的时候要取消来,就是38b,嗯这个我们也把它记录一下,这是元宝不足的时候啊。

那么我们再来看一下啊,还有一个是385,386387就是回城啊取消,那么这个时候呢我们看到呃人物角色来就回城了啊,好的,这里呢它是采到123,哈哈。

那么接下来呢我们还有一点呢就是需要找到这个ecx这个参数,那么我们来找一下,看能不能否找到这个ex的参数机制,那么好像是我们的运气好啊,一下子就找到了一个这个机子,那么我们来看一下那个。

三幺gf 194,看这个对象里面啊。

在我们的o d里边是否能够找到,咳咳咳咳咳咳咳咳,那么我们在用o d的时候呢,我们发现找不到啊,那么这个地址的话可能的话就不是真实的一个低机子啊,那么我们在这里呢能够找到三db啊,一比零。

那么这个是应当是所有对象,那么这说明这个呢它也是这个所有对象数组里面的,那么我们可以从他最新更新的这个机制来看一下。

那么所有对象的找一下,恰好就是这个31d b1 b0 啊,这就是所有对象的啊,那么所以说我们在这里的话,要找这个机子的话,应当要呃到这个所有对象机子里面去搜索,啊,那么这节课呢我们暂时就到这里。

那么我们看一下它这个对象里面存放的是什么,哈哈哈哈,这是所有对象数组里面的对象,那么这是对象里面的相关的这些数据,那么零八这个位置是它的类型,这里是它的id,那么后边呢这里是一些相关的数据。

那么这节课呢就给大家布置一个作业啊,就是想办法取得这个对象的地址mix。

那么只要找到它的这个数值就可以了,也可以编写一个函数,那么也可以用户口什么方法都可以啊,只要能够得到正确的这个e4 x的数值就行了,那么因为这个数值的话,肯定它会每次会变啊。

那么我们要找的就是这一个数字,但是这个三比零的话,游戏从重新启动的话,它应当是会变的啊,我们可以试一下,好那么这个我们在下一节课呢再测试了。

P156:167-死亡回城CALL参数分析(定位动态基址)及函数封装 - 教到你会 - BV1DS4y1n7qF

大家好,我是郁金香老师,那么这期课我们一起来分析一下,死亡回程,或者相关的参数,那么上一期课我们分析到这里的时候,EZX这个参数它应该是变化的,比如说我们重新登录一下游戏,那么重新登录游戏之后。

我们用Nokia附加到游戏里面,然后转到我们死亡回程的这个地址,转到这个地址之后。

我们再来看一下它的EZX的一个数值,那么这个时候EZX的数值的话,与我们上一期课所显示的数值的话,肯定就不一样,那么所以说我们,但是我们要来找一些相同的地方,那么我们看一下对象里面的数据。

复制一下对象的数据,那么这个数据,然后我们与上一期课的数据来进行一些比较,那么我们现在来看一下对象的数据,那么我们注意一下,从这个位置这个地方开始,那么我们发现它第一行的代码它没有变。

还有类型肯定没有变,没有变的这个地方,我们给它做一个标记,那么还有摇摇这个位置也是没有变的,这个地方,那么变的话有+4这个地方变了,这个地方没有变,当然下边的话这里看不太出来,这个地方也没有变。

那么这两个的话它应当也是一个某一个机制,我们可以搜索一下,我们看一下对象它是否是在所有对象里面,在31118这个地方,搜一下,再搜一下这一个数字,那么我们发现的话,这两个的话都是一个机制。

但这两个机制的话,我们暂时不知道它是一个什么意义,这两个机制里面,那么后边我们就可以暂时不去看它,40这个地方是0,44,那么后边我们就不用去看,就看前面的这些的话应当已经足够了,那么这里它是两个机制。

我们首先可以判断这三个地方应当是比较准确的,但是这个机制在游戏更新之后,它肯定也要变,但是这个机制我们可以通过这一类的特征,先把它定位出来。

或者找一下我们看是否跟我们已有的一些机制是相同的。

那么如果是跟我们已有的机制相同的话,那么我们在这里的话可能就更容易定位,那么我们找一下有没有这个机制,那么在这里是找不到的,另外一个机制我们看一下,那么也找不到,接着我们看一下这一个。

那么这个的话我们记得有一段代码,那么我们再按减号退回来,那么这里有一个代码是ezx,然后取出来之后,实际上就是EDX了,但是它又把EDX加了4,加4的话实际上就是再取出来是死亡回程的,那么我们再看一下。

它的这个CoreEDX的话指向的是这个Core的地址,那么这个Core的地址的话也是可以定位的,那么这里它有一个ezx取出来,加上4,那么这个地方取出来,它应当是等于我们的Core的地址。

那么我们再来看一下,那么恰好这里面是放的一个Core的地址,这里是放的6E6A50,这个地址的话,它与我们的另外有一个地址应当是一样的,与我们的对象角色所指向的Core的地址它相等。

那么我们把这里面的对象角色的地址给替换一下,那么它同样也是指向4E6A50这个地方,这里EDX是6E6A50,这好像不一样,我们看一下有没有Core的一个地址,那么Core的地址的话也可以做一个判断。

我们可以进到Core里面去看一下,有没有一些特殊的一个指令,比如说它头部这里有一个280z,那么这个长量的话可能是一个树竹的一个大小这一类的,那么特征码的话也可以作为一个判断,那么我们可以这样计算。

你这个280z作为一个特征码来定位它,那么这个280z我们看要怎么取出来,1234,恰好又是加上四字节,那么这个280z的话就是我们的ECX+4,然后再加4,这样取出来的就是280z。

但是我们再按减号退出来看一下,在这里再下段,那么看一下我们的ECX,然后这里来取出来,再加上一个4,我们看一下EDF0这个地址还没有算出来,这里多加了一个括号,这样加4。

这个时候的话我们用DP来显示一下,恰好就是280z,那么这里我们把它替换成ECX作为一个条件,那么最终的话也就是我们说的这个地址,等于280z,那么这个应该比较靠谱,这是第一个。

那么在这个我们的ECX+8这个地方,这里应当等于我们的Linux0e,当然这个的话应该是ID了,可能会变的,那么来说11这个暂时也不肯定,那么最肯定的应该是这两个,这前面这两个。

那么我们先试一下编程之后来尝试一下,用这两个是否能不能够定位到一个唯一的一个ECX对象,如果能的话后边这些数据对于我们来说就没有用了,如果不能的话,那么我们可以加上383z这些偏移,想办法取得。

再来进行定位,那么好的。

我们来看一下,打开我们139克的代码,那么首先我们也把最新的机子把它切换进去。

然后移到我们的测试的页面。

那么在这里,我们来骗您一下我们的死亡扩的ECX,直接或者直接就是测试按钮这里进行我们相应的测试,那么我们现在需要写一个函数,这个函数,首先要骗你所有对象,那么所有对象列表的话,它有一个相应的一个大小。

我们看一下之前的骗你所有对象的,有一个,输一下,现在到,我们来看一下,我们把这些对象列表的相应的大小,我们要把这个数据放到我们的计算机里面,那么我们再来看一下,我们把这个数据放到我们的计算机里面。

那么我们现在看到的这个数据是我们的最新的数据,这里所有对象的大小是2700,好的,那么这里也是一个骗你所有对象的代码,我们把这段代码复制一下,我们把这个数据复制一下,我们把这个数据复制一下。

我们把这个数据复制一下,我们把这个数据复制一下,我们把这个数据复制一下,我们把这个数据复制一下,我们把这个数据复制一下,我们把这个数据复制一下,我们把这个数据复制一下,我们把这个数据复制一下。

我们把这个数据复制一下,我们把这个数据复制一下,我们把这个数据复制一下,我们把这个数据复制一下,我们把这个数据复制一下,我们把这个数据复制一下,我们把这个数据复制一下,我们把这个数据复制一下。

我们把这个数据复制一下,我们把这个数据复制一下,我们把这个数据复制一下,我们把这个数据复制一下,我们把这个数据复制一下,我们把这个数据复制一下,我们把这个数据复制一下,我们把这个数据复制一下。

我们把这个数据复制一下,我们把这个数据复制一下,我们把这个数据复制一下,我们把这个数据复制一下,我们把这个数据复制一下,我们把这个数据复制一下,我们把这个数据复制一下,我们把这个数据复制一下。

我们把这个数据复制一下,我们把这个数据复制一下,我们把这个数据复制一下,我们把这个数据复制一下,我们把这个数据复制一下,我们把这个数据复制一下,我们把这个数据复制一下,我们把这个数据复制一下。

我们把这个数据复制一下,我们把这个数据复制一下,我们把这个数据复制一下,我们把这个数据复制一下,我们把这个数据复制一下,我们把这个数据复制一下,我们把这个数据复制一下,我们把这个数据复制一下。

我们把这个数据复制一下,我们把这个数据复制一下,我们把这个数据复制一下,我们把这个数据复制一下,我们把这个数据复制一下,我们把这个数据复制一下,我们把这个数据复制一下,我们把这个数据复制一下。

如果前面这个条件达成了,如果前面这个条件达成了,我们再来取第二个条件,(读解中),(读解中),如果到最后我们都没有找到的话,如果到最后我们都没有找到的话,如果到最后我们都没有找到的话。

证明的话就未找到这个窗口,证明的话就未找到这个窗口,就是失败的,就是失败的,就是失败的,就是失败的,就是失败的,那么还有一个了,那么还有一个了,那么还有一个了,我们是要找到这个280z。

我们是要找到这个280z,我们是要找到这个280z,(读解中),(读解中),(读解中),(读解中),我们修改的应该是这下边的这个框,刚才修改错了地方,那么我们来看一下,这个的4循环应当写在这里。

那么我们需要在这里来要取出对象+4+4,这个地方的数值,那么我们在这里再定义一个,ID=4X4,或者在这里我们嵌入一段规编,这样的话可能会更好一些,那么我们在这里再定义一个,ID=4X4。

或者在这里再定义一个,ID=4X4,或者在这里再定义一个,ID=4X4,或者在这里再定义一个,ID=4X4,或者在这里再定义一个,ID=4X4,或者在这里再定义一个,ID=4X4。

那么这个时候我们取出来之后,再进行一个判断,那么这个时候我们再来看一下,ECX的数字来是否找正确了,好的。

那么我们测试一下。

那么我们测试一下,好,那么我们测试一下,好,好,好,好,好,那么我们发现这个时候找到的对象的话,还真的不止一个,说明的话,我们实际上要找的应当是这一个,2001070好像是这个还是这一个。

也就是说我们现在的一个判断的话,还不具有一个唯一性,那么我们再来看一下,他们究竟有哪些相同,哪些不同,再加上10这个,判断一下,加8这个判断,再判断一个+10的,加10的,好,好,好,好,好,好。

(音樂播放),(音樂播放),(音樂播放),(音樂播放),(音樂播放),(音樂播放),(音樂播放),(音樂播放),(音樂播放),(音樂播放),(音樂播放),(音樂播放),(音樂播放),(音樂播放)。

(音樂播放),(音樂播放),(音樂播放),(音樂播放),(音樂播放),(音樂播放),(音樂播放),(音樂播放),(音樂播放),(音樂播放),(音樂播放),(音樂播放),(音樂播放),(音樂播放)。

(音樂播放),(音樂播放),(音樂播放),(音樂播放)。

(音樂播放)。

(音樂播放)。

(音樂播放)。

(音樂播放),(音樂播放),(音樂播放),(音樂播放),(音樂播放),(音樂播放),(音樂播放),(音樂播放),(音樂播放),(音樂播放),(音樂播放),(音樂播放),(音樂播放),(音樂播放)。

(音樂播放),(音樂播放),(音樂播放),(音樂播放)。

(音樂播放),(音樂播放),(音樂播放),(音樂播放)。

P157:168-认识LUA 编写Lua的 Hello World - 教到你会 - BV1DS4y1n7qF

大家好,我是郁金香老师,那么这节课呢我们一起来认识一下脚本啊,后面的一个编程,那么我们主要是呃用这个脚本库啊撸啊,那么我们首先来来认识一下这个路网。

那么路网呢它本身是一个简洁轻量和口口扩展的一个脚本语言,那么它本身呢呃可以独立的这个运行,那么也可以与我们的这个c加加程序来整合,那么在这里的话我们主要探讨的是与我们的这个c加加整合使用。

那么首先呢我们可以到它的网站去下载这个最新的版本,那么这里呢它有很多很多的这个历史的版本,那么现在最新的这个版本是5。30的啊,那么除了在这里下载之外呢,也可以到我们的论坛来进行下载啊。

二那么都是可以的。

那么可以直接在这里下载也可以,那么下载了之后呃,我们需要呢先把它解下载到本地之后呢。

我们需要把它解压出来,但是我们只需要其中的一部分就可以了啊,只需要它这个源文件,这里面的所有的这个原文件,因为它都是开源的啊,这个代码,那么我们需要把原文件解压到一个地方。

那么在这里比如说我们选择的地方是c啊,c盘,那么立即解药。

那么解压了之后呢,我们来看一下它相关的一个目录情况。

那么就是这个src啊,下面呢就是所有的这些源文件啊,但是我们需要使用的时候呢,一般我们需要它的一个链接库啊,live啊,那么需要这个链接库的话,但是呢他没有直接的提供啊。

那么这个时候呢我们可以它有一个mc file,我们可以在这个dj k下面进行编译。

那么也可以用我们的呃任何的vs环境来编译,比如说我举个例子,那么我们可以在vs 2010下面的编译,生成它相关的这个库的一个支持。

那么我们可以在这里呢建一个空项目啊,可以因为它本身没有提供这个空的这个项目,那么这个项目呢可以保存在任何位置,那么在这里呢也可以保存在啊,为了方便使用的话,我们也可以保存在直接保存在它的这个环境下面啊。

那么这个工程呢我们就可以交通中文他的版本啊,想换人,让他名字啊,求为取名为这个卢旺532人或者三个人的这个版本,然后呢我们就存在他这个位置上面,当然存放在其他位置的话也是可以的,都是一样的,实际上。

那么存放到这根目录下边之后呢,我们把现有的这些项目把它添加进来,我这里另外生成了一个目录啊,相当于没有,现在嗯,这个向下边,那么我们可以先把它添加进来啊。

这里面所有的这个项添加心理,好但是我们直接这样编译的话,好像他有一些问题会出现,那么这个时候呢它会提示有一个或者是多个啊多重定义的这个符号,那么因为它有两个这个文件里面都有相应的这个马函数呃。

一个是这个人网带个c啊,这里边还有个马函数,另外是这个卢瓦斯啊,那么这两个呢有一点点区别啊,这两个编译库,具体有什么区别呢,我也不是非常的了解啊,我们来看一下,这里面我记得有一个相应的也有一个慢。

那么所以说呢我们只能拥有一个这个盲函数,才能够编译,或者是改一下它的这个后缀名,或者是先把它排除在外边,那么我们再重新编辑,那么这个时候呢他又会提示很多符号啊,我们的这个很多符号呢呃不能够找到。

那么我们需要来设置一下它的这个目录啊,这个时候那么这个呢我们还是先把他的名字取回来,把它直接排除就行了,从项目中排除排除,而不是删除啊,这个是删除文件啊,那么我们从这里面排除,那么排除了之后呢。

我们需要在项目里面需要设置一下,那么我们看一下我们的这个圆柱的这个路径,这里呢把它复制一下,那么首先呢我们的可以在这里添加我们相应的这个目录,包含目录,引用目录和我们的这个库的这个目录啊。

这几个呢我们都可以了呃,添加添加,为了我们相应的这个目录再来编译,那么这个时候呢就可以成功了,那么除了在我们这个库目录这里呢包含之外呢,我们还有其他的方式也是可以的,那么我们如果不在这个地方包含的话。

我们还可以在这里有一个附加包含目录,那么我们把把它包含在这里来,这样也是可以通过我们的编译生成的,那么我们编译生成了我们主要的是要获取它的一个lab库的一个支持,那么现在它编译生成的话。

实际上生成的是一个ex e文件啊,相当于是他的一个命令啊,行的一个平台的一个支持,那么所以说在这里的话,我们还需要改一下,当然这个生成了之后,我们也可以在这里看到它的输出目录呢,我们可以了。

把它调整一下,那么在这里呢我们输入s r z e x1 ,那么我们先编译生成一下,那么然后呢我们还可以把它用动态链接库的形式来形成,那么提供给我们使用也是可以的,那么动态链接库的话,这里呢我们,也有啊。

我们来看一下没有具体的生存好,那么这个时候呢就有两个文件啊,那么我们还需要的是一个level啊,静态链接库,那么我们再选静态链接库啊,再重新生成一下,那么我们最主要的就是需要这个静态链接库的一个支持啊。

这样他才能能够找到相应的这个符号,因为它很多符号呢他都没有在这个动态链接库里面掏出老角,那么我们需要用这个静态链接出来支持,那么生成了之后呢,我们就可以了呃,进行相应的这个开发了。

当然我们还有一种方式呢,也就是不要这个库啊,不要这个库的情况下呢,我们直接把这相关相应的这些图文件来源文件添加到我们的工程里面,那么一般呢我们是用的另外的一种方法啊,这个时候我们把这个项目工程保存一下。

那么保存之后的话,在这里的话呃,到时候我也可以打包发给大家看,这里边呢就直接有一个这样的一个工程,那么可以把这个工程呢把它添加到我们上一级目录,让它保存在同一个呃这个工程下边,那么这样的话打开之后呢。

我们就能够直接的来编译它。

那么出了同一个目录之后呢,我们这里呢就不需要所谓的这个附加目录,这里呢这个附加的目录呢我们就可以去掉了,那么我们直接就可以,这个时候就应该可以便宜,那么这个时候我们看一下它为什么会提示这个源文件啊。

把打开,因为它的这个原文件所包含的这个目录它可能不对呃,因为我们看它包含的一个目录是一个相对的一个路径,那么我们应该把这个相对的录进来给它取消掉啊,它是所有都要取消掉了。

我们因为这里的话它是用的它的一个上层的一个目录,的一个路径,那么这里有完整路径的话,就是错误的话,那么我们需要再重新的把这里边的这个原文件呢再包含一下,或者是把它再放回去啊,放到我们的这个目录下面。

因为他刚刚才实际上就是用的一个相对的一个路径里面包含,那么我们也有办法进行修改啊,这个时候,那我们先把里面的这些呃原文件,全部把它先排除一下,那么头文件呢我们也把它排除一下。

那么然后呢我们再重新把它添加进来就可,那么注意啊,这个我们不需要包含,我们只需要包含一个啊,那有这样盲含出来就可以了,好的,因为我们都包含了一个这个项目的这个文件。

那么这个时候呢我们再来看一下它的这个相对的这个路径的话,就是正确的,重新再需要包含强,性质就像。

好的,那么这样的话就可以直接的啊生成,那么到时候呢我会把这个代码来打o啊,发给大家,大家可以直接到时候呢打开这个项目文件来编译生成,那么这样的话就会很方便了。

当然也可以照之前所的方法直接到官方网站或者是我们的论坛论坛啊,下载这个源代码,然后来生成主要是这个文件啊,那么我们要把它分成好嗯,让我生成好了之后呢,我们在这里呢可以给他改改个名字,非常稳定。

认真制的代码用这个病来表示pr,那么也可以用刚才的这个部落名字是随意的,但是呢我们要把这个目录里呢要把它记住啊,因为在我们之后用的时候呢,我们可以用用这种方式来调用它。

那么我们先把这个目录的名字来先记录一下。

那么装好了之后呢,我们这个目录下面包含了我们的这个ip。

就是这个静态库的这个路径。

我们把它记录一下,那么另外呢就是我们其他原文件的一个路径,那么有了这个路径之后,那么我们接下来呢我们就可以了,来开发我们的这个脚本文件啊,那么我们再次新建一个工程啊。

嗯对,那么这个时候呢我们可以建一个c加加的一个控制台的一个项目,就叫toko,有我,那么在这里呢我们选择我们项目啊,保存到这个位置,然后呢点确定这里预编译图啊,这些可要可不要都可以,然后直接点完成。

那么我们要注意到我们的所有的这个logo程序呢,它都是用c它的后缀名呢都是c dc dc啊这一类的,那么这一类呢它是用c语言,是用纯粹的c语言来写的,那么所以说我们在包含它的相应的这个知识库的时候呢。

我们需要加一个tc啊,表示了他全部都是用的这个c的这个呃相应的一个规范,那么后面呢我们再来包含它的这个相应的一个库,那么一个是要在包含这个库之前呢,我们需要包含它的一个附加目录像啊。

那么就是我们刚才所准备的这个腹腔目录的像,那么我们需要把它包含进来,嗯,那么然后呢我们再需要包含这三个啊,相应的一个图文件,那么是在它的上一层的这个目录啊,好那么这样呢它就能够找到我们相应的一个图文件。

那么我们接下来来可以写上这样几句,在我们的这个min函数里面,当然我们要调用这个系统函数啊,系统的命令的话,那么我们需要的包含它的相应图文件,嗒嗒嗒嗒嗒好,这样我们就可以了,再编一下。

这样我们就有了一个相应的这个word,当然它需要符号,那么符号的时候我们的这个lab不如在这里,那么我们再次为他设置一下,那这个链接的输入项,那么在这个位置加入我们的这个相应影像,然后用封号进行分割。

然后他有一个附加的控步路,那么我们在这里来填写,当然我们也可以在这个vc加加,这里有个库目加在这个地方也是可以的,当然我我个人的话更喜欢你呃,在这里来加入这个负载库的这个目录好。

那么这样我们再次编译生成,那么这样就可以了,然后呢它会自动执行了我们的这个运行目录下面的,那么在我们这里的话,它就是这个调试目录下面的这个路啊,开始啊,这些里面的这个脚本,那么这里有一个公众目录。

就是这个工作目录下面的这个调试脚本,那么在这里呢我们比如说默认的他指定为c盘啊,那么指定为他的一个工作目录,那么呢我们就在这个下面呢跟他建立一个相应的这个脚本,当然也可以在其他的版嗯。

在这里的话我们也可以,在这个输出温度里面也是可以的,把它做一个调试目的话,可能这这样更好一些,工作目录,因为我们平时如果不进行设置的话,它的这个工作目录的话,因为我们的输出目录呢它不是一样的。

那么我们这个时候进去找一下啊,就在这个目录下面,那么这里这个时候我们用一个记事本建一个,也是类似于我们打印的一个脚本,然后把它保存一下,重新一名名字吧,novtest。

然后我们在这里运行的话,我们就能够看到它相应的这个文字。

我的第一个罗网程序就能够看到它的一个名字了,当然我们也可以直接在这里面运行也是可以的啊。

那么这样的话就很简单了,那么今天呢我们就呃啊这个la的这个评以及相应的这个库啊,这样搭建好了,那么后面呢我们就可以在这个环境,那下面呢呃开发我们的这个相应的这个脚本啊,那么这节课呢我们暂时呢就到这里。

P158:169-认识LUA与C.C++的接口 - 教到你会 - BV1DS4y1n7qF

大家好,我是郁金香老师,那么这节课呢我们一起来看一下这个在lua脚本里面啊。

怎么来调用,我们有无戏里面的这个函数,或者是c加加里面的这个函数,那么首先呢我们打开vs 2010。

然后创建一个新的项目,控制坦克噗,那么完成之后呢,首先我们也要包含相应的这个链接器,这里面包含我们相应的库,哈哈哈哈哈哈哈哈,然后呢我们再用我们相应的头文件,那么第一个这个鲁莽的h呢。

它包含了我们这个脚本里面的所有的这个基础的啊,这些函数都在这里边,那么第二个呢是一个相应库函数的一个支持,就是他看文件,那么第三个图文件呢是一个辅助库的呃,一个图文件的一个支持好。

那么这些包含好了之后呢,我们就可以了,第一个先要给它创建一个lua工作的一个环境,我当你打开233,那么一般呢我们用l l这个变量呢来表示,当然后面也可以随便取一个它的一个变量值。

这里就是一般文物angel来表示,这样是一个比较统一的一个做法,那么后面呢它实际上是有一个函数来创建这个环境,那么这一局我们就把这个相应的这个路网工作的这个环境创造好。

然后呢一般我们还会打开它的这个所有库的一个支持,然后把这个尺寸呢传进来,我们唱,那么最后我们使用完了之后呢,我们需要来关掉,这个工作的这个环境,那么在这中间呢我们比如说我们要调用一个函数。

那么在这里呢我们可以随意地写一个啊,比如说我们写一个游戏的一个寻路的一个空翻的问题,那么这个函数呢我们什么也不做啊,暂时呢我们就只打印出一个曲面指令,哈哈哈哈,那么就只反映出这样的一段话。

但是我们在lol里面呢,它不能够直接调用这个函数啊,那么我们需要呢需要注册一个这个logo的这个函数,但是这个注册的函数的这个格式的话,它必须也要传入这个一个解释器的一个指针进去,它的格式类似于这样。

那么我们这里呢就需要另外的定义一个函数啊,那么在这个函数里面呢,我们再来调用的方位,当然这是没有参数的情况下啊,那么这个时候这个函数呢就可以是我们的一个注册注册函数的格式。

而且它的这个函数的格式化要求是c语言的,这个格式化相当于有这一个要求,那么在这里有了这个函数的格式呢,我们就可以开始注册了,那么注意这个没有,然后第一个呢也是传入的我们的这个解释器的指针。

那么第二个呢是我们要注入的这个注册的这个函数值,注意这里的函数名的话必须是英文的啊,是啊是中文的人,他不能够认识,当然这个5。1的这个版本的话,网上有一部分的修改,或者它可以支持这个中文的函数名注册啊。

好那么我们在这里,我们比如说也是注册一个端的位,哈那么这里的名字呢可以与后面的名字相同,那么也可以不同啊,这是我们注册的这个名字,然后注册好这个名字之后呢,我们在脚本里边呢就可以去调用它。

比如说我们可以用这个撸啊string的方法来交流to string,那么第一个参数也是它的指针,那么第二个参数呢就是我们的这个函数名专的位,如果这里是函数的话,这里要加上一个括号。

这样呢它才能够调用成功,好的我们在这后边呢还需要把它暂停下来,boss,那么这个系统函数呢我们需要包含另外一个文件,好的,那么我们运行一下。

这个时候呢我们就发现它有一条呢寻路指令被执行。

也就是说他通过这个执行一个脚本的一个语句了,它就可以执行到我们自己的这个寻路指令里面去,那么在后面的话,实际上我们就可以加上我们游戏里面的这个寻路的啊啊,相应的一个汇编代码,在这里的话它就能够被执行了。

就这个位置当然也可以,在这个位置下也是可以的啊,那么无论哪种方式都是可以的,但是这种形式的调用呢比较常见一点啊,这里呢另外呢我们需要再注册一下,当有多个函数的时候呢,这里呢我们就要注册多次啊,多次。

那么除了用这个dot的方式来调用呢,我们也可以用这个to fire的方式来调用,也就是我们上一节课就是用的这个debug的一个方式,那么to fire了所有的这个脚本呢就放在这个文件名里面。

那么我们这里如果开始这个后缀名也是任意的啊,只要是一个完整的一个文件名就行,当然也可以是一个全路径名,那么如果如果我们是在这个控制台下面运行的话,实际上呢他的一个工作目录呢是在这个地方。

是在这个第八个的上一层,那么比如说我们就需要在这里来建立建立一个路网,那么在这里呢我们来find way to,那么我们可以调用两次,好的,那么我们再次运行看一下。

啊这是第一次被调用,这是第二次被调用啊,那么这就是我们的lure to fire,当然在这里的话,我们也可以用那个直接这样调用也是可以的,都可以一起调用,那么这个时候呢他就被执行了三次。

那么还有一点要注意我们的第八个啊。

这个时候的话我们看它为什么会只会被执行一次了。

因为他在当前目录他找不到这个脚本文件。

因为我们的脚本文件呢在这上一层,我们调试的时候呢,它的工作目录呢是在这一层,但是如果我们呃直接运行这个ex一的话,实际上它是在当前的这个目录来找这个脚本文件。

那么我们需要把这个脚本文件夹复制到这个e x。

e所在的这个路径下啊。

这样才可以,那么我们在这里还可以改一下,这是我们的ex旋转用一下,那么我们看一下,实际上这里他执行的结果啊。

因为是调用的这一个文件,如果我们这里调试的。

它实际上是调用第八个呃目录的上层的那一个文件。

但是呢我们可以通过在这里来改,在这个调试的这个目录以前我们也改过啊,这里的公众步骤我们可以把它改一下,那么公众部落呢我们把它嗯把它改为这个第八个啊,这个目录就行,把它改为这个输出的这个目的啊,调试这里。

那么我们这个时候呢它就能够一致了,那么这样呢我们就能够保证。

啊它所调用的这个ex一呢是在e x e的这个路径里面。

那么我们也可以这样改了,这是调色这个动路,好的再次保存一下,那么这节课呢我们就到这里了,那么有一个坐了下去,大家啊在网上去查一下可以,那么实际上很多资料的话,我们都可以在百度里面去搜索哈。

嗯那么另外这个作业呢我们就是大家先去看一下带参数的,怎么在这个撸啊脚本交流,那么我们下一节课呢再探探讨这个问题啊,大家可以去搜集一下相关的这些信息,那么实际上很多这个内容的话。

我们在网上都可以找到相关的这个知识,好的,那么如果不愿意到网上去搜集相应的这个资料了,可以直接看下一节课的呃,相应的这个课程,那么比如说我们这个方位,它需要两个参数,那么这个时候我们怎样传入这个参数。

好的,那么我们下一节课呢在探讨这个相应的这个问题,那么这节课呢我们就到这里。

P159:170-LUA与C交互-调用带参数的CALL - 教到你会 - BV1DS4y1n7qF

大家好,我是郁金香老师,那么这节课呢我们研究一下路网里面的哈带参数的这个扩的一个调用,那么首先呢我们新建一个项目。

那么建好了之后呢,我们把上一节课的代码啊,呃复制进去,那么在这里呢哈我做了一下修改,那么上一节课呢,这里呢它并没有啊,在这个参数在执行这个脚本的时候,那么是这种情况,那么这种情况的话。

它只是来调用了这里面的代码,但是很多时候呢我们脚本语言里面呢,我们需要传递我们的参数来到对应的这个注册函数里边,那么这种形式的话,我们应当怎么传递我们的参数,而我们的这个注册函数里面。

那么注册函数里边又怎么去啊,获得这个相应的参数数据好,那么我们一起来看一下,那么首先呢我们在这里的话,实际上这里参数传递了多少的话,他传递多或者少都可以可以传递很多可怕的证。

那么关键是我们这些参数它传进去之后,在这个地方怎么来获得它,而且这里的话参数的个数呢它是可以任意传递的,那么传递了之后,我们即使不做相应的处理,它也不会出错啊,只是说我们相应的这个呃参数。

比如说这个123456,它没有传递到我们的这个注册函数的原来,而且注册函数里边来的这一节课,我们主要研究一下数字相关的这个数据的获得,那么他要用用一个撸啊。

to number one来获得相应的呃这个站里边的一个数据,而这个卢瓦的一个交换的话。

它都是相当于在一个特殊的一个站里边来完成的,那么就像我们的这个堆栈一样啊,它都是通过这个然后把这个相应的数据转换之后呢压榨,然后呢它有一个特殊的站,需要用一个相应的函数来来获取。

比如说我们可以用这个如果特朗普来获取里边啊。

这个站里边占领的这个元素占点的这个呢。

它标志它的下标呢是1234561,是这样编号的,那么要取哪一个参数来。

就取一个对应的一个参数,从一开始编号,那么比如说我们这里的话,要去他的第一个参数啊,那么如果我们当时取之前的话,我们需要进行一下判断,那么比如说我们要取的是数字数字。

那么我们先判断一下这个参数是否是我们所需要的这个数字类型的好,那么我们可以加上一个if条件语句,然后呢把这个环境指针啊,解释器的指针传进来,然后这个index ta就是它的堆栈的一个相应的下标。

注意这一点与我们的c c加加不一样,我们c加加的数组的话,边后来是从零开始的,但是它的编号呢是从一开始,那么我们取第一个参数,如果是的话,那么我们把它保存到,那么要注意它它的这个参数的话。

它没有呃整数与浮点数之分啊,它全部都是用火点数来表示的,这个数字好,那么我们这一点就算我们传进去的是整数啊,但是实际上他取得的数字呢是我们的浮点数啊,那么在这里呢我们先定义一个,double lg,他。

那么我们取一个数字,那么在这里的时候呢,我们这个参数呢我们可以用u啊,to number啊来获取相应的值,那么解释器的环境指针传进去,然后是它的一个相应堆栈里面的一个下标,那么取得了之后呢。

我们这里呢可以把它打印出来,好的,那么我们来看一下现在的一个执行的一个接口。

那么这个时候呢我们展现出来的是零啊。

我们再来看一下我们的代码,那么这里我们传进来的话是一,因为我们后边呢这里还没有加上一个相应的参数,那么我们再来看一下。

那么这个时候呢我们在相应的这个数字呢他就确定了。

当然如果你本身是整形的啊,那么这个地方呢你可以了,定义为我们的the integration啊,整形,那么它会自动的强制转换啊,这个这那么我们也可以直接强制转化啊,这里呢用百分之d来表示。

而且我们这里还可以用一个循环来表示,怎么来表示呢,如果所有话,我们举个例子,那么我们保证哈整个对战里面的它都是这种数值类型的啊,没有其他的类型,那么我们这里可以用一个y语句好来取它的这个所有的参数列表。

如果我们就是传传递的这样一个序列的话,这个加法的话,那么我们可以呢依次的去他的这个呃所有的参数,那么这里呢我们就变成一个相应的数组的一个下标一体汉不足一,那么这里呢i加加就可以了。

这样我们就能够获得他所有的这个参数,但是这个时候比较多,我们看一下啊,太多了,下面的是数字的也比较多啊,所以说这里呢我们还是不能够用这个y循环,最好是用一个for循环,那么它不等于这个数字的话。

那么我们就继续循环,就这这样呢,我们就可以取得所有的这个参数,六个一三,这里是i啊,这应该是i的,当然这个时候我们看一下啊,这个地方怎么我,如果你是兰博啊,如果是等于零的情况下,那么我们在这里呢。

嗯继续下一次的循环,那么不是的话,我们就在这里了,取i的这个下标,而不是i加价,因为这里已经加了,引起了,那么刚才这里的写法你也应该是正确的,刚才的错误在于这里呢多加了一次这个下标的数字。

123456。

那么如果有更多的这个参数呢,我们可以在后面呢继续在写,当然这里的数字呢我们需要做相应的一个改变。

那么这样的话就能够有效地把我们的参数来进行一个传递哈。

那么这是所有数字类型的这个呃参数的一个传递,那么当船那么比如说我们另外的啊,比如说寻路啊这一类的函数,那么肯定另外的还有一个寻路的一个扩,那么我们也可以在这里来直接把我们的这个参数啊进行转换之后呢。

再调用我们其他的啊非注册函数来实现嗯,比如说我们另外再写一个函数,就是一个做加法的一个函数,嗯,那么这里呢我们最后来输出这个最终的这个计算的一个数值,那么存放在这个栏目里边。

那么这里的话实际上呢我们就可以了,通过这个接口来调用我们其他比如说游戏里面的这些函数都可以,当然最终呢我们后边的话还要结合这个游戏的例子,来来探讨这些呃问题。

那么现在这个阶段呢我们主要是了解一下这个lua,它相应的呃一些基础的这些知识,好的,那么这节课的话我们就探讨到到这个地方。

那么下去之后呢,大家可以查一下我们怎么去接受它的一个返回的一个数值,那么居中呢,这里12345678啊啊加起来的值是36来计算出来的啊,但是究竟是不是啊。

这个我们就不用去过于纠结,它1~8好像是36啊,那么下一节课呢我们再来探讨一下,我们怎么来取得那么这个函数的一个啊,比如说它最终有一个返回的一个数值,那么我们这个函数怎么来取得这个返回的一个数值,好。

好的,那么我们下一节课啊再见,那么这里的话最初呢因为当时返回了我们的这个number,这样才对,好那么这节课的作业呢,我们就是那查一查微信,这个如果不是转一次相关资料,那比如说我们在这个地方呢。

我们就是要找到啊,怎么去取出这个my i d d l这个函数的一个返回值,我们怎么去获取好的。

P16:027-完善选怪功能-计算怪物与玩家的距离 - 教到你会 - BV1DS4y1n7qF

大家好,我是郁金香老师。

初中1533057,那么在我们选怪的时候呢,为了让我们的外观呢更加的效率,那么我们会考虑到优先的选离我们最近的怪物,那么这个的话我们就需要嗯得到一个怪物的属性,是与玩家之间的一个距离。

但是这个游戏里面他没有这样的一个属性,但是呢我们可以通过怪物的坐标,有玩家的这个坐标呢来计算出怪不到我们之间的一个距离,那么今天我们这节课的那目的呢就是计算出怪物与玩家的距离。

那么下一节课呢我们在优化完善我们的选快功,能好的,那么这个玩家的坐标的话,我们还没有分析过,那么首先呢我们先分析一下啊,先分析一下怪物和玩家的一个坐标。

那么我们先打开我们的4g,看一下我们现在的坐标是多少,2197啊,那么我们先搜一下不一样,所以这里呢我们要选火点数,因为浮点数的话,它小数后面呢有一部分被省略掉了,那么可能呢我们就比如说二幺。

他可能是2194点多少多少,所以说我们在这里修的时候呢,我们收两个字是一个范围,数值2。93比它稍微小一点,这边应该要比它稍微大一点,还要求,那么我们这样呢就能够保证我们收到的数据呢没有行动。

然后收费变动的数字,然后我们再改变一下坐标,2211就是2210,那我们就是212,这个就是重新搜一下,可能这个数值呢他在下正在变动啊啊,那我们再改变一下2204,204的话,我们是20320,再。

看一下啊,21926912+93,好这里有两个坐标已经出来了,很可能就是我们所要找的一个坐标了,我们把游戏移到边上,走到了看见,那么这个数值呢它不断的在变化,这个数值呢它只变了一下,然后就没有动了。

那么这个坐标的话,可能它是目的进展应该是比较贵,因为这个的话可能才是当前的作用,当然这只是一个猜测啊,然后呢我们再跑动一下,现在是2263个一个列举方,二七子好,那么这个还是比较多。

之前我们分析过幺八开头的话,还是堆栈删掉,这个在不断变化的删掉,这个要关掉,那么你留下来就是这一片啊,去那么我们再动一下230,怎么230,这229231,搜索,慢慢搜出来还有这么多,那么我们看一下。

这是我们玩家对象,它的一个地址的话是多少,是d d02 a13 f d精灵啊,这个地址,那么也就是说玩家这一片有相关的是从二类一开始,那么这一片是我一个玩家离得比较近的,这次我们把它拖进来。

那么其他的与我们的关系可能就不大了,就大了,那么拖进来之后呢,我们看一下314173c啊,这个我们之前分析,这是玩家的对象,这是玩家的对象的一个起始地址,2031gd 0,好的,那么我们再点一下小地图。

去个比较远的地方,那么我们看一下这个时候在变动的,没有变动的呢,这个它是应该是目的地的一个坐标,那么在变动的这几个的话,应该是当前的作品,这几个是当前做,那么这个呢也是固定解读,啊一下子就跳到了目的地。

跳到这里,那么呢我们当前的坐标呢还会不断的变,目的阶段,它不会变啊,那么然后我们再找一下它相关的偏移,那么这两个呢是全局的,是机制,那么最好的我们是在它的一个对象的相对偏移里面找,但是他这个呢是2。

14开,如果收到这个比可能离得较远一点,不要上,那么我们找一下目的地的,我们先来看看当前的坐标,我们先看看。

这个时候呢我们得到一个偏移是1658c,让我们看一下他的e si呢恰好是f d t0 ,也就是我们的玩家对象,那么这个属性呢我们先把它记录下来,那么这也是玩家对象的一个机子的一个指针。

加上16834当前坐标的当前x坐标准确的时候,那么它的目的这个坐标呢再来看一下,刚才我们是找到好像是这个在讲卷法完全做过,第二个的话,我们看一下它这个1a x的话啊,嗯这个的话不是我们这个对象把它删掉。

这个对象不一样了,那我们再来看一下这个,这个呢也也不是我们这个对象ex ex它是2014多少多少,那么不是的,我们这个呢也把它删掉,那么目的地的坐标呢,我们从未来要是这里来看一下。

这个呢要点了小地图才有这,啊点了小地图之后呢,这个是小地图的一个目的地的一个坐标,那么我们看一下e d i的值是多少,e d x子弹恰恰是这个2a13 f d t0 是我们对象的玩家角色。

那么幺四bc呢我们也接触一下,进去会看见我看直播,一是平时啊,这个我们先分析过程,那么第二个坐标我们再来看一下,幺六,那么这个1650呢也是一个目的地的一个坐标,我们看一下它的对象。

e d i恰好也是我们这个对象,我们把1650这个也切一下,好的,那么有了这一个坐标以及我们怪物里面的啊相应的一个坐标,那么我们在有了这两个坐标之后呢。

我们也用上就可以,那么理论上来我们就可以来计算出它的一个距离。

那么实际上这个计算距离的方法呢,在之前的教程呢啊以前的外挂教室里面我有说过,那么我们做一个假设啊,那么这里有一个点,这里的一个坐标点二,这两个地方有两个点,这是一个点。

就是那么我们要计算这两个点的一个距离的话,就是这两点之间的一个连线,这就是它们之间的一个距离,但是我们没有直接的一个办法能够把这个数据计算出来,但是我们可以通过一个相关的公式,那么我们先做两条辅助线。

那我们把这个点稍微把它更改一下,这里有一个点,那么这个点呢我们设在这个地方,这样可能好看一些,这是它的一个距离,那么我们先做两条直线出,那么这里呢是一个直角直角。

那么比如说这个点我们表示他如果表示成作为表示成x1 y1 ,那么点呢我们表示成x2 y2 ,那么它们之间的一个距离的话啊,就是这两个数来相减相减,它们之间的一个这一段这一条边。

比如说我们把它叫做a b这条评,b a这条边呢我们把它叫做b b这条鞋跟来就是我们要求的距离,c,那么如果我们要求这个ba的这个距离的话,我们就可以了,用p s取决对值,x一呢减掉x2 来表示。

那么我们做个假设啊,这个作格的话,比如说它等于x在第二象限呢,它是一个负数,比如说-30啊,那y的值比如是22个,那么如果这个坐标等于,x呢它应该是一个看一下这里的x的话,这一点的x还是正常正确。

就是幺七,那么y坐标比如是复读啊,因为在第四象限呢,y坐标呢为负,那么这里的话它就等于a b s,x也就-38减掉我们的x317 ,那么实际上最后的结果呢就是f p s负的55,那么最后呢他就等于55。

那么实际上就是上面这个三八啊,应该是这样来算的,应该是这一段的距离加上正面这一段的一个距离,这里三发加上这么一个腰鼓这个距离,那么如果我们是这一点到这一点一个距离的话,他也是这样来算的。

那么如果我们不是在另外一个象限啊,如果是在这里,那么它的算法也是相同的,是相同的,那么同样的它也是啊,比如说这一段ba的一个距离的话,同样的是一个y一呢减掉y2 ,减掉这下面一段。

那么在这个象限盘全部是为正的,所以说这个公式的话,同样是使用的这一段的距离呢,同样是这个x2 减掉这个x1 ,在第一象限的话,两个指南它都是为正,所以说无论他是在哪个象限的话,大家可以去做一个事例。

那么这个公司呢它最终都是成立的,那么这是我们标配的一个啊,这应该是db的一个距离,等于我们x一减x2 ,那么对a的一个距离等于aj s y一减y2 ,而且它这个公式也是在无论在哪一个象限的都是成立的。

那么y一现在的值的话是二二,它减多少呢,减的是-5,那么实际上最终的结果呢它也是ap 2负负得正是加五,最后的那么等于二对17,那么a b和b格的距离求出来了,我们就可以勾勾股定律啊。

a的平方加上b的平方等于c的平方,于是这个色的话就等于sq r t q r t呢代表一个开放的函数,n c a加上b sb那么最后呢就是斜边的距离,写为了强度好了,那么我们既然知道了这个常数。

那么我们就打开第26课的代码。

那么我们就把这个函数来把它封装好。

这里要说一点的是哈嗯它3d游戏呢它还有一个什么呢,除了这个x坐标和y坐标之外呢,他还有一个z坐标啊,有的是这样表示的x y z啊,这样来表示,但这个游戏呢它是这样来表示的x z然后呢y啊这样来表示的啊。

它z坐标来放在了中间啊,但是一般的这个a坐标呢我们可以约掉,那么如果他是真的啊,嗯怪物和我们玩家都有这些坐标的话,那么他最终的结果,这条斜杠的结果就是sq r t,b c a加上b乘b。

然后呢再加上我们save乘以c啊,然后呢再开一次哈,我把小说看好,那么最终的结果呢,它实际上就等于是拖拉t开方a的平方加上b的平方,加上我应该是热的,还有一条z z轴z轴,那么这里呢我们我们跟c跟z啊。

那么这个z的话等于多少呢,就是那个z坐标就等于a b s就这一批减掉z2 把手表,这样就能够求出来了,这个这个长度的话就是这样的,好的,那么我们来看一下,当然一般这个z z坐标的话都是被忽略掉了。

那么首先呢我们要在,玩家这个角色里面呢添加我们的坐标,这个属性,在这里呢我们添加一个坐标,但这个坐标呢我们是当前的坐标,所以说我们是开始先把当前的作用,那么另外还有一个坐标呢是有这对的,但是钢琴坐标的。

那么另外那呃另外的目的地的坐标呢,暂时呢我们还用不到,那么用不到呢,我们先进先不添加,那么我们先把这两个数字呢进行一个初始化,在个体代替,然后把上面这一段啊都进行。

那么这里的类型呢我们要改为了flog多点数,还有后面的偏移,我们要改偏移就要改成我们所找到的这个偏移,当前的坐标168c,那么在前面呢我们也可以定义一个红,当前做表。

那么在这里呢偏移我们进入这一套来加上,如果是z坐标是加四,那么y坐标呢这里呢要加八,它的偏移,好了,这样呢我们就把它相应的数值呢读出来了,那么读出来之后呢,我们再,我们看一下后边。

还有没有其他的打印信息,这个呢我们都有为集成相应的这个单元,接下来呢我们就是怪物的这个坐标,我们看有没有读出来在相应的结构领域,在怪物的对象里面这一页,那么有的话我们看它有没有在里面进行初始化。

他说不要好,这前面这个坐标是初始化的,后面一个坐标没有初始化,嗯所以说我们暂时把后面这个座位坐标先注释掉,因为它没有初始化,没有用,如果我们去用的话就会出问题,到时候,先编一下。

来计算两点之间的一个距离,听到了,那么这也为了我们表达的方便面呢,我们就把它写成两个坐标,x1 y1 sy 2这两个坐标,然后呢在这里呢提一个变量可以,雾呢最后用来返回我们两者之间的一个距离啊。

那么零的话就表示的是最近啊,这个距离,那么我们可以把它写大一点,t s f写大一点,表示的距离比较远,然后接下来的话我们就是嗯进行一个相应的计算,先求它的a b,那么a b的话就等于我们的搜索的那条杆。

等于我们的y1 n p s1 y一减掉y2 ,那么另外一条线呢我们叫做b加b x减掉x2 的绝对值,那么第四的话我们就是要返回的距离,实际上,但是呢我们就等于excel tec开放a的平方加上b的平方。

这就是我们的这个b边,那么最后返回这里呢,我们实际上进行返回这个c当然这里未来可拼高级的,就给他录下值,这样返回,但返回的话这个是否点类型的,这个是我们整形的啊,无符号整型的,所以说这一点的话。

它会有一个产生一个警告,而,这一题多了一个更好,那么这个时候a abs的话好了,p s y一角啊,那么这个时候呢它这个函数呢它不认识,数学单元,must,好那么生成成功了之后呢。

我们这个距离的话还要修改一个单元,就是我们的这个怪物列表的这个单元,那么在这里呢我们怪物坐标之后呢,我们还要给它添加一个怪物的一个属性,叫做距离,这里是哪个版本,那么这里距离玩家有多远。

那么这个数字呢我们需要的就在这个get data里面初始化,初始化的时候我们就要调用我们刚才的这个函数,当然这个函数呢它写到后面去了,那么写到后面去了,我们要调用它的话,我们需要先前置一下。

那我们就在这个头文件里面去前置前置声明一下吧,或者我们把它放到这个全局变量单元里看,但在那样的话可能不是很方便管理,那么我们就放到这个这个地方,那么在这里呢我们给它添加相应的属性。

首先呢怪物列表的数组里面的某一个动物,那么我们要跟它计算距离,那么就用刚才我们的这个公式,然后呢把相应的坐标来给它传进进,那么首先呢我们获得人物的啊,这个,相应的数字相应的坐标跟fat对,当前坐标。

这是第一个作品,然后是第二个坐标,就是要看,关注,然后呢我们为了方便看呢,我们给他换一个好,在这里我们也可以进行一个画画,嗯然后是怪物的,自己曾经的,好那么这两个坐标传进去之后呢。

我们就能够把这个相应的距离呢,嗯给它计算出来,那么计算出来之后呢,最后我们把这个属性呢给它打印出来,我们写了一个相应的打印单元,添加到最后,那么在最后呢我们写成一个距离,把这两个属性呢啊挑一下。

好再编译一下,那么编译成功了之后呢,我们还需要添加到相应的测试单元,接收消息这里,那么接收消息这里呢我们需要把前面的先注释掉,那么直接这样调用的话是不对的,他没有初始化数据,这点要注意。

要先初始化数据格局,带他们后来用尺寸来调用,好的这样理论上这样的话就能够打印出来了,那么我们还要做一下,就是把注入单元的价,那么我们可以开始数列,那么注入之后我们用相应的工具来看一下调试信息。

嗯那么这个时候的距离就出来了,这是距离哪一个怪物,距离我们最近的,那么这个编号这里我们看不到啊,这里我们知道是12346,七啊就最后一个,最后一个的话,他的i d呢这里有感应是1356,然后360。

动作这样,这才是怪物列表,再来看一下大屏清晰,他应该是在这里哈,之前这里打印了一个怪物的hp,这是之前的,这里打开了到这个位置,那么我们可以把这样请注释掉,那么怪物的i d的话,我们也可以把它打印在这。

这个坐标啊,然后id我们可以选择电脑i d d i c,好,那么我们再编译一下,然后我们在这里呢在附加到游戏可以进行一个相应的测试,那么这里我们添加相应的指针标40,这是我们选中的怪物。

选中对象应该说当然这个时候没有选中对象呢,为f f,那么我们再确定一下最近的怪物,选一个知识,那么最近的关注我们看一下126的话,幺八这个野猫,那我们看一下它的i d i t为什么没有出来。

应该是没有编辑,我们要重新编辑一下,好再重新点,看一下哪一个最近110,这个102,这个134b它离我们最近,那么在这里呢可以1347全部转,当然这个选中它不会显示血条啊。

因为没有用我们自己写的那个函数来选中,那么选中了这个i d之后呢,我们在这里呢,在这里边,那么在这里边我们去攻击它,我们看一下啊,这个离我们就算是最近的东西,那么我们再找一个比较远的,最近的。

那么找一个比较远的,这个是302,它的ip是1352,no 12,那么这个时候呢跑的距离就比较远,他选中了这个怪物啊,一直到这个地方才选中好,那我们再选选中一个比较近的怪物,再试一下。

那我把这里的信息清理掉,这个距离呢它也是发生变化的,哈哈好,那么现在距离最近的就是这个距离八的这个1341,我们看一下老子写字,这个距离比较近,但是呢他也可能在变化,在走动,看看是不是这个腰线细。

一那刚才那个已经被打掉了,134b啊,中间四个这个离得最近,在创新的机会,龙山四天这个时候又离得比较远了,因为他都是在变动的相对比较近,啊应该就是这这个怪物有的比较细好的。

那么我们这个预期的目的也达到了啊,那么这节课呢我们暂时讲到这里,那么下一节课呢我们在对这个相应的这个过来,让它有一个自动啊筛选的一个功能,自动选怪的一个部分,那么今天我们就讲到这里。

P160:171-了解Lua栈及相关操作函数 - 教到你会 - BV1DS4y1n7qF

大家好,我是郁金香老师,那么这节课呢我们一起来对努尔的战略来进行一些了解,那么如果这个站的话,它是一个虚拟的站啊,那么这个站呢主要用来与我们的这个呃函数与函数之间传递参数。

或者是我们的很多我的这个脚本啊,与我们的这个c之间的一个数值数据的一些传递,那么这个站上面的数据的话,它可以是多种类型的啊,也可以是空类型或者是数字啊,字符串啊,或者是呃其他的一些类型啊。

那么我们在后边的这个课程里面呢,我们逐渐的来了解它,那么这个站的话,无论什么时候来,他都是在调用一个函数的时候,它都会产生一个新的站,那么这个的话由于我们呃之前这个d里面的或者是汇编啊。

所以家乡里面的这个站的话也有一些类似啊,每一个空它都是有一个独立的这个账,那么这个站呢它独立于我们的c函数啊,那么也独立于我们以前的这个站,那么所有的这个站的这个操作呢。

它都通过一个索引啊来指向这个战场的任何元素,那么正的这个索引值的话是指站上了一个绝对地址,从一开始,那么获得了的事情是从我们的战警开始的一个偏移量,好的,那么就是说他这个地址的话,一个是从站点开始吧。

一个是从战地开始,那么我们的,这个负数,按照他的这个说法的话,就是从站点开始的一个编号啊,那么我们的正数,那么就是从占比,开始了一个编号,那么而且呢我们每一个哈,每一个这个空或者是函数啊。

都有一个哈呃唯一的,都有一个独立的吧,应该是独立的,在那么我们也有一些相关的操作指令,那么比如说我们它也是一个push指令啊,push number或者复习英特尔,或者是我们复习的字符串这一类的话。

那么这节课呢我们主要是对数字类型的一个入站以及出站啊,进行一个操作,还有就是取得我们站里面的呃相关元素的这个数值啊,好的那么我们先打开我们的vs 2010。

那么我们来做一些与战相关的一些测试。

嗯。

哈哈,那么我们也是先包含相应的头文件啊,要做测试之前呢,我们也是需要在我们相应的这个函数这里的,要注册我们的函数啊,然后呢再开始我们的测试,那么先呢我们可以先写一个啊相应的这个函数。

那么这里呢我们就是在相关的一个测试,那么在这里的话我们来看一下这节课呢,我们主要来看一下这四个与这个站操作啊相关的这个指定,那么我们之前的话应当都学过汇编啊,那么我们知道这个户型是压战啊。

这个pp是出战啊,所以说这前面的这两个的话都是入站的一个操作啊,那么这个呢是一个出战的一个操作,那么最后这一个人呢他是我们的嗯,这个取某一个站里边的啊,数据好的,那么我们先来做一些测试。

那么比如说我们先现在的话这个站呢相当于是一个空的站啊,你这什么都没有,那么我们先往这个站里面呢啊放一些数据进去,传入他的这个支撑啊,比如说我们第一个要战斗,我们编号呢就是集体抗,然后呢我们依次给它编号。

六个啊,1234,六那么我们用这个压战之后,我们怎么来查看这个站里面的这个数据,那么我们如果是呃在不考虑其他的这个啊数值的情况下,不考虑这个数据的这个类型的这个情况下。

我们可以直接就取它的这个相应的这个元素出来,那么因为我们这里全部都是呃右上的是数字类型啊,没有字串,那么所以说我们就不用去判断了,那么直接呢我们就可以了,嗯,把里面的这个相应的数据来取出来。

那么我们取出来之后打印出来看一下,那么注意他这里的类型的话,呃,这个number的这个类型呢,它返回的是我们的double类型啊,是佛典类型,那么我们取它的这个占点的这个元素来看一下,我们看一下啊。

正数正数是从战地开始的啊,这个时候那么我们看一下它占比的这个元素,那么这个先最先入账啊,那么这个呢就是所谓的占比好的,那么我们来看一下这个,当然我们要测试的话,我们还需要呢先要注册这个函数,好。

然后呢我们还要用ui z h的注册一下,那么后边这个呢跟的是我们函数所在的这个地址,那么平时写的时候的话,这个带l的啊,你这个不带l的这两个函数呢,嗯要注意一下啊,那么有时候呢如果是写错了。

编译通不过好,那么注册这个函数之后呢,接下来呢我们就可以以往都是存的方式来来调用它,注意这后面要加上括号,最后呢我们关掉,释放这个相应的这个环境,好的,那么我们来看一下,当然最后呢我们还需要让他暂停啊。

咳咳咳咳咳。

那么这个时候取出来的数字呢是一啊。

也就是我们最先压榨的这个参数,因为最后压榨的啊这个形成了我们的一个啊暂停,这个是在顶端的,那么也就是说他放的这个顺序的话,最后压战的因为是在占顶端,就是64321这样的一个顺序啊,第二战之后的话。

最后呢再占比的就是六啊,然后呢这是4321,那么就是这样的一个存放的一个序列,那么如果我们这里取-1呢,我们再来看一下。

那么这个时候的话-1的话就为六啊。

那么-1的话就是取得占比占点啊,而我们的这个证书的话就是取得我们的呃占比,那么这个是我们就去占据元素,那么取占占点,也就是说我们的可以这样这样说啊,就是说啊倒数的第一个这个或者是从占比开始的第一个参数。

这样好理解,好嘞,在下边呢就是从我们战局开始的啊,第一个元素,那么这个取值的方向它不一样,那么要取值其他的数据呢,我们可以呃依次比如说我们要取这个四,那么从占比开始的话,就是1234,它的序号就是四呃。

那么如果是从栈顶开始呢,就是123,所以说这两个取的都是四,那么我们把上面这个这两句了啊,复制一下,那么这个时候呢我们就是说从栈底开始的话,第四个元素的话就是趋势,而我们反过来说从我们的站点开始的话。

就是第三个元素,1231234,好的,那么我们来看一下,一起。

这两个我们取出来的数字呢啊都是v4 啊。

最后这两个,那么比如说我们要取这个参数,那么这个参数的话我们呢可以了,直接取二或者是负的,1234或者是负,那么这两个数值取出来了。

它都是指向同一个地址,啊都是取出的是数字的二流啊。

那么这里是从我们站点开始的呃,第二个元素,那么这里呢是从我们暂停开始的第五个元素啊,那么这就是我们的站的一个呃元素的一个取值,那么另外呢还有一个出战啊,coco啊出战。

那么出站的话就是把我们占领的这个元素呢弹出去,那么我们就来看一下出战的一个操作啊,啊这一段呢我们就可以先注释掉啊,为了方便测试,那么我们看本来他的这个从战地开始的话是654321,那么我们出战之后。

如果对,那么第一个参数呢同样是它的一个呃这个状态指针,那么第二个呢是要出战的,这个应该是一个个数这个n那么我们出战试一下除在外,然后呢我们再打印出这个占比的元素,看一下是多少,那么暂停的元素的话。

我们说的应该是成都啊,to兰博,然后呢暂停的话我们用-1来表示,啧,好那么我们看一下现在的占比人数是多少,那么现在呢它的元素呢就是四,因为这里弹出了两个元素啊。

那么如果只弹出这一个元素的话,那么就应该是,啊这个时候就是那么如果是弹出了五个元素啊。

那么最后呢可能取得的这个占比和占比都是一了啊。

不管是正一还是-1,这个时候呢他们都指向一个值,因为只有一个元素了,这个时候这就是我们站的一个操作,啧啧啧。

这里的话我们就是弹数五个元素,那么或者是我们呢也可以这样的认为,他把我们的这个战警的这个尺寸改了啊,让它的数值呢减掉了,所以说就指向了这个位置,减掉减1-2-3-4-5就指向了这个位置吧,减掉五个元素。

从这个暂停开始,那么减一的话应该是到这里加2t3 t4 加,那么这是我们的一个啊出战的一个操作,但是出战之后的话,他只对我们的这个占比啊,对整个战有影响,但是如果是没有涉及到我们占领的支撑的话。

他是看不出来是个影响的啊,那么比如说我们这里谈三个,那么它的这个数字能力仍然是一。

因为它只影响到这三个数据啊,这个占几个呢,他暂时没有影响到我们是弹出一个的时候呢,都不会影响到,这是呃占据的一个数据,当然只有这个相应的这个索引啊,弹出的这个数量的值,他超过了我们的呃这个站的大小之后。

或者是达到了一个占的最大的数字时候,才会影响到这个占比,那么我们来看一下弹出六个数据之后会出现什么样的情况。

啊那么这个时候呢它取出来的数字呢就是一个就是零啊。

也就是说可能是我们取数字的时候呢,越界了哈,它已经到了一个未知的一个地方,指向了黄的,这个时候我们在取值的时候,这个呃占点的话,它指向一个未知的一个地方,当然我们的站点的话看就是了,这个时候。

这个时候实际上已经溢出了啊,好的,那么这就是我们的常用的几个指令,那么我们来看一下,还有一个指令不行,英特那么只是push ink来与我们的这个类型不太一样。

这个number呢它的类型呢实际上是stle类型的佛典类型,而这个push inter呢它的这个类型的话是long long long的一个类型啊,也就是说我在这这个环境下的话。

实际上也就是一个经过的差不多是这种类型的,但是不同的平台呢它可能有一些差异,但是在我这个平台上,那么这里呢我们也可以把它替换一下啊,n t e记忆,安提,那么这样的话压战的话它就是压的一个整数。

而不是火点数,那么在这里打印格式的时候就要注意,这个时候要用指数来格式化,不然的话这个时候呢他取出来也肯定是不对的,土郎中啊,他也能够转换。

那么我们用整齐来看不见。

不形成,我这个亚战的时候是压战的一个整数进去,但是呢它沉到了我们的这个佛点站的时候呢,它实际上这个站里面呢它最终转换成了一个数据呢,嗯都是我们的这个打火类型,所以说我们取取值出来的时候的话。

如果是整数的话,必须要强制的转换。

那这个樱桃和这个拉普的话啊,他们都只是说这后面的这个参数的类型不一样,那么这里呢嗯一般呢就不传火点数啊,火点数呢就是呢也会被转换成一个整数的形式进行压战,但是压到站里面的时候呢。

它会有一个自动转换的一个过程,它会最终呢啊转换成这个佛典类型啊,从这里呢我们也能够看到最终的它的呃取出来的这个数值的话啊,他返回了这个数值啊,都是我们的这个打谱类型,那么也有一个整形的啊,to int。

那么这里呢我们可以这样的转换一下,把这个战利品的佛点出来。

最终呢我们转换成我们的这个整数哈。

那这个函数呢我们也把它标记一下,图拉姆的,好最后我们总结一下啊,这个呢是去赚一个盐水,能换成w不会起,那么这里呢最终呢是转换成我们的一种类型范围,那么这个呢是把我们整数啊,把整数转换成最终呢。

它是要把它转换成double类型的,入站压战,不就是,那么这个呢是直接把我们的这个大型压榨,哈哈,那么这个呢是从我们的栈顶弹出几个元素,就相当于来改变了我们这个战局的一个指针的指针的一个地址。

那么比如说这里弹出两个元素的话,它本来这个地址的话,它就会指向这个地址了啊,像这个地址,那么它的这个相应的这个占点的只是相当于会做一个改变啊,好的,那么常见的对战的操作呢,大概就是这一些。

当然还有涉及其他类型的,我们直接啊在这个威胁助手里边呢,也能够看到它还有一些复习的指令,好我们见一下复习,那么我们可以从里边还还能够看到很多很多的呼吸这个什么结果呀,还有其他的数字线程字串啊。

或者是一个呃这个n l啊,空的这个尺寸啊这一类的,那么这里还有l s存储这个,但是呢都大同小异啊,那么我们在后面的这个章节呢,我们逐渐的来了解好的,那么这一期看到我们就暂时呢就呃交流到这里。

那么下一节课呢我们来看一下我们的这个函数啊,怎么利用我们的赞来,就是说呃传递我们函数的一个返回值,那么这个下去之后呢,大家可以对这个lover函数啊啊分词相关的这些资料来进行一下了解,啊,好的。

那么这节课呢我们暂时呢就到这里。

P161:172-C,C++中获得 LUA函数返回值 - 教到你会 - BV1DS4y1n7qF

大家好,我是郁金香老师,那么这节课呢我们主要探讨一下啊,如果函数的返回值啊,那么如果函数的返回值的话,它有一些啊要求,那么首先呢我们要获得它的返回值的话,一般呢我们需要用la获得方式来调用。

那么这个扩的方式呢,首先呢它需要遵循一些啊规定,那么首先我们要调用的这个函数呢应该会首先纳入这个堆栈,然后再次把它相应的这个函数的参数呢按正序压战,那么这个站的话是指指得我们上一节课啊。

讨论的这个路网里面的这个虚拟战好,那么这是对我们相应的这个库的调用的一个要求。

那么另外一个标准的这个路网的这个库,它还有一些呃,也就是lua的函数,它也有一些要求,那么为了正确的与我们的vr通讯呢,那么c函数呢必须使用下列的定义以及返回制的啊传递的一个协议。

那么首先呢我们的参数呢以正序压榨啊,第一个参数呢首先入账,那么因此我们在这个函数开始的时候呢,我们可以用这个lua的get top来获取这个呃参数的个数啊,接受这个参数的个数,好好,那么第一个参数啊。

如果有的话,那么它应当在这个索引之一的地方啊,而最后一个参数呢应当在我们的这个战绩啊,肯定尤其是啊get的拓扑啊,这个地方,一好的,那么我们还是因为他这个的话表示的不是很明确。

那么我们还是以代码啊测试为准,那么我们建立一个啊新的项目工程来测试我们的相关的函数传递的嗯。

这一部分。

那么建立好之后呢,我们可以把上一节课的一些代码呢把它复制进去啊,作为一个测试,当然我们也可以重新写在这里,我们还是找一下171的代。

那么我们171的代码写好了之后呢,我们编译生成一下,那么我们在它的基础上呢,把我们上一节课的这个代码呢,把它呃修改标准啊,那么也就是我们在这个,啊这是一个站的一个操作啊,那么我们另外写一个函数。

或者在这里,就写一个连接啊,累加的一个函数,可,那么按照他的标准来写的话,我们最后这里的return的话是返回的,返回值的一个个数,那么我们最后我们要返回的这个数值的话。

它应当呢呃压在我们的这个进行压榨啊,如果只有一个参数的情况啊,比如说我们在这里的话,那就复习一个兰博,图形硬盘,比如说我们在这里他要返回一个数值333这个数值,那么最后呢他返回的这个参数呢只有一个啊。

这就是一个简单的一个标准的呃,la的一个函数,啊,那么标准的格式呢就是这样的,那么我们要来调用它的话,我们把之前的这些代码把它整理一下,在这里呢我们也首先要注册注册我们的,大,一九。

那么注册了函数之后呢,我们调用呢我们可以用lua core的方式来调用,那么这个入库的方式来调用的话呃,它第一个呢也是环境指针,第二个是参数的呃个数,那么这里呢是返回值的个数,它就这样三个子。

那么我们先把它按照它的格式呢,我们来指定啊,那么首先呢是环境指针状态状态即指针,那么第二个呢我们是他要传入参数的个数,那么比如说我们要传输八个参数,那么后边呢它是返回值的参数,比如说啊只有一个返回值。

但是我们这个扩的话,它没有指定我们要调用的呃,究竟是我们这个dd兰兰或者是这个函数呢,所以说这个呢它也需要指定,那么我们看怎么来指定,那么他说的要调用的这个函数呢,应该啊被压入堆栈,应该首先被压入堆栈。

那么实际上是指的这个要调用这个函数的地址来,应该首先入战,那么在接着的话再把这个呃这个相应的参数来按正序压战,也就是第一个参数来要首先压战啊,那比如说我们这个函数哈最后要计算的这个数值啊。

这个数字比如说是计算哈八个数的论加,比如说我们这1234678这几个数字的一个加的这样的一个函数,那么这里呢他参数呢应该有八个,但是呢我们要知道这个路啊,扩它究竟是去调用的某个函数呢。

那么我们先要先把它的这个地址大战,比如说我们调用这个函数,那么我们就需要把这个a d d number的地址,首先压到我们的这个虚拟战里边,那么我们可以用嗯一个相应的函数来压榨啊。

这个get logo啊,它就是用来压榨我们的全局的这个变量或者函数这一类的,那么后后边呢是这个全局变量的名字,那么这里讲的是a d d number。

那么这一句呢他就是把把这个dd lao的这个地址压到啊,放到我们的这个虚拟战里面啊,那么也就是相当于告诉这个网库嗯,也就是说我们就你会要调用的这个货呢,就是这个a d d number。

那么我们这里呢还有八个参数要压战,那么也就是说要执行八个不复习啊这个命令,那么这里的话我们复习了整数啊,不形成,那么这里呢我们纯净的345678这样压战,那么这是第一个,那么这里加上八个数就行,看一下。

这里是第四个啊,这里是第八个,好的,那么这里呢就一一共呢按照它的说明是八个参数,然后它的返回只有一个啊,这样就可以了,那么最终这里压榨的参数呢的个数的话。

我们可以来在这个hd number里边呢用一个相应的指令来获取啊,如果get top暂停,那么就是它参数的这个个数,那么我们可以用point,要不来把它打印出来,好,好的,那么我们可以先测试一下。

那么这个时候呢他可以发现这个参数的个数是八。

那么为什么这个skt top他能够发现这个呃参数18呢,那么实际上这个参数八呢是从这里传进去的,那么如果我们这里参数改为幺八的话。

我们看这是什么什么样的情况,那么这个时候呢它就会出错了啊。

因为我们实际上没有传入这样多的数字,但是我们可以改小一点,啊这个时候呢我们也会出错啊,所以说我们在这里的话啊,如果只传入了六个参数啊,那么这里呢我们就要呃少复习两个数字。

啊这里呢就能够呃发现了它传入的这个参数的个数呢是六五啊。

好的参数的个数是六,那么所以说实际上呃它获取的这个参数的个数呢就是我们的嗯,这里这个路a库啊传进去这个参数,因为它在这里的话,这个卢卡库它调用的时候呢,也会把这个数字呢进行最后的一个压战啊。

他也会把它压在这个站顶上面去啊,他也会进行一个压战,那么这里呢是最后它返回数值的一个个数啊,相当于是给它分配一个相应的这个空间,那么这里定义了返回值的个数的话,那么在这里呢我们也返回了相应的数字。

比如说333,那么我们在这个这里的代码怎么去取得这个返回的数字呢,那么我们可以这样啊,在这个地方呢,它因为它返回的数值的话,实际上在这里他也是把这个数据呢放在了他的这个虚拟战的占比啊,那么压力占点的话。

我们在这里的话,实际上呢我们就可以用呃,如果,土狼堡来获取图,或者那我取它的这个序列一啊,这里它的这个下标取一就可以了,按照他的这个说法的话,那么法有返回值的时候,它是正序压到车堆在上面的。

那么我们取返回值的时候呢,我们就可以用to int,如果是返回值是整数的话,那么我们直接你可以把它打印出来,啊,好的,那么我们看一下它的返回值。

那么我们发现呢返回值是3x3。

而且它的返回值呢是可以有多个的,那么在这里呢我们也可以另外再传一个返回值啊,或者我们直接传入三个返回值,这里呢111,第一个,第二个,第三个,那么依次加入我们的虚拟战二,最后一个人才是放在我们的呃。

这个占地,那么我们这里正确的话,它是从我们的占比呢呃开始取我们的这个数值,那么也就是说第一个的话它取的是这个一啊,那么这个的话他应该是压在我们的占比,那么如果是取-1的话,才是取这一个好的。

那么我们看一下接触三个返回值的情况,那么呢我们可以分别取123啊,看一下它的三个返回值,当然这个时候呢我们实际上只能够取到一个正确的返回值。

我们来看一下。

那么后边两个是零,为什么没有渠道呢,因为我们在努库的时候来跟他指定它返回的参数个数呢,实际上只有一个啊,所以说不会正确,还有这里的返回值参数呢我们也要改,如果不改的话,我们来看一下啊,它依然不会正确的。

那么所以说这里的参数个数与我们这里的参数个数呢,它一定要保持一致。

那么呢最后的返回值呢它才是正确的啊。

比如说我们这里只有两个的时候,好的返回之前换回录下来看一下。

那么这里呢也只能够取到两个正确的法分子。

那么比如说我们这里是三个返回值,那么这里呢我们也压在哪三个,但是这里我们如果是只返回两个,我们再来看一下嗯。

他的情况,那么这个时候呢同样的不能够渠道啊正确的这个返回值。

所以说这里呢与我们这里的参数个数要对应,那么这个数量八呢要与我们亚战的这个参数啊要对应,全部都要正确,那么最后它参数的啊传入或返回来才会正确啊。

才会正确好的,那么我们把这个函数呢把它改完整,啊这个参数,那么我们最终要实现它的一个累加,那么我们依次来把它的这个相应的数字来取出来,那么再定义一个参数啊,结果,请放他累加的一个结果r。

那么我们要取出里边啊,相应的取出里面所有的这个参数,那么直接用我们的ur再提一个,啊,啊读音口,那么这里呢把它相应的这个下标传进去啊,从一到这个参数的总数,那么这里呢实现一个铝价。

那么最后呢我们把这个数字呢来给它返回,然后到第一个数字这里再改一下,好的,那么这样实现儒家之后,我们再来看一下它相应的这个结果。

啊最后呢我们这里加起来的数字呢呃等于幺八啊,这里我们也可以算出来啊,6+4场,最后来点幺八,那么我们这里再改一下啊,这样的等于要求。

最后努力加到这个数字呢也是正确的。

返回至123啊,都能够返回好的,那么这节课的话我们就,就嗯研究到这里,那么下一节课呢我们再继续探讨哈鲁a其他的呃,这个问题好的。

posted @ 2024-09-30 11:13  绝不原创的飞龙  阅读(2)  评论(0编辑  收藏  举报