minecraft吧 关注:2,482,894贴子:30,873,268

[17-02-06]【程序员乱入】Minecraft源代码分析

取消只看楼主收藏回复

MC源代码镇楼


回复
1楼2017-02-06 15:44
    先自我介绍一下:本人初二,会C++和Java


    收起回复
    2楼2017-02-06 15:44
      今天上午发过一个这样的贴,但是因为没有加前缀被删掉了,因此现在重发(多谢吧主恢复)


      回复
      3楼2017-02-06 15:46
        正好前面看到了这两个贴:
        http://tieba.baidu.com/p/4421623213
        http://tieba.baidu.com/p/4684133375
        都和MC源代码有关,一个是反编译,一个是分析冷知识
        然后因为楼主也是热爱编程的人,而又没有怎么在本吧发过“有意义”的贴(目前只有一个自己造MC2D的贴,其他都是提问),所以脑子一热,决定发一贴


        收起回复
        4楼2017-02-06 15:46
          PS:不保证不会弃坑,因为MC的代码实在太~太~太~难了!(╯‵□′)╯︵┻━┻


          回复
          5楼2017-02-06 15:46
            首先,要研究Minecraft的源代码,我们需要首先取得它的源代码。有两种方式:
            1. 自己反编译,参见http://tieba.baidu.com/p/4421623213
            2. 直接下载已经存在的代码
            链接:https://pan.baidu.com/s/1o8EkoGUhttp://tieba.baidu.com/p/4684133375 21楼)
            备用链接:https://pan.baidu.com/s/1qYfKS6S(自己发的)


            收起回复
            7楼2017-02-06 15:46
              代码是mcp910,对应于Minecraft 1.8


              回复
              8楼2017-02-06 15:46
                好了,我要开始了!!!


                回复
                9楼2017-02-06 15:46
                  众所周知,看一份C/C++、Java代码时,应该寻找它的“入口点”——main()函数。现在就让我们去寻找它


                  回复
                  10楼2017-02-06 15:47
                    打开文件夹(确保你已经解压),进入src/minecraft文件夹,看见一个Start.java,或许这就是main()函数所在的文件?打开看看:

                    Start.java里定义了一个Start类,里面定义了两个方法:一个是main()函数,是程序的入口点;另一个是concat函数,用来拼接两个数组,这个我们可以不管它


                    回复
                    11楼2017-02-06 15:47
                      main()里面只有一条语句:


                      Main.main(concat(new String[] {"--version", "mcp", "--accessToken", "0", "--assetsDir", "assets", "--assetIndex", "1.8", "--userProperties", "{}"}, args));


                      这句语句的意思是调用Main类的main()方法,而且是静态的。再看一看前面有这样一句:


                      import net.minecraft.client.main.Main;


                      import的意思是导入。(记得当我开始研究Minecraft代码时,根本不知道import怎么用我都知道这是什么意思。)


                      看回刚才的目录,有个net文件夹;打开它,发现有个minecraft文件夹;然后发现有个client文件夹;然后是main;最后看见一个Main.java。


                      回复
                      12楼2017-02-06 15:47
                        没错,net.minecraft.client.main.Main指的是net/minecraft/client/main/Main.java中定义的Main类。import后面加的net.minecraft.client.main是包(package,Java里的概念),如果没学过Java可以暂时认为代表一个目录。


                        回复
                        13楼2017-02-06 15:47
                          好,现在打开net/minecraft/client/main/Main.java,一共有122行。找到main()。(为什么有两个main()?)

                          一堆初始化。翻到结尾看看?

                          最后一句是(new Minecraft(var42)).run(),如果一个类叫Minecraft,那这应该是代码的核心了。new Minecraft(var42)意思是让Java创建一个Minecraft对象,并把var42作为参数(类型为GameConfiguration,可以不管)传给其构造函数。


                          收起回复
                          14楼2017-02-06 15:47
                            还是老样子,17行有一句:


                            import net.minecraft.client.Minecraft;


                            打开net/minecraft/client目录下的Minecraft.java。看到的就是镇楼图上的代码。


                            回复
                            15楼2017-02-06 15:48
                              按理说应该先找到Minecraft类的构造函数,叫做Minecraft()。记住,Minecraft代码中,xxx.java就代表文件里定义了一个xxx类。但是这里这不是最重要的。我们直接找到run()。但是Minecraft.java里有3307行啊,你怎么能快速地找到run()呢?使用搜索功能。

                              (如果你不使用Eclipse你就要自己了解一下怎么查找了)


                              收起回复
                              本楼含有高级字体16楼2017-02-06 15:48