平衡球小游戏

在手机硬件还不够发达的早些时候,简易的"体感游戏"成为了手机游戏中的一个大头。

利用设备上自带的动态传感器,通过摇晃手机等方式,移动游戏物体来游玩的游戏。
为了成功理解陀螺仪的使用,我试着还原了一个类似的小游戏。

可以在这里获取我的游戏demo.

首先是…球?

为了尽可能简单地去体现陀螺仪的本质,整个游戏本身我仅使用了常规的布局组件来完成。

  1. 一个ConstraintLayout作为棋盘
  2. 一个重写过的View子类customDrawableView作为"球体"
  3. 一个继承于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陀螺仪应用:平衡球小游戏相关推荐

  1. Android陀螺仪应用_平衡球小游戏

    平衡球小游戏 在手机硬件还不够发达的早些时候,简易的"体感游戏"成为了手机游戏中的一个大头. 利用设备上自带的动态传感器,通过摇晃手机等方式,移动游戏物体来游玩的游戏. 为了成功理 ...

  2. Qt/C++ 开发Android平台《林中伊人》消球小游戏全记录1——独立游戏设计的伊始

    从搭建Qt for Android的开发环境,到写代码.做贴图,再到最后游戏的发布,前后利用业余时间忙了也算有1个多月,通过制作<林中伊人>确实收获了不少好东西,特地在这里跟大家分享一下. ...

  3. 安卓期末大作业——Android弹力球小游戏

    功能描述: 弹力球小游戏,使用AndEnginePhysicsBox2D游戏开发引擎开发,适合新手学习.搭建方法请看入门教程菜单中的androidstudio项目搭建教程.关于怎么实现的问题请不要问我 ...

  4. Android弹力球小游戏案例

    功能描述: 弹力球小游戏,使用AndEnginePhysicsBox2D游戏开发引擎开发,适合新手学习. 开发语言: java 技术框架: mvc,AndEnginePhysicsBox2D引擎 开发 ...

  5. python小游戏-16行代码实现3D撞球小游戏!-源码下载

    python小游戏-16行代码实现3D撞球小游戏!-源码下载 所属网站分类: 资源下载 > python小游戏 作者:搞笑 链接: http://www.pythonheidong.com/bl ...

  6. Stack Ball 堆栈球小游戏unity3d开发教程

    Stack Ball 堆栈球小游戏unity3d开发教程 介绍 <Stack Ball>是一款3D街机游戏,玩家需要通过旋转的螺旋平台来打碎.撞击和弹跳,以达到终点. 听起来很容易?你可错 ...

  7. python海龟画图模块制作的拦球小游戏,谁说小海龟只会画图

    """ 拦球小游戏.py     海龟本身的图形有"arrow", "turtle", "circle", & ...

  8. java写弹力球游戏,用Qt5做的弹力球小游戏

    [实例简介] 用Qt5做的一个弹力球小游戏,Qt5及版本以上能直接运行.这个小游戏代码比较多,希望下载的同学能改进,一起交流. [实例截图] [核心代码] 9137bea4-84cc-4b28-9ae ...

  9. Android Studio实现贪吃蛇小游戏

    项目目录 一.项目概述 二.开发环境 三.详细设计 四.运行演示 五.项目总结 六.源码获取 一.项目概述 贪吃蛇是一款经典的街机游戏,不仅在电子游戏史上占有一席之地,也在很多人的童年回忆中留下了深刻 ...

最新文章

  1. 【python+beautifulsoup4】Python中安装bs4后,pycharm报错ModuleNotFoundError: No module named 'bs4'...
  2. shell批量插入数据
  3. 退出MFC应用程序的方法集
  4. 【数据结构与算法】带权图最短路径Dijkstra算法
  5. 老年机按键串号_为什么老人机依然很多人在用?
  6. 【Spring】Bean instantiation via constructor failed nested exception Constructor threw exception
  7. 程序设计模式浅析(plain framework商业版设计模式)
  8. guestfish修改镜像内容
  9. 提高服务器响应时间,如何提高服务器qps
  10. Android帧动画的实现
  11. 20200619每日一句
  12. 斐讯k2修改dns服务器,斐讯K2固件修改的一些信息
  13. 离散数学11:图的着色
  14. jquery实现侧边栏手风琴三级导航菜单demo
  15. 计算机网络实验-网络嗅探器
  16. 发展农村数字普惠金融的问题及对策分析
  17. item_get - 获得搜好货商品详情
  18. 初探树莓派与阿里云物联网平台
  19. 统计学原理----算术平均数和调和平均数
  20. Cisco Packet Tracer 6.0下载安装及汉化包使用方法

热门文章

  1. GPS NMEA协议解析之通用语句
  2. CSR8670 学习记录1——开始
  3. 神州路由器DHCP服务配置
  4. 【特写】后生可畏,大三学生自主研发毫米级五自由度机械手臂
  5. 精灵标注助手(Colabeler)使用教程
  6. 几张关于安全相关的图
  7. MTPutty 保存设置
  8. php多站点cms,如何实现PHPCMS V9 多站点[站群功能]子站独立域名且动态URL
  9. 【K8s】什么是Pod?Pod的调度与控制器
  10. android剪切板权限,android剪切板一些简单实用方法