jpcsp源码解读之二:main函数与jpcsp的初始化流程

虽然这个软件是用java语言编写,面向对象,可是总要有个开始的入口,这里关心的就是,main函数在哪里。

似乎java中也可以没有main函数,也可能是我的错误认识。暂且不管,jpcsp中是有main函数的。位置是:源包-->jpcsp-->MainGUI.java,在这个文件中搜索main即可找到。

public static void main(String args[])

///

java科普:

public指这个函数是公共的。公共的意思就是,这个类的实例对象可以使用这个方法。private的则只有这个类的函数中可以使用这个方法,这个类的实例对象不能使用。

static指这个方法是静态的。静态就是说,这个方法属于这个类本身,而不是属于这个类的某个特定实例。具体到使用上,用这个类的名字加“.”就可以引用这个方法,而不需要先将这个类实例化,再通过实例化的对象来引用这个方法。

类定义中的static成员变量同理,这种成员一共只有一个实例,而不是对每个对象都生成一个实例。

///

当正式进入到源码中,有必要说一个原则,当追踪源码到达了非jpcsp工程目录的文件,说明那是系统提供的库,而不是jpcsp的源码,此时就没有必要继续向下追踪。通常这样的库函数见名知意,接口含义清晰,不用细究。

比如main函数中可以见到这样一行代码:

UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

光标定位到UIManager上,右击,选 导航,转到源,发现打开的是c盘下某个文件,而不是jpcsp目录下,此时就可以停止深入了。

这行代码的含义很清晰,取得当前系统的外观风格,并且把模拟器的图形界面也设置成这种风格。

///

main函数的行为是:(暂且忽略掉调试和测试相关目的的代码)

1.设置图形界面外观风格。

2.实例化MainGUI,得到maingui对象,并将这个对象设置为可见,也就是在屏幕上显示出来。

然后,然后就没有然后了。。。

因为程序的主体是那个图形界面,后面的工作都由用户事件触发。比如,用户点击了图形界面上的某个图标。这个动作会被那个图标的监听器收到,然后这个监听器来执行相应的动作。

///

在main函数中实例化MainGUI时,会自动调用这个类的构建函数。MainGUI的构建函数中包含了大量初始化操作

public class MainGUI extends javax.swing.JFrame implements KeyListener, ComponentListener, MouseListener, IMainGUI

说明这个类是javax.swing.JFrame的子类,实现了几个listener,也就是监听器。

swing是java图形的一个类库。JFrame是图形框架,这个框架里面可以放进各种组件,比如 按钮 画布 等。

来看一下MainGUI这个类的成员变量:

MemStickBrowser memstick;                                   //存储卡浏览器

    Emulator emulator;                                            //模拟器

    UmdBrowser umdbrowser;                                     //umd浏览器

    UmdVideoPlayer umdvideoplayer;                              //umd视频播放器

    InstructionCounter instructioncounter;                      //

    File loadedFile;                                                        //已经载入的文件

    boolean umdLoaded;                                               //umd光盘是否已经加载

    boolean useFullscreen;//是否要全屏

    JPopupMenu fullScreenMenu;                                 //全屏菜单,因为全屏时主界面上的菜单等都没有了,所以需要另外做这些界面出来

    private Point mainwindowPos;                                 // 窗口位置stores the last known window position

只截取了其中一部分,因为其余的我也没仔细看呢,这些都比较明显,就先注释上了。而且其中包含了比较关键的成员,比如加载了的umd光盘镜像文件,模拟器类,等。

///

MainGUI的初始化流程:

1.首先是一些关于日志的,忽略

2.打开三个用户目录

3.实例化Emulator

4.Screen类启动,这个类的规模很小,行为已经解读完毕,将在下一篇文章中具体说明。

5.设置语言

6.配置窗口位置

7.设置分辨率

8.创建界面中的图形组件 

    createComponents这个函数的实现部分是自动生成的,所以不用细看

9.设置日志窗口的位置,忽略

10.设置软件的Title,也就是软件名称

11.向图形界面中添加画布canvas,这个画布相当于游戏机的显示器了

12.取得组件的外部填充,即组件与其显示区域边缘之间间距的最小量,再用这个量结合游戏机屏幕的尺寸,得到最小尺寸。

13.将调试用的控制台置于主窗口下方

///

以上只是大体的初始化流程,可以看到这份源码的一个粗略框架。至少大概知道这个图形界面是怎么出现在屏幕上的了。

之后的事情就交给了各个事件的监听器。

可以想见,当用户点击了载入umd的按钮,会触发监听器等待用户以某种方式输入一个光盘镜像文件,然后软件记录下这个镜像文件。

之后,当用户点击了运行游戏的按钮,监听器监听到之后,会从刚才记录下的镜像文件中得到游戏的可执行文件,并解释执行,这样模拟器就真正运转起来了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值