说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

Android加速感应器开发平衡球代码解析

HTML文档下载 WORD文档下载 PDF文档下载
Android加速感应器开发平衡球代码解析

作者:Android开发网


   如何使用Android的加速感应器开发一个控制铁球滚动的游戏:

public class AccelerometerPlayActivity extends Activity {

    private SimulationView mSimulationView; //游戏主显示View
    private SensorManager mSensorManager; //感应器管理类
    private PowerManager mPowerManager; //电源控制,比如防锁屏
    private WindowManager mWindowManager; 
    private Display mDisplay;
    private WakeLock mWakeLock;

     @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

         mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); // 实例化感应器管理类

        mPowerManager = (PowerManager) getSystemService(POWER_SERVICE);

        mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
        mDisplay = mWindowManager.getDefaultDisplay(); //为了获取屏幕的DPI级别

        mWakeLock = mPowerManager.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, getClass()
                .getName()); //处理屏幕防止锁屏

        mSimulationView = new SimulationView(this);
        setContentView(mSimulationView); //设置游戏View
    }

    @Override
    protected void onResume() {
        super.onResume();
         mWakeLock.acquire();  //恢复时解除锁屏

        mSimulationView.startSimulation();
    }

    @Override
    protected void onPause() {
        super.onPause();
        mSimulationView.stopSimulation(); //Activity切出去时停止画面更新

        mWakeLock.release();
    }

    class SimulationView extends View implements SensorEventListener {
        private static final float sBallDiameter = 0.004f; //设置小球直径
        private static final float sBallDiameter2 = sBallDiameter * sBallDiameter;

        private static final float sFriction = 0.1f; //摩擦系数

        private Sensor mAccelerometer;
        private long mLastT;
        private float mLastDeltaT;

        private float mXDpi;
        private float mYDpi;
        private float mMetersToPixelsX;
        private float mMetersToPixelsY;
        private Bitmap mBitmap; //小球素材
        private Bitmap mWood; //背景使用木头
        private float mXOrigin;
        private float mYOrigin;
        private float mSensorX;
        private float mSensorY;
        private long mSensorTimeStamp;
        private long mCpuTimeStamp;
        private float mHorizontalBound;
        private float mVerticalBound;
        private final ParticleSystem mParticleSystem = new ParticleSystem();

        class Particle {
            private float mPosX;
            private float mPosY;
            private float mAccelX;
            private float mAccelY;
            private float mLastPosX;
            private float mLastPosY;
            private float mOneMinusFriction;

            Particle() {
                final float r = ((float) Math.random() - 0.5f) * 0.2f;
                mOneMinusFriction = 1.0f - sFriction + r;
            }

            public void computePhysics(float sx, float sy, float dT, float dTC) {
                final float m = 1000.0f; // mass of our virtual object
                final float gx = -sx * m;
                final float gy = -sy * m;

               final float invm = 1.0f / m;
                final float ax = gx * invm;
                final float ay = gy * invm;

                final float dTdT = dT * dT;
                final float x = mPosX + mOneMinusFriction * dTC * (mPosX - mLastPosX) + mAccelX
                        * dTdT;
                final float y = mPosY + mOneMinusFriction * dTC * (mPosY - mLastPosY) + mAccelY
                        * dTdT;
                mLastPosX = mPosX;
                mLastPosY = mPosY;
                mPosX = x;
                mPosY = y;
                mAccelX = ax;
                mAccelY = ay;
            }

            public void resolveCollisionWithBounds() {
                final float xmax = mHorizontalBound;
                final float ymax = mVerticalBound;
                final float x = mPosX;
                final float y = mPosY;
                if (x > xmax) {
                    mPosX = xmax;
                } else if (x < -xmax) {
                    mPosX = -xmax;
                }
                if (y > ymax) {
                    mPosY = ymax;
                } else if (y < -ymax) {
                    mPosY = -ymax;
                }
            }
        }

        class ParticleSystem { //收集取样感应器数据来绘制小球位置
            static final int NUM_PARTICLES = 15;
            private Particle mBalls[] = new Particle[NUM_PARTICLES];

            ParticleSystem() {
                    for (int i = 0; i < mBalls.length; i++) {
                    mBalls[i] = new Particle();
                }
            }

            private void updatePositions(float sx, float sy, long timestamp) {
                final long t = timestamp;
                if (mLastT != 0) {
                    final float dT = (float) (t - mLastT) * (1.0f / 1000000000.0f);
                    if (mLastDeltaT != 0) {
                        final float dTC = dT / mLastDeltaT;
                        final int count = mBalls.length;
                        for (int i = 0; i < count; i++) {
                            Particle ball = mBalls[i];
                            ball.computePhysics(sx, sy, dT, dTC);
                        }
                    }
                    mLastDeltaT = dT;
                }
                mLastT = t;
            }

            public void update(float sx, float sy, long now) {
                updatePositions(sx, sy, now);

                  final int NUM_MAX_ITERATIONS = 10;

                boolean more = true;
                final int count = mBalls.length;
                for (int k = 0; k < NUM_MAX_ITERATIONS && more; k++) {
                    more = false;
                    for (int i = 0; i < count; i++) {
                        Particle curr = mBalls[i];
                        for (int j = i + 1; j < count; j++) {
                            Particle ball = mBalls[j];
                            float dx = ball.mPosX - curr.mPosX;
                            float dy = ball.mPosY - curr.mPosY;
                            float dd = dx * dx + dy * dy;
                            // Check for collisions
                            if (dd <= sBallDiameter2) {
                                dx += ((float) Math.random() - 0.5f) * 0.0001f;
                                dy += ((float) Math.random() - 0.5f) * 0.0001f;
                                dd = dx * dx + dy * dy;
                                // simulate the spring
                                final float d = (float) Math.sqrt(dd);
                                final float c = (0.5f * (sBallDiameter - d)) / d;
                                curr.mPosX -= dx * c;
                                curr.mPosY -= dy * c;
                                ball.mPosX += dx * c;
                                ball.mPosY += dy * c;
                                more = true;
                            }
                        }
                        curr.resolveCollisionWithBounds();
                    }
                }
            }

            public int getParticleCount() {
                return mBalls.length;
            }

            public float getPosX(int i) {
                return mBalls[i].mPosX;
            }

            public float getPosY(int i) {
                return mBalls[i].mPosY;
            }
        }

        public void startSimulation() {
            mSensorManager.registerListener(this, mAccelerometer, SensorManager.SENSOR_DELAY_UI);
        }

        public void stopSimulation() { //暂停时主要是停掉感应器
            mSensorManager.unregisterListener(this);
        }

        public SimulationView(Context context) {
            super(context);
            mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); //实例化加速感应器

            DisplayMetrics metrics = new DisplayMetrics();
            getWindowManager().getDefaultDisplay().getMetrics(metrics); //分辨率获取
            mXDpi = metrics.xdpi;
            mYDpi = metrics.ydpi;
            mMetersToPixelsX = mXDpi / 0.0254f;
            mMetersToPixelsY = mYDpi / 0.0254f;

            Bitmap ball = BitmapFactory.decodeResource(getResources(), R.drawable.ball);
            final int dstWidth = (int) (sBallDiameter * mMetersToPixelsX + 0.5f);
            final int dstHeight = (int) (sBallDiameter * mMetersToPixelsY + 0.5f);
            mBitmap = Bitmap.createScaledBitmap(ball, dstWidth, dstHeight, true); //根据屏幕分辨率来设置素材的显示缩放比例

            Options opts = new Options();
            opts.inDither = true;
            opts.inPreferredConfig = Bitmap.Config.RGB_565;
            mWood = BitmapFactory.decodeResource(getResources(), R.drawable.wood, opts);
        }

        @Override
        protected void onSizeChanged(int w, int h, int oldw, int oldh) { //当View有变化时,Android123提示比如说横竖屏切换
            mXOrigin = (w - mBitmap.getWidth()) * 0.5f;
            mYOrigin = (h - mBitmap.getHeight()) * 0.5f;
            mHorizontalBound = ((w / mMetersToPixelsX - sBallDiameter) * 0.5f);
            mVerticalBound = ((h / mMetersToPixelsY - sBallDiameter) * 0.5f);
        }

        @Override
        public void onSensorChanged(SensorEvent event) { //感应器数据有变化时
            if (event.sensor.getType() != Sensor.TYPE_ACCELEROMETER)
                return;
            switch (mDisplay.getRotation()) {
                case Surface.ROTATION_0:
                    mSensorX = event.values[0];
                    mSensorY = event.values[1];
                    break;
                case Surface.ROTATION_90:
                    mSensorX = -event.values[1];
                    mSensorY = event.values[0];
                    break;
                case Surface.ROTATION_180:
                    mSensorX = -event.values[0];
                    mSensorY = -event.values[1];
                    break;
                case Surface.ROTATION_270:
                    mSensorX = event.values[1];
                    mSensorY = -event.values[0];
                    break;
            }

            mSensorTimeStamp = event.timestamp;
            mCpuTimeStamp = System.nanoTime();
        }

        @Override
        protected void onDraw(Canvas canvas) { //主要的小球绘制

            canvas.drawBitmap(mWood, 0, 0, null); //先画出背景

            final ParticleSystem particleSystem = mParticleSystem;
            final long now = mSensorTimeStamp + (System.nanoTime() - mCpuTimeStamp);
            final float sx = mSensorX;
            final float sy = mSensorY;

            particleSystem.update(sx, sy, now);

            final float xc = mXOrigin;
            final float yc = mYOrigin;
            final float xs = mMetersToPixelsX;
            final float ys = mMetersToPixelsY;
            final Bitmap bitmap = mBitmap;
            final int count = particleSystem.getParticleCount();
            for (int i = 0; i < count; i++) {
                final float x = xc + particleSystem.getPosX(i) * xs;
                final float y = yc - particleSystem.getPosY(i) * ys;
                canvas.drawBitmap(bitmap, x, y, null);
            }

            invalidate();
        }

        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
        }
    }
}

 整个例子可以在Android 2.3 SDK的Samples文件夹下找到,这个小铁球的例子可以帮助我们改造为平衡球游戏。

