• D5-Android绘图之让图形动起来


    以前在Html利用js控制SVG或canvas进行运动模拟。浏览器自带window.requestAnimationFrame能不断执行渲染
    在这使用我的LogicCanvas中的NumGo进行不断渲染工作,用法详见:
    绘图部分基于我的LogicCanvas绘图库:基础使用在此
    喜欢的话可以到项目的github上看看,顺便给个star
    如果此篇看起来有些困难,可以先看一下其他D系列文章,尤其是:D4-Android绘图之和我一起画箭头
    本篇将介绍:反弹、自由落体、平抛、斜抛的物理场景模拟


    一、反弹

    9414344-d9adf559efb88f19.gif
    效果.gif
    1.构造函数初始化时:核心就是:位移=时间*速度
    //创建一个水平速度向量对象,并赋值水平速度为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;//时刻更新
        }
    });
    
    2.成员变量:
        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;
    
    2.抬起的事件:启动mRunNum
    lastFrameTime = System.currentTimeMillis();
    mRunNum.go();
    
    3.绘制的方法:OnDraw中:
            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);
    

    二、自由落体:

    9414344-681d6a3c8a26ba3d.gif
    自由落体.gif
    加入加速度向量,初速度设为0:
     mG = v2(0, -10);
     mV = v2(0, 0);
    
    处理位移时将加速度叠加到速度上
    Pos detaV = mG.dotC(detaT);//速度变化量
    mV = mV.add(detaV);//速度增量和
    

    三、平抛运动:

    9414344-772019223ca8633c.gif
    平抛运动.gif
    增加水平初速度
     mV = v2(3000, 0);
    

    四、斜抛运动:

    9414344-42e72d70e374d6e0.gif
    斜抛运动.gif
    mV = v2(3000, -5000);//倾斜初速度
    

    后记、

    1.声明:

    [1]本文由张风捷特烈原创,转载请注明
    [2]欢迎广大编程爱好者共同交流
    [3]个人能力有限,如有不正之处欢迎大家批评指证,必定虚心改正
    [4]你的喜欢与支持将是我最大的动力

    2.连接传送门:

    更多安卓技术欢迎访问:安卓技术栈
    我的github地址:欢迎star
    简书首发,腾讯云+社区同步更新
    张风捷特烈个人网站,编程笔记请访问:http://www.toly1994.com

    3.联系我

    QQ:1981462002
    邮箱:1981462002@qq.com
    微信:zdl1994328

    4.欢迎关注我的微信公众号,最新精彩文章,及时送达:
    9414344-c474349cd3bd4b82.jpg
    公众号.jpg
  • 相关阅读:
    Sqlite 语句 记录
    string.Format对C#字符串格式化
    C#耗时计算
    控件缩放
    C# winfrom Datagridview表头样式和选中样式
    C# winfrom Datagridview控件下拉菜单
    C# 平台问题
    编程思想
    强制删除sql用户链接
    MyEclipse快捷键大全
  • 原文地址:https://www.cnblogs.com/toly-top/p/9781897.html
Copyright © 2020-2023  润新知