13.3.2 初始化游戏状态数据(1)
为了初始化游戏状态,程序需要创建一个NSArray数组,为此,程序定义一个FKBaseBoard基类,该基类的代码如下。
程序清单:codes/13/Link/Link/sources/board/FKBaseBoard.h
- @interface FKBaseBoard : NSObject
- - (NSArray*) createPieces:(NSArray*)pieces;
- - (NSArray*) create;
- @end
程序清单:codes/13/Link/Link/sources/board/FKBaseBoard.m
- @implementation FKBaseBoard
- // 定义一个方法, 让子类去实现
- - (NSArray*) createPieces:(NSArray*)pieces
- {
- return nil;
- }
- - (NSArray*) create
- {
- // 创建FKPiece的二维数组
- NSMutableArray* pieces = [[NSMutableArray alloc] init];
- for(int i = 0 ; i < xSize ; i++)
- {
- NSMutableArray* arr = [[NSMutableArray alloc] init];
- for (int j = 0 ; j < ySize ; j++)
- {
- [arr addObject:[NSObject new]];
- }
- [pieces addObject:arr];
- }
- // 返回非空的FKPiece集合,该集合由子类实现的方法负责创建
- NSArray* notNullPieces = [self createPieces:pieces]; //①
- // 根据非空FKPiece对象的集合的大小来取图片
- NSArray* playImages = getPlayImages(notNullPieces.count);
- // 所有图片的宽、高都是相同的,随便取出一个方块的宽、高即可
- int imageWidth = [[playImages objectAtIndex:0] image].size.width;
- int imageHeight = [[playImages objectAtIndex:0] image].size.height;
- for (int i = 0; i < notNullPieces.count; i++) // 遍历非空的FKPiece集合
- {
- // 依次获取每个FKPiece对象
- FKPiece* piece = [notNullPieces objectAtIndex:i];
- piece.image = [playImages objectAtIndex:i];
- // 计算每个方块左上角的X、Y坐标
- piecepiece.beginX = piece.indexX * imageWidth + beginImageX;
- piecepiece.beginY = piece.indexY * imageHeight + beginImageY;
- // 将该方块对象放入方块数组的相应位置处
- [[pieces objectAtIndex:piece.indexX]
- setObject:piece atIndex:piece.indexY];
- }
- return pieces;
- }
- @end
上面的粗体字代码块用于初始化NSArray代表的二维数组,为有方块的FKPiece元素的beginX、beginY、image属性赋值,beginX、beginY根据该方块在二维数组中的位置动态计算得到。
上面程序中用到了xSize、ySize等常量,这两个常量用于代表该游戏在横向和纵向上各包含多少个方块。程序专门定义了一个Constants.h文件来记录这些常量的值,后面有些类也用到了该头文件中的常量,请读者参考本书配套光盘中的Constants.h文件。
程序中的①号代码调用了createPieces:方法来创建一个NSArray集合,该方法将会交给其子类去实现,这里是典型的"模板模式"的应用。FKBaseBoard基类完全可以根据FKPiece对象在二维数组中的位置动态地计算它的beginX、beginY,但FKBaseBoard不确定NSArray代表二维数组的哪些元素是有方块的。