用vb.net写的验证码识别代码 VB删除EXCEL表格指定列 Oracle数据库Windows 2003环境自动备份批处理 VB通过ADODB连接EXCEL表格文件读取数据 使用VBScript卸载软件 Discuz X2用户注册过程SQL Android手机参数表 用jQuery改变图片(image src) 用std::atomic實現簡單的讀寫鎖 ChinaPay网上支付网关.NET开发 VOB生成IFO文件用nero刻录DVD详解 15款开源Android游戏引擎(安卓免费游戏引擎) 将MVC ASPX转换到Razor视图 Word设置目录简明教程 asp.net mvc页面javascript代码中如何使用razor Discuz X论坛数据表结构:用户数据表pre_common_member boost在windows平台下自带超强 IOCP 的ASIO Boost下载和编译安装简明指引 Windows和Linux环境中Boost下载安装编译配置使用指南 Android开发技巧:Android常用类库说明 Android开发技巧:Android 文件系统 Android开发技巧:Android应用程序架构 ASP.NET MVC Razor 输出没有编码的HTML字符串 ASP.NET MVC 3 Razor 在head里包含js文件 JQuery mobile介绍 JQuery Mobile 页面结构 什么是云计算的通俗理解 什么是Hadoop以及与云计算的关系 创建一个Windows Phone 7推箱子益智游戏 好用的在线编辑器百度UEditor ASP.NET如何从URL或route数据中得到controller类型和action信息 很简单,如何得到当前的时间和日期?(在线等待) 请问哪里有用applet做的,能绘制数学曲线的动态演示系统?各位,请不吝赐教 今天大清早被人诅咒! Delete 多个表时一条语句怎样写?? 请教:如何获取文本框中SQL语句。50分 日期型的格式应该怎样写?? windows xp internet 浏览器的问题 大家帮我看看这段代码:它是如何得到name和phone的值,并写到文件中取得 100分求李维的delphi5.x分布式系统开发的源代码,电子书我已经有 奇怪。为何win2000的搜索选项中的日期控件是Delphi中的样式?欢迎来讨论,给分!!! 请教一个数据库查询的问题! 哥、姐帮帮小第,一生成并打印表格问题(有图片及字体适应),急急,十万火急。 怎样在ASP.NET的页面中,把DataGrid的表头改名??急急急!!! 在线求教:怎样在自己定义的函数里封装自己的MouseMove类??? (高手求救………100分)怎么样用socket(http)实现上载!请提供思路或source code! 怎样调用Dll中导出的变量??? 那位大哥有关于颜色渐变的算法的代码,给小弟一份 小弟万分感谢 颜色渐变的算法 颜色渐变的算法 问一个有关缓存的问题 更换基类的问题? 感谢上学期大家的帮助——散分 一个奇怪的问题,100在线送给你!!! 用rave生成的pdf格式报表,中文字符怎么是乱码? 请进来: windows 2000 能不能用API的方式将Imagelist中的图画在命令按钮(Commandbutton)上? 请各位指点怎么从SQL65升级到7,还有数据备份?请大侠指点迷津? 请问如何解决.exe文件在其他机器上的运行问题 允许DBGrid对记录进行编辑,在线等待,急急急~ 如何在vb.net定义失去焦点事件? 如何读出文章中的部分内容(在线等待) 怎么样在VB中实现象PING -A命令 有没有一个更好的论坛????????????????????有没有人来踢馆?????????????????????????????? 如何访问隐藏共享的硬盘 请大家评评,先谢了 一个有趣的问题: 慢的问题 我在windows下的FormInput里有多个sqlDataAdapter 数据几百条 DataSET.fill慢及了 如何返回当前程序目录的上一级目录? EA,你给我进来,你又欺负我MM啦? 请问PB的DATA window如何实现分页? 关于pb中我在sqlserver中定义的字段类型是varchar(1000),结果在做数据窗口时它总是自动截取为char(255),为什么?如何解决这个问题(除了 IIS出错了,凡是需要数据库的asp程序在执行时出错: 关于下三角矩阵压缩存储问题 求免费下载电影电视剧的FTP站点 模块实现 数据表转换问题. 请帮帮忙. 我种木马了,请问怎么解决?? 急问:"0x77fcb8f4"指令引用的“0x00000000”内存。该内存不能为“writter” 关于文件名问题 delphi6有没有判断字符串是不是全是字母或数字的函数? 顯示日志源代碼,但無法分頁,請高手... 用isql怎样得到数据库里所有表的列表? 验证Cu2+离子 将60℃的硫酸铜饱和溶液100克,冷却到20℃,下列说法正确的是将60℃的硫酸铜饱和溶液100克,冷却到20℃,为什么 溶液质量会变小 ,浓度减小,溶剂质量减小?求详解..谢谢谢谢. 请问有没有卖给鱼缸用的使用电池的加热棒?要有温度手工调节的功能注意是使用电池的.5号1号7号充电电池皆可. O2、SO2、HCl的氧化性顺序及排序的依据是什么? 为什么钠可以作原子反应堆的导热剂 如何计算加热棒所产生的最大温度我在有一块1.5KG的铁 需要加热到260度 请问需要多大功率的加热棒 (我现在用2根8*60 功率为150W的,但是温控显示只能达到235度 不知道是热电偶没装好还是加 SO2 使品红褪色是利用氧化性还是漂白性?Hcl Na,K合金可作原子反应堆的导热剂.为什么 请问茶是发源与中国吗?茶的历史以及西方的茶与东方的茶的简介!希望短小一点,不要将无关的话贴上来, 人民公社是什么年代 鸦片战争时期中国贫困落后的根本原因 控制温度,我用一个PID控制加热棒,再用一个PID控制冷水,使温度保持恒定,可以实现吗?我想让一个小罐实现恒定的温度控制,想通过以上2种PID控制,是否可行呢? 人民公社时期农村生产怎样的状况?说错了、是“遍哨子不买账,二遍哨子伸头望,三遍哨子慢慢晃”反映了当时农村生产怎样的状况?其主要原因是什么?、 鸦片战争前夕中国落后于世界的原因 为什么最早的化学萌芽在中国 却在西方成为一门正真的科学 人民公社是什么东东?谁想出来的? 炼油厂油的燃烧是把化学能转化为什么能 天气温度为5~10度,直接用加热棒加热到23度可以吗?我的鱼缸实际水位为50*25*35MM,天气温度为5~10度,今天刚买了一个300W的加热棒,直接放在鱼缸加热可以吗?我养的是普通的金鱼和锦鲤鱼.加热到几 人民公社存在多长时间? 将60度的硫酸铜饱和溶液100克,冷却到20度,下列书法正确的是A 溶液质量不变 B 溶剂质量发生变化 C 溶液为饱和溶液,浓度不变 D 有晶体析出,溶剂质量不变 为什么最早的化学萌发于中国却在西方成为一门真正的科学? 二氧化硫对植物的伤害极大.将四棵生长状况都良好、大小相似、品种相同的植物分别放入以下的四种环境中,如果四种环境中的二氧化硫的浓度相同,你认为下列哪种情况下植物受到的伤害最 将12.5克五水合硫酸铜制成百分之十的硫酸铜溶液 需要水多少克计算式完整一点 再告诉我要不要考虑水合 我国炼丹术西传,开启了西方近代化学之门,但后来我们在化学研究上却远落后于西方,为什么?我国炼丹术西传,开启了近代化学之门,但后来我们在化学研究上却远远落后于西方,这是为什么? 以下四种东西,哪种与碱反应会生成氨气A NO3B NHO3C NH2OD N2H4O3 请问五水头孢唑林钠是第几代抗生素,是属于特殊使用吗 中国共产党探索出的革命道路与俄国十月革命道路的异同 请教旅游从业者,什么是生态旅游? 鸦片战争后中国社会的趋势?从经济上、政治上和思想文化上来说! 分子节构由60个原子构成的象足球的分子模型是什么 生态旅游的意义是什么? 忐忑不安的解释 鱼缸加热棒老停鱼缸长方形的,加热棒在一头,估计另一头还没热它就停了,半分钟不到又开了,我该怎么办阿? 忐忑不安, 在酸性溶液中,能大量共存的离子组是A:Mg2+.Fe3+.NO2-SCN- B :Al3-.Fe2+.Cl- ,SO42在酸性溶液中,能大量共存的离子组是A:Mg2+.Fe3+.NO2-,SCN- .B :Al3-.Fe2+.Cl- ,(SO4)2-C:K+,Na+,Cl-,( HCO3)-D:Na+,Ca2+,(NO3)-,(SO4)2- 仿生学是一门怎样的学科? 为什么明朝起义的是农民阶级的李自成,不是资产阶级呢为什么张居正会这么早死呢. 抗生素自来水,喝着安全吗 仿生学是怎样的学科? 什么是生态旅游? 喝自来水安全吗?长期喝过滤过的自来水健康吗? 仿生学例子(1个) 快 如何在贵州发展生态旅游,1什么是生态旅游.2为什么要发展生态旅游 物理层与数据链路层的区别 物理的填空题 为什么只能用水对反应堆进行降温?不能用干冰、液氮之类低温的东西么?是会起反应还是其他原因? 常见的物理层传输媒体是什么? 清道夫总是在鱼缸壁上一动不动,是冬眠了吗?冬天鱼缸里没用加热棒,水的温度在17℃.鱼缸里还养的锦鲤,一个星期后水总是特别混,还想问一下是不是锦鲤生病了?清道夫不工作,鱼缸壁上很脏, 氨气和什么生成HCL 忐忑不安什么意思? 为什么总是那么孤单 天生不会与人建立和保持友谊 不会不懂不能与人交流沟通 不知要说些什么患者信息:男 22岁 病情描述(发病时间、主要症状等):在一个环境里面 从开始的不会不知不能 什么反应生成氨气求助:一般怎样的反应类型生成氨气的啊?有什么规律吗?把总结性的化学方程式写出来啊!最好配上几个例子! ------------初中化学! 如何将高压数显上的电流转换成低压电流表的读法? 寂寞是种怎样的杯具我不知道 但我知道……我自己一个人杯具的在电影院里看专扁衰仔 深思与沉思的区别 什么与水缓慢作用生成氨气化合物A与水缓慢作用生成氨气和化合物M,其中化合物A只含两种元素.请问A和M分别是什么? 为什么高压电流小低压电流大 沉思与深思的区别 用什么加热来生成氨气 热带鱼加热棒,在使用时,是否需要将整个加热棒泡到水里,能不能把调节温度的头全浸入水中. 美驻吉尔吉斯使馆收到不明信封 内装白巴基斯坦女警被曝职场路艰辛 受性别歧日称中国海军2艘军舰经日本先岛诸岛毗亚太地区主要股市涨跌不一《世界新闻报》窃听案开庭 涉及政要、边\"开刀\"边造绿 杭州投10个亿温州苍南首起“地沟油”案制造者被判刑日本一公司办公室内种160多盆大麻草德国联邦议院将召开特别会议商讨美监听泰国明年起拟向游客征收入境税 逗留3武大伟访美并与美方就朝核及重启六方会工信部:国内手机用户超12亿 移动上中俄等国已向联合国提交信息安全国际行澳大利亚新政府称将继续禁止华为参与网外交部就日防长涉钓鱼岛言论、\"棱镜格现任总统发表卸职演讲 感谢格民众对最强风暴袭丹麦世界主要城市10月30日天气预报美学者告诫安倍勿参拜靖国神社中方将为推动两苏关系持续改善和发展作首位法国总统出访斯洛伐克 具有历史意创新执法方式 “严管”举措提升企业信各方全力追查江西高安病死猪肉问题新津建设 “大气之城”优城市品质 “群众编群众导群众演 用喜闻乐见方式宣蓉城实体书店打造深度阅读沙龙金牛区切实深化社会治理机制改革 大力1 10月我市规模以上工业增加值同比蓉城实体书店打造深度阅读沙龙作家李长声来蓉与流沙河对话公安部:今年已查处黄赌刑事案件3.7市纪委发出八条禁令中国男足兵发澳大利亚环能德美顺利过会 明年上市川企或破百治理“庸懒散浮拖” 强化正风肃纪 打阔别34年 四川荷叶重登成都舞台中国男足兵发澳大利亚青羊区第一批电动自行车临时上牌点位公全国人大常委会任命最高法院巡回法庭庭2014年全国“大交通” 完成投资2大会员 “成都经验”明年将全国推广锦江治水:统筹背景下的水域之变
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