体感游戏这个概念大家应该不陌生,不过要自己编一个体感游戏似乎有些困难,主要是人体动作的获取比较令人头疼。不过,智能手机的出现让这件事情变得简单了许多。现在我们用的手机里都有许多传感器,例如三轴加速度计,利用这些传感器就可以实现体感游戏的编写。
系统构架是这样的:
手机传感器信息采集——利用算法进行模式识别——利用wifi或蓝牙传给PC——实现PC游戏程序的操控
看起来并不复杂,是吗?我用了不到3个小时就编出了一个demo。传感器用的是Android手机上的三轴加速度计,通信是用的socket,PC上的游戏程序是用Qt现编的贪吃蛇,实现的功能是手持手机,通过手的运动来操控贪吃蛇。闲话不多说,下面放出关键代码:
首先是Android代码,主要是传感器数据采集、socket通信(不要忘记添加网络权限)。用的模式识别非常简单,直接判断某个方向上加速度的大小来辨别方向:
MainActivity.java
package com.example.test;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.List;
import android.app.Activity;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends Activity {
private SensorManager sm;
private mylistener ml;
private Socket so;
protected void onCreate(Bundle savedInstanceState) {
sm = (SensorManager)getSystemService(SENSOR_SERVICE);
List<Sensor> kkk = sm.getSensorList(Sensor.TYPE_ALL);
ml = new mylistener();
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView c = (TextView)(findViewById(R.id.view));
String s = "";
for (int i = 0;i < kkk.size();++i)
s += kkk.get(i).getName() + '\n';
c.setText(s);
new Thread() {
public void run(){
try {
so = new Socket("192.168.1.104", 12345);
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}.start();
}
@Override
protected void onResume() {
Sensor sensor_orientation=sm.getDefaultSensor(Sensor.TYPE_