当使用相机跟踪精灵时,我应该使用绑定相机(Andengine)吗?

时间:2013-11-19 22:36:59

标签: android camera andengine

我知道我可以使用mCamera.setChaseEntity(mSprite)将相机设置为跟随我的精灵。但在进行研究时,我看到了使用绑定相机的建议。有什么区别/好处?

为了记录,我有一些Andengine和PhysicsBox2D的开发经验,但我只是在屏幕的范围内工作。基本上,我想要做的是让一个对象从屏幕的左侧开始。一旦它通过水平中心(它没有垂直对齐),我需要相机开始跟随它,因为它向右移动通过世界其他地方。

在我第一次尝试这个时,我使用了一个处理程序来检查sprite是否在水平中心(给出或取5%的错误)。然后我设置mCamera.setChaseEntity(mSprite)。由于物体没有垂直居中,因此相机显然会跳到物体的中心位置。它以一种格外紧张的方式跟着它(研究让我相信相机无法处理物理引擎的速度并使用计时器来减慢速度)。

当我看到Nicholas推出的Bound Camera示例时。它似乎正是我想要的,但在实现它时,我只是得到了一个非常拉伸的我的世界图像,并且相机没有跟随超出屏幕边界的精灵。这就是我使用的(当通过水平中心时忽略中心摄像头):

public EngineOptions onCreateEngineOptions() {
        // Initialize camera
        mCamera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT);
        mBoundChaseCamera = new BoundCamera(0, 0, CAMERA_WIDTH / 2, CAMERA_HEIGHT / 2);
        mBoundChaseCamera.setCenter(CAMERA_WIDTH/2, CAMERA_HEIGHT/2);

        // Create engine options
        EngineOptions options = new EngineOptions(true, ScreenOrientation.LANDSCAPE_FIXED, new RatioResolutionPolicy(CAMERA_WIDTH*2, CAMERA_HEIGHT), mCamera);

        return options;
    } 

.....

@Override
public void onPopulateScene(Scene pScene,
        OnPopulateSceneCallback pOnPopulateSceneCallback) throws Exception {

    // Create player sprite
    sPlayer = new Sprite(0, 0, playerTR,getVertexBufferObjectManager());
    sPlayer.setPosition(20, CAMERA_HEIGHT/2);
    mBoundChaseCamera.setBoundsEnabled(true);
    mBoundChaseCamera.setChaseEntity(sPlayer);
    final FixtureDef PLAYER_FIX = PhysicsFactory.createFixtureDef(1.0f,.5f, .2f); // *(density, elasticity, friction)
    body = PhysicsFactory.createBoxBody(physicsWorld, sPlayer,BodyType.DynamicBody, PLAYER_FIX);
    physicsWorld.registerPhysicsConnector(new PhysicsConnector(sPlayer,body, true, false));

    Sprite sLaunch = new Sprite((CAMERA_WIDTH-80),10, launchTR, getVertexBufferObjectManager()){
        public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final float pTouchAreaLocalX, final float pTouchAreaLocalY) {
            body.applyLinearImpulse(20, 30, body.getWorldCenter().x, body.getWorldCenter().y);
            return true;
        }
    };

    mScene.attachChild(sPlayer);
    mScene.registerTouchArea(sLaunch);
    mScene.attachChild(sLaunch);
    mScene.setTouchAreaBindingOnActionDownEnabled(true);

    // Callback
    pOnPopulateSceneCallback.onPopulateSceneFinished();
}

我不是在找人编写我的代码,甚至不一定要调试它。如果有人能指出我正确的方向,或者推荐一个最佳实践来实现我想要做的事情。

1 个答案:

答案 0 :(得分:3)

您的代码出现的错误是缺少setBound(...)方法,该方法在启用相机范围时使用,以限制相机的X,Y移动。没有它,相机会将追逐的实体保持在屏幕中间。

实施例: 假设你有一个游戏,玩家以纵向模式从底部爬到顶部。 所以要看专业版,播放器必须从设备屏幕的底部开始向上移动。所以在这种情况下,相机追逐玩家,但在开始时我们需要将相机的下限设置在玩家的正下方,所以当它实际上跟随玩家时,在开始时玩家不是垂直居中,而是它出现在底部。

我的建议是使用SmoothCamera(它扩展了边界摄像头,但允许你设置摄像头的速度),然后根据需要设置边界。请记住,只有当玩家在场景中到达为相机设置的边界时才会出现“边界”效果

代码示例(不适用于之前的攀爬事项):

    @Override
    public EngineOptions onCreateEngineOptions() {

    this.mCamera = new SmoothCamera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT, 1750, 1750, 0.1f);

    EngineOptions engineOptions = new EngineOptions(true, ScreenOrientation.LANDSCAPE_FIXED, new RatioResolutionPolicy(
            CAMERA_WIDTH, CAMERA_HEIGHT), mCamera);

    mCamera.setBoundsEnabled(true);
    mCamera.setBounds(0 , 0, MAX_CAMERA_X , MAX_CAMERA_Y);
    return engineOptions;

}