好久没更新博客了,今天来谈谈android小游戏———重力感应,一般在游戏里运用的比較多,比方这类游戏有:神庙逃亡。极品飞车,平衡球。三围重力迷宫,重力赛车等。

首先什么是重力感应。重力感应是指如今手机中经常使用的一个器件,及加速度传感器。

当手机精巧时。加速度就是重力。所以一般也叫做重力传感器。这个硬件能够感应加速度的变化,转化为数据提供给系统。另一种传感器是陀螺仪,检測环绕某轴的旋转动作,是利用有质量的刚体的在做旋转或震动时,假设发生垂直于旋转或震动轴的旋转,由于惯性会产生垂直于旋转或震动轴的柯氏力(G-sensor是加速度力)。陀螺仪必然会分x。y。z轴。两者的差别是前者,内部的測量对象是加速度力。后者,内部測量柯氏力。前者告诉你物体动没动,往哪个方向动了?后者告诉你动起来的物体转了吗?怎么转的,转了多少度?
多轴的的G-Sensor也能够检測到物体切向于竖直方向的转动。但角度推断起来非常困难。

那么手机重力感应的原理是什么?(以下)

——通过对力敏感的传感器。感受手机在变换姿势时,重心的变化。使手机光标变化位置从而实现选择的功能。   手机重力感应技术:利用压电效应实现,简单来说是是測量内部一片重物(重物和压电片做成一体)重力正交两个方向的分力大小,来判定水平方向。   手机重力感应指的是手机内置重力摇杆芯片。支持摇晃切换所需的界面和功能,甩歌甩屏,翻转静音,甩动切换视频等,是一种非常具有使用乐趣的功能。

        以下看一个简单的小游戏(范例)效果图:APK下载地址:http://download.csdn.net/detail/liuyang1990i/7448211

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGl1eWFuZzE5OTBp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" width="300" height="520" alt="" />

代码例如以下:(下为部分Java代码)

startActivity.java文件

package cn.m15.xys;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class startActivity extends Activity {
    Context mContext = null;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mContext = this;
        
/**进入游戏世界 - 小球移动**/
        Button botton0 = (Button)findViewById(R.id.button0);
        botton0.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View arg0) {
Intent intent = new Intent(mContext,SurfaceViewAcitvity.class); 
startActivity(intent);
   }
});

    }
}

SurfaceViewAcitvity.java文件

package cn.m15.xys;

import android.app.Activity;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.Window;
import android.view.WindowManager;
import android.view.SurfaceHolder.Callback;

public class SurfaceViewAcitvity extends Activity {

    MyView mAnimView = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 全屏显示窗体
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
//强制横屏 
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

// 显示自己定义的游戏View
mAnimView = new MyView(this);
setContentView(mAnimView);
    }

    public class MyView extends SurfaceView implements Callback,Runnable ,SensorEventListener{

/**每50帧刷新一次屏幕**/  
public static final int TIME_IN_FRAME = 30; 

/** 游戏画笔 **/
Paint mPaint = null;
Paint mTextPaint = null;
SurfaceHolder mSurfaceHolder = null;

/** 控制游戏更新循环 **/
boolean mRunning = false;

/** 游戏画布 **/
Canvas mCanvas = null;

/**控制游戏循环**/
boolean mIsRunning = false;

/**SensorManager管理器**/
private SensorManager mSensorMgr = null;    
Sensor mSensor = null;    

/**手机屏幕宽高**/
int mScreenWidth = 0;
int mScreenHeight = 0;

/**小球资源文件越界区域**/
private int mScreenBallWidth = 0;
private int mScreenBallHeight = 0;

/**游戏背景文件**/
private Bitmap mbitmapBg;

/**小球资源文件**/
private Bitmap mbitmapBall;

/**小球的坐标位置**/
private float mPosX = 200;
private float mPosY = 0;

/**重力感应X轴 Y轴 Z轴的重力值**/
private float mGX = 0;
private float mGY = 0;
private float mGZ = 0;

public MyView(Context context) {
   super(context);
   /** 设置当前View拥有控制焦点 **/
   this.setFocusable(true);
   /** 设置当前View拥有触摸事件 **/
   this.setFocusableInTouchMode(true);
   /** 拿到SurfaceHolder对象 **/
   mSurfaceHolder = this.getHolder();
   /** 将mSurfaceHolder加入到Callback回调函数中 **/
   mSurfaceHolder.addCallback(this);
   /** 创建画布 **/
   mCanvas = new Canvas();
   /** 创建曲线画笔 **/
   mPaint = new Paint();
   mPaint.setColor(Color.WHITE);
   /**载入小球资源**/
   mbitmapBall = BitmapFactory.decodeResource(this.getResources(), R.drawable.ball);
   /**载入游戏背景**/
   mbitmapBg = BitmapFactory.decodeResource(this.getResources(), R.drawable.bg);
   
   /**得到Sens
    * orManager对象**/
   mSensorMgr = (SensorManager) getSystemService(SENSOR_SERVICE);   
   mSensor = mSensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);   
   // 注冊listener,第三个參数是检測的准确度  
            //SENSOR_DELAY_FASTEST 最灵敏 由于太快了不是必需使用
            //SENSOR_DELAY_GAME    游戏开发中使用
            //SENSOR_DELAY_NORMAL  正常速度
            //SENSOR_DELAY_UI       最慢的速度
   mSensorMgr.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_GAME);  
}
        
