android小游戏模版—重力感应

好久没更新博客了,今天来谈谈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;

}

}

}

}

android小游戏模版—重力感应,布布扣,bubuko.com

时间: 2024-10-18 21:11:01

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

android 小游戏 ---- 数独(一)

segment 1 android 小游戏 ----  数独(一) 规则:在9X9的棋盘中,每个横行和竖列中的9个格子都包含数字1至9,不重复, 且每个黑色粗实线围住的9个格子都包含数字1至9,不重复. 既然涉及到棋盘,那就少不了绘图,我们知道在android中绘图的工作是由UI线程完成的, 一般是指主线程,而android系统设定UI绘图线程超过5秒不响应就会报异常,所以一般在 子线程中进行数据的计算,然后将消息发给UI线程,使之更新界面. 在Java中我们可以通过View来绘图,在默认情况下

android 小游戏 ---- 数独(四)

segment 4 android 小游戏 ----  数独(四) 好的,棋盘绘制出来了.那么我们如何在空白方格中填写数字呢? 这时按钮就发挥出来它的作用了. 我们在控制器类game中设置一个标志,标示当前用户想要填写的数字, 可以通过监听器监听当前用户点击是哪个按钮,然后用game的set方法设置一下. 首先在MainActivity.java 中设置一下监听器. public class MainActivity extends Activity { private Game game; p

android 小游戏 ---- 数独(三)

segment 3 android 小游戏 ----  数独(三) 好的,既然要把数独棋盘中初始提示数字绘制出来,我们就要先了解数独的一些特点. 数独棋盘中总共是81个数字,那我们是否可以用一个数组来代表整个棋盘对应的数字呢想象我们初始化一个9x9的数组,private int[] sudoku = new int[9*9] //初始化数据 private int[] sudoku = new int[9*9]; 这里使用一维数组,当然使用二维数组更加明了直接,这个随个人喜好. 那么我们可以让

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

写的晚了,在分工个Z市高中的一个成绩查询的系统,原系统竟然是用VB写的,我不得不佩服原本写系统的那位哥们真能耐得住. 明天搭建下SVN就等着先发工程款然后开始项目了,想想有工资进账,心里也为我那干瘪的钱包小兴奋了一把. 闲话不多说了,今天我们来分析下这个小游戏的工作原理以及核心代码的解析: 工作原理: "主界面"以及"关卡界面"不多说了,这两个是直接写了xml文件, 然后,我们在"游戏界面"的搭建是: 用java代码动态生成了这个界面,在界面中通

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

一.前言 最近学校举办的大学生程序设计竞赛,自己利用课余时间写了一个小游戏,最近一直在忙这个写这个小游戏,参加比赛,最终是老师说自己写的简单,可以做的更复杂的点的.加油 二.内容简介 自己玩过Android系统下的节奏大师,自己也就考虑做一个类似的,然后自己写技术水平有限,还是在学习Android阶段,自己就想到可以写一个猜拳的比较小游戏. 这是一款基于Android平台小游戏—猜拳大战,简单,易操作,趣味强,训练反应速度,内存小,没有广告,安全. 最大的特点:训练人的反应速度. 游戏规则:在3

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

文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6589025 学习Android系统开发之余,编写了一个小游戏--交互式人机对战五子棋,自娱自乐.之所以称之为交互式人机对战五子棋,一是因为在进入人机对战模式这前,你可以任意设置好开局,同时,在对战过程中,你可以看到机器的思考过程,还可以标识出每一个落子点的优劣势:二是因为可以为机器增加游戏经验,使得机器越来越聪明.希望喜欢五子棋的同学能够喜欢,

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

学了一个多月安卓,因为暑假的时候要给朋友说写个小游戏,而且也想检测下自己的能力,所以说从7号开始就着手写这个小游戏了,前前后后带上课到今天总算是写完了,但是写的这个小游戏还是有很多问题,但是还好,勉强能跑起来,一些瑕疵就不要在乎太多了,毕竟咱又不准备发布供别人下载. APK安装包下载链接(我给放在百度云盘了,可以直接点击下载):http://pan.baidu.com/s/1bnxpQrH 代码文件下载:(放在CSDN的下载那里了,不需要积分):http://download.csdn.net/

android小游戏 飞机躲子弹

最近android老师让没人写一个小东西,因为之前学awt时写过一个java版的飞机躲子弹,所以这次想写成android版的. 文件直接导入就行http://files.cnblogs.com/files/lolybj/PlaneGame.rar 项目比较简单.主要用了SurfaceView, 只放出主要的类, 1 public class GameView extends SurfaceView implements SurfaceHolder.Callback{ 2 3 4 private

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

/*cocos 2d 已经成为了如今移动端游戏开发的强有力的工具,眼下主流游戏中多採用cocos 2d游戏引擎. 我也尝试了一下该引擎.我是用的是cocos2d-android,以后要移植到Cocos2d-x上.废话不多说,代码例如以下.*/ watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGFwcHlub29t/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/South