游戏辅助原理与制作第三课--------基址与动态地址
2018-02-24 21:32
399 查看
在前面一节课我们已经实现了游戏的阳光值修改,并且也写出了程序,现在我们重新打开游戏,再启动我们写的程序,并进行修改:
![](https://img-blog.csdn.net/20180224185221268?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhb2thbmdkcmVhbQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
我们发现,修改失败!这是为什么呢?难道我们的阳光的内存地址发生了变化?
我们打开工具,再次进行寻找:
![](https://img-blog.csdn.net/20180224185505202?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhb2thbmdkcmVhbQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70)
我们重新寻找后,发现现在的阳光内存地址为:171A2578,而我们之前所找到的地址是:20194DC8。看来我们的阳光地址已经发生了变化,那这到底是为什么呢?
这里,一些C/C++比较好的同学和有过游戏开发经验可能已经推断出来了,其实这就是我们C/C++语言通常用到的一个做法:动态内存分配。
我们把游戏的阳光值当作C语言的一个变量,可以简单的理解为:int n_sunshine;那么这个游戏的经过编译后,这个变量的地址在以下几种情况下是会发生变化的:
1.作为局部变量的时候。
2.n_sunshine在某个结构体(或者类)里面,而这个结构体或者类的内存是动态分配的。
当其作为全局变量时,程序编译的时候已经分配好了全局数据区的地址,所以里面的数据地址是不会变得。简单点来说,动态分配就是在运行时分配的,具体怎么分配,由操作系统决定,而全局变量的地址,是编译时就确定的,所以是不会变的。
那么,阳光值到底是怎样的一个情况呢。对于游戏的开发,一般都是面向对象的,所以我们可以推测阳光值这个变量应该在某个类的示例指针里面,类的示例指针在运行时进行动态内存的分配,为其分配内存。为了阐述这个过程,我用简单的代码的表示:
class Game_Info{
int n_Sunshine;//阳光值
....//其它成员
}
Game_Info *Game_Info_PvZ;
int main()
{
Game_Info_PvZ = new Game_Info;
return 0;
}
在代码中,我定义了一个类Game_Info,并定义了这个类的示例指针Game_Info_PvZ。这个指针变量的地址,是存在全局数据区的,地址并不会随运行改变。在主函数中,我们为这个实例指针动态分配了内存,这句代码是在运行中执行的,所以所分配的内存的地址是不定的,所以阳光值的地址也是不定的。
到这里,我们就可以解释为什么我们每次找的阳光地址都发生了改变了 。我们这里提出两个概念:基址和动态地址。对于这里的基址,我们可以理解成在全局数据区的数据的地址,它的地址是不会发生改变的。对于动态地址,则是我们程序在运行时动态分配的地址,它的地址是不会发生改变的。
我们发现,修改失败!这是为什么呢?难道我们的阳光的内存地址发生了变化?
我们打开工具,再次进行寻找:
我们重新寻找后,发现现在的阳光内存地址为:171A2578,而我们之前所找到的地址是:20194DC8。看来我们的阳光地址已经发生了变化,那这到底是为什么呢?
这里,一些C/C++比较好的同学和有过游戏开发经验可能已经推断出来了,其实这就是我们C/C++语言通常用到的一个做法:动态内存分配。
我们把游戏的阳光值当作C语言的一个变量,可以简单的理解为:int n_sunshine;那么这个游戏的经过编译后,这个变量的地址在以下几种情况下是会发生变化的:
1.作为局部变量的时候。
2.n_sunshine在某个结构体(或者类)里面,而这个结构体或者类的内存是动态分配的。
当其作为全局变量时,程序编译的时候已经分配好了全局数据区的地址,所以里面的数据地址是不会变得。简单点来说,动态分配就是在运行时分配的,具体怎么分配,由操作系统决定,而全局变量的地址,是编译时就确定的,所以是不会变的。
那么,阳光值到底是怎样的一个情况呢。对于游戏的开发,一般都是面向对象的,所以我们可以推测阳光值这个变量应该在某个类的示例指针里面,类的示例指针在运行时进行动态内存的分配,为其分配内存。为了阐述这个过程,我用简单的代码的表示:
class Game_Info{
int n_Sunshine;//阳光值
....//其它成员
}
Game_Info *Game_Info_PvZ;
int main()
{
Game_Info_PvZ = new Game_Info;
return 0;
}
在代码中,我定义了一个类Game_Info,并定义了这个类的示例指针Game_Info_PvZ。这个指针变量的地址,是存在全局数据区的,地址并不会随运行改变。在主函数中,我们为这个实例指针动态分配了内存,这句代码是在运行中执行的,所以所分配的内存的地址是不定的,所以阳光值的地址也是不定的。
到这里,我们就可以解释为什么我们每次找的阳光地址都发生了改变了 。我们这里提出两个概念:基址和动态地址。对于这里的基址,我们可以理解成在全局数据区的数据的地址,它的地址是不会发生改变的。对于动态地址,则是我们程序在运行时动态分配的地址,它的地址是不会发生改变的。
相关文章推荐
- 游戏辅助原理与制作第九课--------编写程序实现植物种植
- 游戏辅助原理与制作第一课--------作者介绍与浅谈游戏辅助
- 游戏辅助原理与制作第十课--------植物大战僵尸后台运行思路
- 游戏辅助原理与制作第一课--------作者介绍与浅谈游戏辅助
- 游戏辅助原理与制作第四课--------寻找植物大战僵尸的阳光基址
- 游戏辅助原理与制作第二课--------植物大战僵尸修改阳光(一)
- 游戏辅助原理与制作第二课--------植物大战僵尸修改阳光(一)
- 游戏辅助原理与制作第五课--------编写植物大战僵尸修改阳光外挂
- 游戏辅助原理与制作第六课--------植物大战僵尸免冷却思路(一)
- 游戏辅助原理与制作第八课--------植物大战僵尸种植植物CALL的寻找思路
- 游戏辅助原理与制作第六课--------植物大战僵尸免冷却思路(二)
- 追逐自己的梦想----------辅助制作第三课:注入辅助窗口到游戏进程中
- 游戏辅助原理与制作第七课--------编写程序,实现植物大战僵尸免冷却
- 如何快速制作脚本之学习怎么开发游戏辅助中自动加血的脚本——以按键精灵脚本制作的颜色坐标选取为例
- unity3d制作2d游戏的原理
- 游戏外挂的原理及制作 (1)
- iOS平台游戏安全之IPA破解原理及防御(第三弹)
- 追逐自己的梦想----------辅助制作第十五课:实现动态更新基址
- [z]C#使用WebBrowser制作网页游戏辅助工具关键技术分析
- 武林外传辅助工具详细制作过程[第一篇:基址的寻找方法]