Android陀螺仪应用:平衡球小游戏
平衡球小游戏
在手机硬件还不够发达的早些时候,简易的"体感游戏"成为了手机游戏中的一个大头。
利用设备上自带的动态传感器,通过摇晃手机等方式,移动游戏物体来游玩的游戏。
为了成功理解陀螺仪的使用,我试着还原了一个类似的小游戏。
可以在这里获取我的游戏demo.
首先是…球?
为了尽可能简单地去体现陀螺仪的本质,整个游戏本身我仅使用了常规的布局组件来完成。
- 一个ConstraintLayout作为棋盘
- 一个重写过的View子类customDrawableView作为"球体"
- 一个继承于Drawable的Ball类,作为球的外观,放在"球体"上
constraintLayout = new ConstraintLayout(this);constraintLayout.addView(customDrawableView);setContentView(constraintLayout);
public class Ball extends Drawable {private final Paint redPaint;public Ball() {redPaint = new Paint();redPaint.setARGB(255, 255, 0, 0);}@Overridepublic void draw(Canvas canvas) {int width = getBounds().width();int height = getBounds().height();float radius = Math.min(width, height) / 2;//绘制一个红色的实心圆canvas.drawCircle(width/2, height/2, radius, redPaint);}//...省略了其他必须继承的空方法}
效果如下
很简陋对吧,而接下来则是重点
再然后是…让牛顿现身?
传感器有分许多种,而调用传感器的方式非常简单
private SensorManager sensorManager;//传感管理器实例
private Sensor sensor;//传感器实例
...
//获取实例并从管理器实例中获取传感器实例
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
//X为传感器类别
sensor = sensorManager.getDefaultSensor(Sensor.X);
常用的有
TYPE_GRAVITY 三轴重力
TYPE_GYROSCOPE 三轴旋转加速度
TYPE_ACCELEROMETER 三轴加速度
这里直接选择Sensor.TYPE_ACCELEROMETER就行
为了让牛顿大叔能够感受到变化,就得整个监听器。
sensorManager.registerListener(new SensorEventListener() {//核心方法,当传感器变化时会立刻调用这个函数@Overridepublic void onSensorChanged(SensorEvent event) {double x = event.values[0];double y = event.values[1];double z = event.values[2];customDrawableView.speed_x += -x;//球的横轴速度customDrawableView.speed_y += y;//球的纵轴速度}//监听精度变化,在这里暂时用不到@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {}},sensor,SensorManager.SENSOR_DELAY_NORMAL);
最后是…会动的球?
要让球动起来,只要不断让球通过速度属性进行运动就行了,这里我通过额外建立了一个新线程,让该线程不断循环根据球的速度属性进行view的移动
public class MoveThread extends Thread {private Thread t;private CustomDrawableView view;MoveThread(CustomDrawableView c){view = c;}public void run() {while(true){//第一遍球在高速移动的时候卡卡的,所以这里做了一个高速优化if(Math.sqrt(view.speed_x*view.speed_x+view.speed_y*view.speed_y)>10){try{Thread.sleep(10);}catch (Exception e){}view.moveView((int)view.speed_x/10,(int)view.speed_y/10);}else {try{Thread.sleep(100);}catch (Exception e){}view.moveView((int)view.speed_x,(int)view.speed_y);}}}public void start () {if (t == null) {t = new Thread (this);t.start ();}}
}
//MainActivity
MoveThread mt = new MoveThread(customDrawableView);mt.start();
然后再加上防止球滚出棋盘等等小细节…搞定!
实机调试后有点上头
是不是哪里不对?
确实有一个地方没搞清楚,为了防止球滚出屏幕外,我使用的是
DisplayMetrics metrics = this.getResources().getDisplayMetrics();
来获取设备屏幕长宽
但是由于不同设备有着不同的组件大小,屏幕尺寸≠constrainlayout尺寸
我试着使用constrainlayout的getwidth()与getheight()获取尺寸,但是发现结果是0*0
查阅了一下文档可能是因为constrainlayout默认使用的是"match_parent",在查看了很多博客之后没能解决这个问题最后选择了偷懒
希望有人能解答如何获取属性为"match_parent"的组件的尺寸
邮箱:774244276@qq.com
参考文档
安卓官方文档
Android陀螺仪应用:平衡球小游戏相关推荐
- Android陀螺仪应用_平衡球小游戏
平衡球小游戏 在手机硬件还不够发达的早些时候,简易的"体感游戏"成为了手机游戏中的一个大头. 利用设备上自带的动态传感器,通过摇晃手机等方式,移动游戏物体来游玩的游戏. 为了成功理 ...
- Qt/C++ 开发Android平台《林中伊人》消球小游戏全记录1——独立游戏设计的伊始
从搭建Qt for Android的开发环境,到写代码.做贴图,再到最后游戏的发布,前后利用业余时间忙了也算有1个多月,通过制作<林中伊人>确实收获了不少好东西,特地在这里跟大家分享一下. ...
- 安卓期末大作业——Android弹力球小游戏
功能描述: 弹力球小游戏,使用AndEnginePhysicsBox2D游戏开发引擎开发,适合新手学习.搭建方法请看入门教程菜单中的androidstudio项目搭建教程.关于怎么实现的问题请不要问我 ...
- Android弹力球小游戏案例
功能描述: 弹力球小游戏,使用AndEnginePhysicsBox2D游戏开发引擎开发,适合新手学习. 开发语言: java 技术框架: mvc,AndEnginePhysicsBox2D引擎 开发 ...
- python小游戏-16行代码实现3D撞球小游戏!-源码下载
python小游戏-16行代码实现3D撞球小游戏!-源码下载 所属网站分类: 资源下载 > python小游戏 作者:搞笑 链接: http://www.pythonheidong.com/bl ...
- Stack Ball 堆栈球小游戏unity3d开发教程
Stack Ball 堆栈球小游戏unity3d开发教程 介绍 <Stack Ball>是一款3D街机游戏,玩家需要通过旋转的螺旋平台来打碎.撞击和弹跳,以达到终点. 听起来很容易?你可错 ...
- python海龟画图模块制作的拦球小游戏,谁说小海龟只会画图
""" 拦球小游戏.py 海龟本身的图形有"arrow", "turtle", "circle", & ...
- java写弹力球游戏,用Qt5做的弹力球小游戏
[实例简介] 用Qt5做的一个弹力球小游戏,Qt5及版本以上能直接运行.这个小游戏代码比较多,希望下载的同学能改进,一起交流. [实例截图] [核心代码] 9137bea4-84cc-4b28-9ae ...
- Android Studio实现贪吃蛇小游戏
项目目录 一.项目概述 二.开发环境 三.详细设计 四.运行演示 五.项目总结 六.源码获取 一.项目概述 贪吃蛇是一款经典的街机游戏,不仅在电子游戏史上占有一席之地,也在很多人的童年回忆中留下了深刻 ...
最新文章
- 【python+beautifulsoup4】Python中安装bs4后,pycharm报错ModuleNotFoundError: No module named 'bs4'...
- shell批量插入数据
- 退出MFC应用程序的方法集
- 【数据结构与算法】带权图最短路径Dijkstra算法
- 老年机按键串号_为什么老人机依然很多人在用?
- 【Spring】Bean instantiation via constructor failed nested exception Constructor threw exception
- 程序设计模式浅析(plain framework商业版设计模式)
- guestfish修改镜像内容
- 提高服务器响应时间,如何提高服务器qps
- Android帧动画的实现
- 20200619每日一句
- 斐讯k2修改dns服务器,斐讯K2固件修改的一些信息
- 离散数学11:图的着色
- jquery实现侧边栏手风琴三级导航菜单demo
- 计算机网络实验-网络嗅探器
- 发展农村数字普惠金融的问题及对策分析
- item_get - 获得搜好货商品详情
- 初探树莓派与阿里云物联网平台
- 统计学原理----算术平均数和调和平均数
- Cisco Packet Tracer 6.0下载安装及汉化包使用方法