宜昌老张

利用安卓手机的加速度传感器玩Processing游戏

0
阅读(3376)

图1

    前几天,试通了在安卓手机上运行Processing程序,今天趁热打铁,挖掘下安卓手机的加速度传感器,让它与Processing画布中的物体互动。

    手机中加速度传感器的X、Y、Z的加速度值通过Processing专门函数反馈出的值如下图。

  2

   当手机水平放置时,XY轴值接近0Z轴值接近10。如果纵向手持手机,如图所示,顺时针旋转90度,则X轴值为-10,逆时针旋转90度,则X轴值为10。如果横向手持手机,如图1所示,顺时针旋转90度,则Y轴值为10,逆时针旋转90度,则X轴值为-10

   现在我特意做了一个Processing游戏,就是把横向手持手机,利用加速度传感器的Y轴值,控制一个“带嘴巴的”黄色圆球在画布里左右移动,如图1所示。

   利用加速度传感器写Processing程序与普通的方法相比要特别注意在该程序所在文件夹中人为加入AccelerometerManager.java文件。可以看到我写的程序所在文件夹已经加入了该文件。

3

    你如果想另做一个有关加速度传感器的Processing程序,也要人为加入这个文件。这个文件可以解压我上传的这篇文章介绍Processing游戏的文件夹找到。程序请下载:Accelerater_Andriod.rar

    我用的Processing软件版本为Processing 3.0a4,我就是用这个版本试通了在安卓手机上运行Processing程序的。博客文章网址:http://blog.chinaaet.com/detail/38980

    Processing游戏任务为:Processing画布在手机上显示模式锁定为横向显示,当横向手持手机时,右手向下,左手向上,顺时针旋转手机超过一定角度时,加速度传感器Y轴值大于2,画布中的“带嘴巴的”圆球,向右移动。同理,手机逆时针旋转时,加速度传感器Y轴值小于-2,“带嘴巴的”圆球会转身,“嘴巴”切换为向左,圆球向左移动。如果把手机放置大约水平位置,当加速度传感器Y轴值大于-2且小于2时,“带嘴巴的”圆球马上停止不动。同时,如果“带嘴巴的”圆球移动到画布边沿,它也会停止不动。

    我给程序的注释很详尽,大家看看,注意有关加速度传感器的XYZ轴值如何读取的程序段,我用红色字体进行了标注。

    今天我发现,Processing编程环境不管是在Andriod模式下,还是Java模式下,都可以编写和修改程序,如果在Andriod模式下保存程序,那么下次重新打开程序,程序的编程环境也会直接处于Andriod模式下。当然,如果要把程序下载到手机中,必须要编程环境切换为Andriod模式。

   点击编程环境中“播放”运行按钮,可以把下载程序和在手机中运行程序,则两个任务可以一起完成。你只要等待你手机上的Processing画面出现即可,然后就可以玩玩这个Processing游戏了,蛮好玩的!

Processing程序:

int radius =40;//“带嘴巴的”圆球半径为40像素

float step=240; //“带嘴巴的”圆球X轴方向初始位置为240像素

float speed =1.5;//“带嘴巴的”圆球移动步长初始设置1.5像素

int direction=0; //手机放置状态初始设置为水平状态

int dir_state=1; //“带嘴巴的”圆球初始设置为向左移动

//声明accelAccelerometerManager对象

AccelerometerManager accel;

//全局变量axayaz用于存储手机中加速度传感器的XYZ的加速度值

float ax, ay, az;

//初始化

void setup(){

  size(480,240);//把画布尺寸设置X480像素,Y240像素

  smooth();     //开启抗锯齿功能,使线条轮廓光滑

  ellipseMode(RADIUS);//设置画圆模式为半径模式

  accel = new AccelerometerManager(this);//启动加速度管理器

  //Processing画布在手机显示时,被锁定为横向显示。

  //如果要把显示模式锁定为手握手机时的纵向显示,

  //则命令为orientation(PORTRAIT);

  orientation(LANDSCAPE);

}

//主程序

void draw(){

  background(127);//把背景色调为灰色

  fill(255,255,0);//“带嘴巴的”圆球填充为黄色

  step +=speed*dir_state;//计算“带嘴巴的”圆球实时移动的位置

  //加速度传感器Y轴值大于2,手机放置状态为向右倾斜

  if(ay> 2)       direction =1;

  //加速度传感器Y轴值小于-2,手机放置状态为向左倾斜

  else if(ay<- 2) direction =-1;

  //加速度传感器Y轴值大于-2且小于2,手机放置状态为水平

  else           direction =0;

  //当手机放置状态为向右倾斜,同时圆球还未达到画布右边沿

  if(direction ==1 && step<= width-radius){

    arc(step,120,radius,radius,0.52,5.76); //圆球嘴巴向右  

    dir_state=1;//圆球设置为向右移动

    speed=1.5;  //圆球移动步长设置为1.5像素

  }

  //当手机放置状态为向右倾斜,同时圆球已达到画布右边沿

  if(direction ==1 && step> width-radius){

    arc(step,120,radius,radius,0.52,5.76);//圆球嘴巴向右   

    dir_state=1;//圆球设置为向右移动

    speed=0;    //圆球移动步长设置为0,因此圆球停止移动

  }

  //当手机放置状态为向左倾斜,同时圆球还未达到画布左边沿

  if(direction ==-1 && step>= radius) {

    arc(step,120,radius,radius,3.67,8.9);//圆球嘴巴向左  

    dir_state=-1;//圆球设置为向左移动

    speed=1.5;   //圆球移动步长设置为1.5像素

   }

   //当手机放置状态为向左倾斜,同时圆球已达到画布左边沿

   if(direction ==-1 && step< radius) {

    arc(step,120,radius,radius,3.67,8.9);//圆球嘴巴向左   

    dir_state=-1;//圆球设置为向左移动

    speed=0;     //圆球移动步长设置为0,因此圆球停止移动

   }

   //当手机放置状态为水平

   if(direction ==0 ) {

    //同时,如果圆球在停止移动前的移动方向为向右

    if(dir_state== 1){

      arc(step,120,radius,radius,0.52,5.76); //圆球嘴巴向右

      speed=0; //圆球移动步长设置为0,因此圆球停止移动

    }

    //同时,如果圆球在停止移动前的移动方向为向左

    if(dir_state== -1){ 

      arc(step,120,radius,radius,3.67,8.9); //圆球嘴巴向左

      speed=0; //圆球移动步长设置为0,因此圆球停止移动

    }

   }

}

//把手机中加速度传感器的X、Y、Z的加速度值,

//赋值给全局变量ax、ay、az

public void accelerationEvent(float x, float y, float z) {

  ax = x;

  ay = y;

  az = z; 

}