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

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

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

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

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

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

代码例如以下:(下为部分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;
   }
}
    }
}

转载于:https://www.cnblogs.com/mqxnongmin/p/10697784.html

android小游戏模版—重力感应相关推荐

  1. android小游戏 开发-推广-盈利 介绍

    ------------------------------ 前一阵写了一个android小游戏<彩色方块对对碰(TetraVex)>自娱自乐,后来在里面加了有米广告放到各个应用市场上免费 ...

  2. 我的雷电游戏(重力感应控制)

    算是第一个写的比较满意的游戏吧,肯定还有很多很多不足,希望高手能指点下,呵.现在在看图灵出版的一本android游戏的书籍,有点难,涉及底层有点多,都是JNI.NDK.linux shell脚本等,主 ...

  3. android无线游戏手柄:重力感应控制极品飞车(C#作为服务端)

    源代码:点此下载 这篇博客是我上一篇博客的延续,之所以还要写这篇博客,是希望给大家一些灵感,写一些有趣的东西出来. 上篇博客:android遥控器:控制电脑上的暴风影音播放(C#作为服务端) 首先讲一 ...

  4. android游戏控件使用,3天打造一个 android 小游戏

    十月二日日~十月四日,三天(对前两天没兴趣的,可以直接下拉到第三天) 第一天:小游戏的简单准备 竟然是小游戏-当然越简单越好了- 游戏策划--- 游戏玩法: 玩家只需要把屏幕里面见到的人物全部消灭! ...

  5. Android中如何检测重力感应变化:Sensor和SensorManager

    在实际开发中我遇到一个让人很蛋疼的问题,大致是当我点击某一个按钮的时候,强制切换为横屏显示,这个很容易做到,只需在onclick里面调用setRequestedOrientation(Activity ...

  6. Android小游戏开发:简单的合金弹头游戏(一)游戏框架

    本篇博客适合给初学安卓,熟悉基本的JAVA语法,并希望用安卓写个小游戏的初学者参考,因为博主也因大学课程需要,是在2个星期内自学的JAVA和安卓开发,可能会有一些错误和需要优化的地方,望指出 我在这2 ...

  7. android 免费游戏推荐,10款免费Android小游戏推荐

    如果你是Android手机用户,而且正在寻找一些小游戏来消磨时间,下面这10款免费小游戏将大有帮助.无论你喜欢哪种游戏,下面至少有一两款会满足你的要求. 1. 愤怒的小鸟 自从数月前登录iPhone/ ...

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

    学习Android系统开发之余,编写了一个小游戏--交互式人机对战五子棋,自娱自乐.之所以称之为交互式人机对战五子棋,一是因为在进入人机对战模式这前,你可以任意设置好开局,同时,在对战过程中,你可以看 ...

  9. android 游戏代码,Android小游戏实现代码

    Android课程设计作品,一个小游戏,使用传感器控制小鲸鱼的游动,避免被水面上捕鲸船的鱼枪捕到,针对屏幕为800*480的屏幕设计. 主进程: package game.whale; import ...

最新文章

  1. 第二十五天 how can I 坚持
  2. POJ 2389 Bull Math(水~Java -大数相乘)
  3. magic feature_停止将PostgREST称为“ MAGIC”!
  4. numpy 数据类型与 Python 原生数据类型
  5. 局域网IP被抢占后如何强制夺回
  6. list中随机获取n条、随机生成4位6位数工具类,1-n范围随机数,Math.random()生成随机数
  7. 二叉树 先序遍历 中序遍历 后续遍历 java实现
  8. 【分形理论、分形维数、多重分形、Matlab程序等整理】
  9. 微信小程序上传图片使用canvas添加水印
  10. 优酷kux视频文件转换成mp4格式
  11. 使用Graphics2D给图片加水印(图片+图标)
  12. 【树链剖分】月下毛景树
  13. 【openlayers】ol3入门一基础篇
  14. vue3 全局注册app.config.globalProperties, 如何处理getCurrentInstance 上下文线上环境报错
  15. java category类_Category(类别)
  16. 使用在线UML制作工具Freedgo Design设计uml例子
  17. 数字人民币将如何改变金融生态?
  18. 在Linux下搭建 miniGUI mStudio环境
  19. 分布式缓存数据库面试题redis
  20. 谷歌浏览器书签栏书签丢失问题

热门文章

  1. android string拼接字符串_「JAVA」细述合理创建字符串,分析字符串的底层存储,你不该错过...
  2. jmeter tps指标在哪里看_性能之路——性能测试连载 (3)-性能指标
  3. XSS-Game Level 4
  4. 分治法与递归求科赫曲线
  5. mysql索引优化笔试题_索引优化策略面试题
  6. 充电枪cp信号控制板_新能源汽车充电头气密性检测是怎么做的呢?
  7. Pluto-基于Caffe的GPU多机多卡深度学习算法产品
  8. EasyUI ComboBox应用示例
  9. js判断复选框是否被选中
  10. TurboMail邮件服务器 V4.2.0 正式发布