开发项目时,编写公共类可以减少重复代码的编写,进而提高代码的重用性和维护性。本游戏创建了两个公共类文件:GameImageUtil.java(图片工具类)和GameMapUtil.java(关卡工具类)。接下来,我们将分别对这两个公共类中的方法进行详细介绍。
GameImageUtil图片工具类用于统一管理本游戏所使用的图片。本游戏的所有图片都被放置在com.mr.image包中,并使用静态常量IMAGE_PATH来记录该包的路径。GameImageUtil类提供了玩家图片、箱子未到达目的地图片、箱子已到达目的地图片、墙图片、目的地图片和开始面板的背景图片,代码如下:
private static final String IMAGE_PATH = "src/com/mr/image"; // 图片存放的路径 public static BufferedImage playerImage; // 玩家图片 public static BufferedImage boxImage1; // 箱子未到达目的地图片 public static BufferedImage boxImage2; // 箱子已到达目的地图片 public static BufferedImage wallImage; // 墙图片 public static BufferedImage destinationImage; // 目的地图片 public static BufferedImage backgroundImage; // 背景图片
由于所有图片对象均为静态属性,它们不能在构造方法中被直接赋值。因此,本类使用静态代码块为这些图片对象进行初始化赋值。静态代码块代码如下:
GameMapUtil是一个关卡工具类,它作为本游戏读写关卡文件的接口,封装了所有与关卡文件相关的操作。
GameMapUtil类定义了三种类型的静态常量:关卡文件中各元素的占位符、关卡文件的存放路径以及自定义关卡的名称。其中:占位符常量和关卡文件的存放路径常量是私有的,因为它们仅在类内部使用;而自定义关卡名称常量是公有的,因为它需要在类的外部(如地区编辑器中)使用。所有静态常量如下:
createMap()方法用于创建关卡文件。该方法在关卡文件中使用占位符来记录各个游戏元素所在的位置。该方法接收两个参数:第一个参数arr是一个数组,它表示关卡中的模型矩阵;第二个参数mapName表示要创建的关卡文件的名称。该方法会解析arr数组中的所有模型对象,并根据模型对象所属的类型,在字符串data中填充相应的占位符。最后,该方法使用文件输出流将字符串data写入指定的关卡文件中。
该方法的具体代码如下:
本游戏需要通过readMap()方法将关卡文件数据转为Map关卡类对象。该方法中的mapName参数指定了要读取的关卡文件的名称。本游戏的默认关卡以数字命名,而用户自己绘制的关卡则使用其原有的CUSTOM_MAP_NAME属性值命名,因此该方法参数的类型是字符串。
readMap()方法通过文件输入流逐行读取关卡文件中的字符,然后创建20×20的模型类数组data。接着,该方法判断读出的字符属于哪种模型类型,并在数组data对应的位置上创建模型对象。通过这种方式,该方法将文件数据转换为模型矩阵数组。最后,该方法根据填充好的数组data创建Map关卡对象,从而完成读取关卡文件的功能。
方法的具体代码如下:
除了之前的方法,还有一个重载的读取关卡文件数据的方法,它可以直接接收一个int类型变量作为参数。使用int参数有利于本游戏计算关卡数。重载方法会自动将int类型转换为String类型,代码如下:
readCustomMap()方法专门用于读取用户绘制的自定义关卡文件。由于自定义文件的文件名是固定的,因此该方法不需要传入任何参数。
readCustomMap()方法首先会检查用户是否创建了自定义关卡。如果没有创建,则返回null;否则调用readMap()方法读取自定义文件。
readCustomMap()方法具体代码如下所示:
因为本游戏通关一个关卡之后会自动进入下一个关卡,所以需要判断本游戏共有多少关卡,当通过最后一个关卡之后,本游戏要回到开始界面。getLevelCount()方法就是用来返回总关卡数的。
getLevelCount()方法会读取MAP_PATH路径下的所有文件。如果这些文件中包含用户绘制的自定义关卡,则返回文件总数−1作为总关卡数;否则返回总文件数。如果MAP_PATH路径表示的不是某个文件夹,则该方法直接返回0。
方法的具体代码如下:
当用户重启本游戏之后,会自动将清除以前创建的自定义关卡。clearCustomMap()方法用于实现此功能,该方法会在主窗体创建时被调用,以清除过去的自定义关卡文件。
方法的具体代码如下: