开发者社区 问答 正文

如何通过使用加速度计将运动分配给玩家?

我正在使用一个与街机经典《太空侵略者》类似的方式运行Android应用程序,但我正在使用加速度计从左向右移动播放器。我在“ ElementInvadersView”类中使用了此方法,该方法允许用户通过触摸屏幕来移动播放器:


//Override onTouchListener method and detect screen touches
@Override
public boolean onTouchEvent(MotionEvent motionEvent) {

    switch (motionEvent.getAction() & MotionEvent.ACTION_MASK) {

        // Player has touched the screen
        case MotionEvent.ACTION_DOWN:

            paused = false;

            if (motionEvent.getY()>screenSizeY-screenSizeY/8){
                if (motionEvent.getX()  >   screenSizeX/2){
                    player.setPlayerMovement(player.RIGHT);
                }
                else{
                    player.setPlayerMovement(player.LEFT);
                }
            }

            if(motionEvent.getY()<screenSizeY-screenSizeY/8){
                //Shots Fired
                if(playerProjectile.shoot(player.getX()+player.getLength()/2,screenSizeY,playerProjectile.UP)){
                    soundPool.play(shootID,1,1,0,0,1);

                }
            }

            break;

        // Player has removed finger from screen
        case MotionEvent.ACTION_UP:

            if(motionEvent.getY()>screenSizeY-screenSizeY/10){
                player.setPlayerMovement(player.STOPPED);
            }

            break;
    }
    return true;
}
我```  
在ElementInvadersMainActivity类中创建了SensorEvent,Sensor和SensorEventListener,但它似乎无法找到“ x”值,因此我不知道如何传递它。

这是我的MainActivity中与加速度计有关的代码:
```js
ElementInvadersView elementInvadersView;
SensorManager sensorManager;
Sensor accelerometer;
SensorEventListener listener = new SensorEventListener() {
    @Override
    public void onSensorChanged(SensorEvent event) {
        if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER){
            x = event.values[0];
            elementInvadersView.setX(x);
            elementInvadersView.invalidate();
        }


    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Display display =  getWindowManager().getDefaultDisplay();
    Point size = new Point();
    display.getSize(size);
    elementInvadersView = new ElementInvadersView(this, size.x, size.y);
    setContentView(elementInvadersView);
    sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
    accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
}

我是否将加速度计放在错误的位置?它是否应该进入我的PlayerObject类,该类绘制对撞机并更新播放器的状态?

任何帮助将不胜感激。

展开
收起
垚tutu 2019-12-12 09:59:25 661 分享 版权
阿里云 AI 助理回答

您提到的使用加速度计来控制Android应用程序中类似《太空侵略者》游戏的玩家移动,是一个很有趣的互动方式。不过,您的问题似乎没有完全提出。根据上下文,我假设您可能想要了解如何结合使用触摸事件和加速度计数据来控制玩家移动,或者遇到了实现上的困难。下面我会提供一个简化的示例,说明如何在Android应用中读取加速度计数据并应用于玩家移动。

首先,确保在AndroidManifest.xml中添加了传感器权限:

<uses-permission android:name="android.permission.ACCESS_ACCELEROMETER" />

接着,在您的ElementInvadersView类或其他相关类中,实现加速度计的监听逻辑。这里是一个基本的示例:

  1. 初始化加速度计:在您的Activity或自定义View的onResume()方法中注册加速度计监听器。
SensorManager sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
Sensor accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
sensorManager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_GAME);

注意:这里假设您的类实现了SensorEventListener接口。

  1. 实现SensorEventListener接口:处理加速度计的数据更新。
@Override
public void onSensorChanged(SensorEvent event) {
    if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
        float x = event.values[0]; // X轴加速度
        // 通常,设备水平放置时,X轴正向表示右移,负向表示左移
        // 根据x值调整玩家位置,这里简化处理,实际应用中需要平滑处理和边界检查
        player.move(x); // 假设player对象有一个move方法来改变其位置
    }
}

@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
    // 可以在这里处理传感器精度变化,如果需要的话
}
  1. 记得在onPause()中注销监听器,以避免不必要的资源消耗。
@Override
protected void onPause() {
    super.onPause();
    SensorManager sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
    sensorManager.unregisterListener(this);
}

关于您提到的onTouchEvent方法,如果您已经实现了通过触摸屏幕移动玩家,那么只需在此基础上增加加速度计的逻辑即可。触摸事件可以用于更精确的控制(如射击等操作),而加速度计则为玩家提供了一种动态的移动方式。

请根据您的具体需求调整上述代码,比如加入对加速度数据的滤波(低通滤波去除噪声)、限制玩家移动范围、以及处理不同设备方向的适配等。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答