疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

android开发—连连看开发技巧(11)


 

android开发—连连看开发技巧(11)

获取触.碰.点的方块

      当用户触碰游戏界面时,事件监听器获取的是该触碰点在游戏界面上的X、Y座标,但程序需要获取用户触碰的到底是哪个方块,因此程序必须把界面上的X、Y座标换算成在Piece[][]二维数组中的两个索引值。
      考虑到游戏界面上每个方块的宽度、高度都是相同的,因此想将界面上的X、Y座标换算成Piece[][]二维数组中的索引也比较简单,只要拿X、Y座标值除以图片的宽、高即可。下面方法是根据触碰点X、Y座标获取对应方块的代码:
程序清单:codes18LinksrcorgcrazyitlinkoardimplGameServiceImpl.java
// 根据触.碰.点的位置查找相应的方块
@Override
public Piece findPiece(float touchX, float touchY)
{
         // 由于在创建Piece对象的时候, 将每个Piece的开始座标加了
         // GameConf中设置的beginImageX/beginImageY值, 因此这里要减去这个值
         int relativeX = (int) touchX - this.config.getBeginImageX();
         int relativeY = (int) touchY - this.config.getBeginImageY();
         // 如果鼠标点击的地方比board中第一张图片的开始x座标和开始y座标要小, 即没有找到相应的方块
         if (relativeX < 0 || relativeY < 0)
         {
                   return null;
         }
         // 获取relativeX座标在Piece[][]数组中的第一维的索引值
         // 第二个参数为每张图片的宽
         int indexX = getIndex(relativeX, GameConf.PIECE_WIDTH);
         // 获取relativeY座标在Piece[][]数组中的第二维的索引值
         // 第二个参数为每张图片的高
         int indexY = getIndex(relativeY, GameConf.PIECE_HEIGHT);
         // 这两个索引比数组的最小索引还小, 返回null
         if (indexX < 0 || indexY < 0)
         {
                   return null;
         }
         // 这两个索引比数组的最大索引还大(或者等于), 返回null
         if (indexX >= this.config.getXSize()
                  || indexY >= this.config.getYSize())
         {
                   return null;
         }
         // 返回Piece[][]数组的指定元素
         return this.pieces[indexX][indexY];
}
       上面方法中两行粗体字代码用于根据触.碰.点X、Y座标来计算它在Piece[][]数组中的索引值。该方法调用了getIndex(int relative , int size)进行计算。
       getIndex(int relative , int size)方法的实现就是拿relative除以size,只是程序需要判断可以整除和不能整除两种情况:如果可以整除,说明还在前一个方块内;如果不能整除,则对应于下一个方块。下面是getIndex(int relative , int size)方法的代码:
程序清单:codes18LinksrcorgcrazyitlinkoardimplGameServiceImpl.java
// 工具方法, 根据relative座标计算相对于Piece[][]数组的第一维
// 或第二维的索引值 ,size为每张图片边的长或者宽
private int getIndex(int relative, int size)
{
         // 表示座标relative不在该数组中
         int index = -1;
         // 让座标除以边长, 没有余数, 索引减1
         // 例如点了x座标为20, 边宽为10, 20 % 10 没有余数,
         // index为1, 即在数组中的索引为1(第二个元素)
         if (relative % size == 0)
         {
                   index = relative / size - 1;
         }
         else
         {
                   // 有余数, 例如点了x座标为21, 边宽为10, 21 % 10有余数, index为2
                   // 即在数组中的索引为2(第三个元素)
                   index = relative / size;
         }
         return index;
}

(未完.摘自[疯狂Android讲义].李刚)