private void Draw() {
  
   /**绘制游戏背景**/
   mCanvas.drawBitmap(mbitmapBg,0,0, mPaint);
   /**绘制小球**/
   mCanvas.drawBitmap(mbitmapBall, mPosX,mPosY, mPaint);
   /**X轴 Y轴 Z轴的重力值**/
   mCanvas.drawText("X轴重力值 :" + mGX, 0, 20, mPaint);
   mCanvas.drawText("Y轴重力值 :" + mGY, 0, 40, mPaint);
   mCanvas.drawText("Z轴重力值 :" + mGZ, 0, 60, mPaint);
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {

}

@Override
public void surfaceCreated(SurfaceHolder holder) {
   /**開始游戏主循环线程**/
   mIsRunning = true;
   new Thread(this).start();
   /**得到当前屏幕宽高**/
   mScreenWidth = this.getWidth();
   mScreenHeight = this.getHeight();
   
   /**得到小球越界区域**/
   mScreenBallWidth = mScreenWidth - mbitmapBall.getWidth();
   mScreenBallHeight = mScreenHeight - mbitmapBall.getHeight();
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
   mIsRunning = false;
}

@Override
public void run() {
   while (mIsRunning) {

/** 取得更新游戏之前的时间 **/
long startTime = System.currentTimeMillis();

/** 在这里加上线程安全锁 **/
synchronized (mSurfaceHolder) {
   /** 拿到当前画布 然后锁定 **/
   mCanvas = mSurfaceHolder.lockCanvas();
   Draw();
   /** 绘制结束后解锁显示在屏幕上 **/
   mSurfaceHolder.unlockCanvasAndPost(mCanvas);
}

/** 取得更新游戏结束的时间 **/
long endTime = System.currentTimeMillis();

/** 计算出游戏一次更新的毫秒数 **/
int diffTime = (int) (endTime - startTime);

/** 确保每次更新时间为50帧 **/
while (diffTime <= TIME_IN_FRAME) {
   diffTime = (int) (System.currentTimeMillis() - startTime);
   /** 线程等待 **/
   Thread.yield();
}

   }

}
 
@Override
public void onAccuracyChanged(Sensor arg0, int arg1) {
   // TODO Auto-generated method stub
   
}

@Override
public void onSensorChanged(SensorEvent event) {
   mGX = event.values[SensorManager.DATA_X];
   mGY= event.values[SensorManager.DATA_Y];
   mGZ = event.values[SensorManager.DATA_Z];

   //这里乘以2是为了让小球移动的更快
   mPosX -= mGX * 2;
   mPosY += mGY * 2;

   //检測小球是否超出边界
   if (mPosX < 0) {
mPosX = 0;
   } else if (mPosX > mScreenBallWidth) {
mPosX = mScreenBallWidth;
   }
   if (mPosY < 0) {
mPosY = 0;
   } else if (mPosY > mScreenBallHeight) {
mPosY = mScreenBallHeight;
   }
}
    }
}

