您的位置:首页 > 其它

简单碰撞算法及其demo(屏幕气泡原理)

2016-05-05 17:28 501 查看


想要做成的效果就是上面的图上的效果,当小球碰到屏幕的边缘的时候,则会改变方向!

原理分析:



原理就是上图描述的那样了.

1速度V0,初始位置和初始角度是需要初始确定的

2根据初始角度和速度V0,计算出在XY轴上的分速度,然后draw完一次就更新一次小球的位置,不停的draw和更新位置

3更新位置后判断此时小球是否到达了X轴,Y轴的边界,如果是则更改在该轴的方向

代码分析:

1.确定初始值

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
top = getTop() + radius + paintWidth/2;
left = getLeft() + radius + paintWidth/2;
right = getRight() - radius + paintWidth/2;
bottom = getBottom() - radius + paintWidth/2;
point.set(500, bottom);

}


在该demo中,初始速度为XY方向上每次更新变化5个像素,所以默认的角度也就是45°,初始位置在onmeasure中确定了

2,3 更新小球位置并判断小球位置是否到达边界并更新界面

@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawCircle(point.x, point.y, 30, paint);
// 判断x轴方向上的坐标
if (point.x <= left) {
isXUp = true;
} else if (point.x >= right) {
isXUp = false;
}
// 更新x轴上的位置
if (isXUp) {
point.x = point.x + 5;
} else {
point.x = point.x - 5;
}

// 判断y轴方向上的坐标
if (point.y <= top) {
isYUp = true;
} else if (point.y >= bottom) {
isYUp = false;
}
// 更新y轴上的位置
if (isYUp) {
point.y = point.y + 5;
} else {
point.y = point.y - 5;
}
postInvalidate();//在此处可以使用delay时间来改变更新频率,但是实际使用会有卡顿效果不好
}


通过上面的代码就可以通过不断的刷新界面,完成效果图的碰撞动画了!

源码点击下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  碰撞算法