wtk中audioDemo例子小球碰撞算法

本文详细解析了一个二维游戏中小球反弹的实现方法,通过定义方向变量和碰撞检测,利用矩阵来更新小球的位置和方向,确保其在边界内合理反弹。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

例子中小球的运动方向只有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])
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值