例子中小球的运动方向只有4种,也就是左上,右上,左下,右下。其余的方向都没有,比如水平,垂直方向都没有。
每次
posX=posX+deltaX;
posY=posY+deltaY;
来改变位置。deltaX,deltaY可为+1也可为-1。
用direction作为一个方向的合成量代表四个方向,分别是-2,-1,1,2。但是它不能取0。
比如方向是左上,那么这时候deltaX = -1, deltaY = -1,则direction = -2,代表左上方向。
再举个例子,右上方向,这个时候deltaX = 1, deltaY = -1,
由 if (direction == 0) direction = deltaX + 2*deltaY; 这句,可以控制direction = -1。
同理,依次类推。
左上:direction = -2
右上:direction = -1
左下:direction = 1
右下:direction = 2
如果小球越界的话,
if (posX <= left || posX >= right)或if (posY <= top || posY >= bottom)
就改变小球的运行轨迹,无非是deltaX就让它等于-deltaX,deltaY = -deltaY。
先排除干扰,不考虑矩阵的列,只考虑行。那么看看这段代码。
deltaX = matrix[direction + 2][collision];
deltaY = matrix[direction + 2][collision + 1];
direction + 2意味着它的值只能取
-2 + 2 = 0
-1 + 2 = 1
1 + 2 = 3
2 + 2 = 4
取值是0,1,3,4正好符合矩阵
static int[][] matrix = {
{ 1,-1, -1, 1, 1, 1 },
{ -1,-1, 1, 1, -1, 1 },
null,
{ 1, 1, -1,-1, 1,-1 },
{ -1, 1, 1,-1, -1,-1 }
};
中间那行是null。
上边说了,矩阵的行,表示4种方向情况。
现在考虑来考虑列。看看列代表什么含义。
列的控制是由collision来完成的。
int collision = 0;
if (posX <= left || posX >= right) collision++; //如果是左右越界的情况
if (posY <= top || posY >= bottom) collision += 2; //如果是上下越界的情况
这段代码可以看出,collision如果不越界,就是0,如果越界,要么是1,要么是2。
下面这段代码
if (collision != 0) {
try {
javax.microedition.media.Manager.playTone(note, 100/*ms*/,100);
} catch (Exception ex) {
System.out.println("failed to play tone");
}
collision = (collision - 1) * 2;
deltaX = matrix[direction+2][collision];
deltaY = matrix[direction+2][collision+1];
}
try,catch不看,就是小球碰到墙壁响一下。
看collision = (collision - 1) * 2;
因为上边说过,
collision不是1就是2。
1的情况,(1 - 1)* 2 = 0
2的情况,(2 - 1)* 2 = 2
那么collision的最终取值也就是0,2。
0代表左右越界的时候,
2代表上下越界的情况。
那么那么由
deltaX = matrix[direction+2][collision];
deltaY = matrix[direction+2][collision+1];
知道,当collision = 0时,列分别为0,1。
当collision = 2时,列分别为2,3。
所以刚才的矩阵是迷惑人的。完全可以是下边的替代,最后两列的数据是无效的,永远访问不到。
static int[][] matrix = {
{ 1,-1, -1, 1 },
{ -1,-1, 1, 1 },
null,
{ 1, 1, -1,-1 },
{ -1, 1, 1,-1 }
};
明白了行,列的含义。那么可以随便找种情况分析了。
比如下边这种情况
\ /
┘ ┐
\/
————
由右下方向碰到墙后往右上走。
咱们自己先判断一下,没碰墙前应该deltaX = 1,deltaY = 1,
碰墙后deltaX = 1,deltaY = -1。
下边验证自己的想法是否正确。
行的情况是 右下,也就是direction = 2.
列的情况是 上下越界,也就是collision = 2.
由
deltaX = matrix[direction + 2][collision];
deltaY = matrix[direction + 2][collision + 1];
得
deltaX = matrix[4][2];
deltaY = matrix[4][3];
看看矩阵
static int[][] matrix = {
{ 1,-1, -1, 1 },
{ -1,-1, 1, 1 },
null,
{ 1, 1, -1,-1 },
{ -1, 1, 1,-1 } //<---- 1, -1 ([4][2], [4][3])
};