利用安卓手机的加速度传感器玩Processing游戏
0赞
图1
前几天,试通了在安卓手机上运行Processing程序,今天趁热打铁,挖掘下安卓手机的加速度传感器,让它与Processing画布中的物体互动。
手机中加速度传感器的X、Y、Z的加速度值通过Processing专门函数反馈出的值如下图。
图2
当手机水平放置时,X和Y轴值接近0,Z轴值接近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时,“带嘴巴的”圆球马上停止不动。同时,如果“带嘴巴的”圆球移动到画布边沿,它也会停止不动。
我给程序的注释很详尽,大家看看,注意有关加速度传感器的X、Y、Z轴值如何读取的程序段,我用红色字体进行了标注。
今天我发现,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; //“带嘴巴的”圆球初始设置为向左移动
//声明accel为AccelerometerManager对象
AccelerometerManager accel;
//全局变量ax、ay、az用于存储手机中加速度传感器的X、Y、Z的加速度值
float ax, ay, az;
//初始化
void setup(){
size(480,240);//把画布尺寸设置X轴480像素,Y轴240像素
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;
}