游戏过程中会从文件系统中读取大量的图片文件,如果没有资源管理器,那么很可能会出现在内存中有同一份资源的多份拷贝,因此设计了资源管理器。

  这里先简单归纳一下自己定义的一些文件类型:

         1、spk:sprite package文件。这个文件保存这构建精灵所需要的资源。包括精灵的帧池,以及动作组的参数。

         2、ppk:picture package文件。这个文件包含一组图片。主要用来构建图片数字控件,或者按钮。

  资源管理器提供一系列getXXX(path)方法来根据一个标识符来获取各种资源。目前只是通过一个路径来标识资源。再以后的完善中,会在外面提供一个类,里面包含一些列字符串,那些字符串是一些比路径更具可读性的标识符,当然他们的值还是路径。思路参考安卓中R.java。

  目前getImage(path)方法来获取图片。getPPkDef(path)方法来获取ppk文件,一般用来创建控件。getSpriteDef(path)来获取spk文件,它用来创建精灵。

  对应的removeXXX(ptah)方法用来释放资源:当该资源没有再被对象引用时,释放文件资源。在GameHolder对象中,每释放一个对象,就会调用相应的removeXXX(path)方法。

  资源管理器对于资源的管理目前是这样子实现的,对于每一类资源,都有一个HashMap来持有一个<路径,资源引用>对,当GameHolder请求获取一个资源文件时,传入path来申请,如果资源管理器已经调入了这个资源,那么直接返回该资源的引用。如果没有该资源,那么它就试图去加载改资源,然后返回该引用。

  remove方法现在只是做的比较简单,在切换地图的时候,将不在需要的时候资源都释放掉。对于某些比较严格的游戏,可能需要设计成当没有对象引用某资源时就释放该资源。对于这种差别,要将改动只影响资源管理器模块。也就是说,外部(GameHolder)不应该关心调用remove方法到底会怎么样,外部只是按照约定当删除一个对象之后,就要调用一次对应的remove方法。

  提供clearXXX方法来暴力清空对应资源列表,当然这是必须要GameHold保障安全的,一般在loading前,可以清空资源列表以便腾出空间给接下来的资源用。。。

  clearAll方法提供一种简便清楚所有资源的方法。

  不对外部暴露HashMap,因为HashMap只能由自己调控。这样能够让自身的改动影响最小。