android小游戏模版—重力感应的更多相关文章

  1. 软件工程 Android小游戏 猜拳大战

    一.前言 最近学校举办的大学生程序设计竞赛,自己利用课余时间写了一个小游戏,最近一直在忙这个写这个小游戏,参加比赛,最终是老师说自己写的简单,可以做的更复杂的点的.加油 二.内容简介 自己玩过Andr ...

  2. 介绍一款Android小游戏--交互式人机对战五子棋

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6589025 学习Android系统开发之余,编 ...

  3. Android开发系列(十六):【Android小游戏成语连连看】第二篇

    写的晚了,在分工个Z市高中的一个成绩查询的系统,原系统居然是用VB写的,我不得不佩服原本写系统的那位哥们真能耐得住. 明天搭建下SVN就等着先发project款然后開始项目了.想想有工资进账,心里也为 ...

  4. Android小游戏:功夫蛇 团队开发经验总结

    前言 曾经没有代码管理的习惯,不用回版本控制工具.这种陋习虽然让原来千穿百孔的代码远离了实现,但这种逃避未必就是一件好事吧;). 于是从博客中挖出了原来的文章,并千辛万苦找到了最早的代码贴出来. 这篇 ...

  5. Android开发系列(十五):【Android小游戏成语连连看】第一篇

            学了一个多月安卓.由于暑假的时候要给朋友说写个小游戏.并且也想检測下自己的能力,所以说从7号開始就着手写这个小游戏了,前前后后带上课到今天总算是写完了,可是写的这个小游戏还是有非常多问 ...

  6. android小游戏 飞机躲子弹

    最近android老师让每人写一个小东西,因为之前学awt时写过一个java版的飞机躲子弹,所以这次想写成android版的. 文件直接导入就行http://files.cnblogs.com/fil ...

  7. Windows Phone 7之XNA游戏:重力感应

    Windows Phone XNA游戏提供的重力传感器可以利用量测重力的原理判手机移动的方向,允许使用者利用摇动或甩动手机的方式控制游戏的执行,其原理和汽车的安全气囊相同,在侦测到汽车快速减速的时候立 ...

  8. 基于cocos2d开发的android小游戏——採花仙

    /*cocos 2d 已经成为了如今移动端游戏开发的强有力的工具,眼下主流游戏中多採用cocos 2d游戏引擎. 我也尝试了一下该引擎.我是用的是cocos2d-android,以后要移植到Cocos ...

  9. 第四十天 阿乐在其中—Android小游戏的飞机(四)加入敌人

    8月9日,晴. "江城如画里,山晓望晴空. 雨水夹明镜.双桥落彩虹. 人烟寒橘柚,秋色老梧桐." 上篇已经让飞机载入子弹和音效及背景音乐,本篇主要加入敌机. 本篇要用到的几个函数解 ...

随机推荐

  1. Java的工厂模式(一)

    Java的工厂模式在框架中是用的到很多的,所谓的工厂模式,其实也就是用一个接口来创建对象,把实例化的工作推迟到子类去实现.这样在主函数中就可以直接创建一个工厂类,再通过这个工厂类实现操作. 假设有一个 ...

  2. PCA vs Linear Regression 可视化理解

    https://shankarmsy.github.io/posts/pca-vs-lr.html https://shapeofdata.wordpress.com/2013/04/09/princ ...

  3. 数据库连接池使用(一):使用C#数据库连接池

         一.导读      使用C#数据库连接池,连接到数据库服务器通常由几个需要软长时间的步骤组成:      1.必须与服务器进行初次连接:      2.必须分析连接字符串信息:      3 ...

  4. AJAX异步的 JavaScript

    什么是AJAX: AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML). AJAX 不是新的编程语言,而是一种使用现有标准的新方法. ...

  5. drupal7,注册成功之后想跳转到指定页面,该怎么破?

     1.hook sigup form alter,修改跳转地址 .还没试过 2.安装一下logintoboggan模块,里面有个注册后跳转到哪个页面的设置 这个对于不写代码的是比较方便的方法    3 ...

  6. ifconfig命令无法找到,提示bash: ifconfig: command not found

    问题就是题目那样,具体解决方法截图如下: 分析问题 1.whereis ifconfig 看一下这个命令在哪个目录下 2.echo $PATH 看一下该目录是否在路经下,注意lunux下是完全区分大小 ...

  7. Dynamics 365 App for Outlook 与 Dynamics 365 for Outlook(已被弃用)

    在最新的版本中Dynamics 365 for Outlook(Outlook 客户端)已被弃用 随 Dynamics CRM 2016(版本 8.0)引入的 Dynamics 365 App for ...

  8. ETH智能合约测试

    ETH的智能合约一般用Solidity语言编写,懂点基本solidity语法会更好地测试 测试中需要用到的工具: 一份智能合约 Remix(一个在线IDE,用来编译.编辑.部署智能合约,需要FQ才能使 ...

  9. 带你从零学ReactNative开发跨平台App开发[react native SqlLite 终极运用](十二)

    ReactNative跨平台开发系列教程: 带你从零学ReactNative开发跨平台App开发(一) 带你从零学ReactNative开发跨平台App开发(二) 带你从零学ReactNative开发 ...

  10. Latex 数学公式使用入门

    Latex 数学公式使用示例 Latex 数学公式命令中,数学符号都使用反斜杠(backslash, '\')转义英文缩略词 , 一些简单的数学符号命令: 其使用大括号(curly braces, ' ...