技术开发 频道

Android游戏开发:初始化游戏状态数据

  【IT168技术】本文是Android游戏开发系列文章的第五篇,讲解了如何初始化游戏状态的数据。为了初始化游戏状态,程序需要创建一个Piece[][]数组,为此程序定义一个AbstractBoard抽象类,该抽象类的代码如下。

  程序清单:codes\18\Link\src\org\crazyit\link\board\AbstractBoard.java

public abstract class AbstractBoard
{
    
// 定义一个抽象方法, 让子类去实现
    protected abstract List
<Piece> createPieces(GameConf config,
        Piece[][] pieces);
    
public Piece[][] create(GameConf config)
    {
        
// 创建Piece[][]数组
        Piece[][] pieces
= new Piece[config.getXSize()][config.getYSize()];
        
// 返回非空的Piece集合, 该集合由子类去创建
        List
<Piece> notNullPieces = createPieces(config, pieces);      //
        
// 根据非空Piece对象的集合的大小来取图片
        List
<PieceImage> playImages = ImageUtil.getPlayImages(config.get
        Context(),
            notNullPieces.size());
        
// 所有图片的宽、高都是相同的
        
int imageWidth = playImages.get(0).getImage().getWidth();
        
int imageHeight = playImages.get(0).getImage().getHeight();
        
// 遍历非空的Piece集合
        
for (int i = 0; i < notNullPieces.size(); i++)
        {
            
// 依次获取每个Piece对象
            Piece piece
= notNullPieces.get(i);
            piece.setImage(playImages.get(i));
            
// 计算每个方块左上角的X、Y坐标
            piece.setBeginX(piece.getIndexX()
* imageWidth
                
+ config.getBeginImageX());
            piece.setBeginY(piece.getIndexY()
* imageHeight
                
+ config.getBeginImageY());
            
// 将该方块对象放入方块数组的相应位置处
            pieces[piece.getIndexX()][piece.getIndexY()]
= piece;
        }
        return pieces;
    }
}

  上面的程序中粗体字代码块用于初始化Piece[][]数组,初始化代码负责为各非空的Piece元素的beginX、beginY、image属性赋值,其中beginX、beginY根据该方块在二维数组中的位置动态计算得到。

  上面的程序中①号代码调用了createPieces(config, pieces)抽象方法来创建一个List集合,该抽象方法将会交给其子类去实现,这里是典型的“模板模式”的应用。AbstractBoard抽象基类完全可以根据Piece对象在二维数组中的位置动态地计算它的beginX、beginY,但AbstractBoard不确定Piece[][]数组的哪些元素是非空的。

  由于连连看游戏的初始状态可能有很多种——比如横向分布的方块、竖向分布的方块、矩阵排列的方块、随机分布的方块等,该程序为了考虑以后的扩展性,此处只是采用了模板模式:定义AbstractBoard抽象基类来完成通用的代码,而暂时无法确定、需要子类实现的方法定义成createPieces(GameConf config, Piece[][] pieces)抽象方法。

  上面的程序中还用到了一个ImageUtil工具类,它的作用是自动搜寻/res/drawable-mdpi目录下的图片,并根据需要随机地读取该目录下的图片。后面会详细介绍该工具类的用法。

0
相关文章