以前在Html利用js控制SVG或canvas进行运动模拟。浏览器自带window.requestAnimationFrame能不断执行渲染 在这使用我的LogicCanvas中的NumGo进行不断渲染工作,用法详见: 绘图部分基于我的LogicCanvas绘图库:基础使用在此, 喜欢的话可以到项目的github上看看,顺便给个star 如果此篇看起来有些困难,可以先看一下其他D系列文章,尤其是:D4-Android绘图之和我一起画箭头 本篇将介绍:反弹、自由落体、平抛、斜抛的物理场景模拟
效果.gif
//创建一个水平速度向量对象,并赋值水平速度为100px/s,竖直速度50px/s
mVA = v2(100, -50);
//创建一个位移向量对象
mSA = v2(0, 0);
mRunNum = new NumGo(false, 0, 100000).setOnUpdate(new NumGo.OnUpdate() {
@Override
public void onUpdate(float rate) {
long frameTime = System.currentTimeMillis();
float detaT = frameTime - lastFrameTime;//时间变化量
Pos detaS = mVA.dotC(detaT / 500);//位移增量=速度*时间变化量
Pos detaSB = mVB.dotC(detaT / 500);//位移增量=速度*时间变化量
mSA = mSA.add(detaS);//位移总量 = 位移增量和
mSB = mSB.add(detaSB);//位移总量 = 位移增量和
//区域限定
if (mSA.x > 200 || mSA.x < -200) {
mVA = mVA.refX();//x反弹
mAColor = ColUtils.randomRGB();//随机色
}
if (mSA.y > 200 || mSA.y < -200) {
mVA = mVA.refY();//Y反弹
mAColor = ColUtils.randomRGB();
}
invalidate();
lastFrameTime = frameTime;//时刻更新
}
});
Pos coo = v2(500, 600);
private NumGo mRunNum;
private long lastFrameTime;
private Pos mVA;
private Pos mSA;
private Shape mFA;
private int mBColor = Color.RED;
private int mAColor = Color.BLUE;
lastFrameTime = System.currentTimeMillis();
mRunNum.go();
Painter painter = PainterEnum.INSTANCE.getInstance(canvas);
mFA = sa.deepClone().r(20).ang(360).fs(mAColor).p(mSA).coo(coo);//绘制小球
//绘制矩形区域
Shape fr = new ShapeRect().x(440).y(440).r(1).fs(0x66B8F8F0).coo(coo).p(-220, -220);
painter.draw(fr, mFA);
自由落体.gif
mG = v2(0, -10);
mV = v2(0, 0);
Pos detaV = mG.dotC(detaT);//速度变化量
mV = mV.add(detaV);//速度增量和
平抛运动.gif
mV = v2(3000, 0);
斜抛运动.gif
mV = v2(3000, -5000);//倾斜初速度
1本文由张风捷特烈原创,转载请注明
2欢迎广大编程爱好者共同交流
3个人能力有限,如有不正之处欢迎大家批评指证,必定虚心改正
4你的喜欢与支持将是我最大的动力