图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。
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
///加速度传感器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 ==
//同时,如果球在停止移动前向右移动
if(dir_state=={
arc(step,120,radius,radius,0.52,5.76)
speed=0; //球移动步长设置为0,因此球停止移动
}
//同时,如果球在停止移动前向左移动
if(dir_state=={
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;
}