【问题标题】:How to Move a ball using AndEngine?如何使用 AndEngine 移动球?
【发布时间】:2013-08-01 07:23:48
【问题描述】:

屏幕上显示球,但无法移动。

当加速度计改变时我想移动球。

我该怎么做??

提前致谢。

public class MainActivity extends SimpleBaseGameActivity implements IAccelerometerListener  {
    private static int CAMERA_WIDTH = 800;
    private static int CAMERA_HEIGHT = 480;
    Context ctx;
    Sprite ballSprite;

    private ITextureRegion mBackgroundTextureRegion,ball, mTowerTextureRegion, mRing1, mRing2, mRing3;


    @Override
    public EngineOptions onCreateEngineOptions() {
        final Camera camera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT);
        return new EngineOptions(true, ScreenOrientation.LANDSCAPE_FIXED, new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT), camera);
    }

    @Override
    protected void onCreateResources() {
        try {
            ITexture ballTexture = new BitmapTexture(this.getTextureManager(), new IInputStreamOpener() {
                @Override
                public InputStream open() throws IOException {
                    return getAssets().open("ball.png");
                }
            });

            ballTexture.load();

            this.ball = TextureRegionFactory.extractFromTexture(ballTexture);
            this.enableAccelerationSensor((IAccelerationListener) this);

        } catch (IOException e) { e.printStackTrace(); }        
    }

    @Override
    protected Scene onCreateScene() {
        this.mEngine.registerUpdateHandler(new FPSLogger());
        final Scene scene = new Scene();

        ballSprite = new Sprite(0, 0, this.ball, getVertexBufferObjectManager());
        scene.attachChild(ballSprite);      
        return scene;
    }

    @Override
    public void onAccelerometerChanged(AccelerometerData pAccelerometerData) {
        ballSprite.setPosition(ballSprite.getX() + pAccelerometerData.getX(),
                               ballSprite.getY() + pAccelerometerData.getY());
    }

球根本不动。只是我想让它随着加速度计的变化而移动。 我做错了什么吗??

【问题讨论】:

标签: android andengine


【解决方案1】:

找到解决方案。

修改代码如下。

在实施 IAccelerometerListener 时使用了 IAccelerationListener。

public class MainActivity extends SimpleBaseGameActivity implements IAccelerationListener  {
private static int CAMERA_WIDTH = 800;
private static int CAMERA_HEIGHT = 480;
Context ctx;
Sprite ballSprite;

private ITextureRegion mBackgroundTextureRegion,ball, mTowerTextureRegion, mRing1, mRing2, mRing3;


@Override
public EngineOptions onCreateEngineOptions() 
{
    // TODO Auto-generated method stub
    final Camera camera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT);
    return new EngineOptions(true, ScreenOrientation.LANDSCAPE_FIXED, new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT), camera);

}

@Override
protected void onCreateResources() 
{

    try {

        ITexture ballTexture = new BitmapTexture(this.getTextureManager(), new IInputStreamOpener() {
            @Override
            public InputStream open() throws IOException {
                return getAssets().open("ball.png");
            }
        });

        ballTexture.load();

        this.ball = TextureRegionFactory.extractFromTexture(ballTexture);

        this.enableAccelerationSensor(this); //Enable Sensor here

} catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }       
}

@Override
protected Scene onCreateScene() {
    // TODO Auto-generated method stub
    this.mEngine.registerUpdateHandler(new FPSLogger());      
    final Scene scene = new Scene();    
    ballSprite = new Sprite(0, 0, this.ball, getVertexBufferObjectManager());
    final PhysicsHandler physicsHandler = new PhysicsHandler(ballSprite);
    ballSprite.registerUpdateHandler(physicsHandler);
    scene.attachChild(ballSprite);      
    return scene;
}

@Override
public void onAccelerationAccuracyChanged(AccelerationData pAccelerationData) {
    // TODO Auto-generated method stub

}

@Override
public void onAccelerationChanged(AccelerationData pAccelerationData) {
    // TODO Auto-generated method stub
    Log.d("x=","x="+pAccelerationData.getX());
    ballSprite.setPosition(
            ballSprite.getX() + pAccelerationData.getX(),
            ballSprite.getY() + pAccelerationData.getY()
            );
    //body.setLinearDamping(1.5f);

}

【讨论】:

    【解决方案2】:

    您的代码是否被调用?

    public void onAccelerometerChanged(AccelerometerData pAccelerometerData) {
        // TODO Auto-generated method stub
        ballSprite.setPosition(
                ballSprite.getX() + pAccelerometerData.getX(),
                ballSprite.getY() + pAccelerometerData.getY()
                );
    }
    

    你检查过里面的日志吗? x 和 y 的值是多少?如果这个代码块已经被调用,并且x和y也是正常的,请检查你的精灵是否失效了。

    【讨论】:

    • 不,它没有被调用,我做了这个 canges 并尝试了。我怎么称呼它..?? @Override public void onAccelerometerChanged(AccelerometerData pAccelerometerData) { // TODO Auto-generated method stub Log.d("x=","x="+pAccelerometerData.getX()); ballSprite.setPosition( ballSprite.getX() + pAccelerometerData.getX(), ballSprite.getY() + pAccelerometerData.getY() ); }
    • 使用SensorManager。检查谷歌的文档以帮助您获取传感器事件。 :)
    • 可能AndEngine已经封装了相关API。您还可以查看 AndEngine 文档。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多