2013-03-04 2 views
1

Я пытался изменить скорость физического тела, прикрепленного к прямоугольнику с перемещением акселерометра. Я не могу заставить тело изменять скорость, это постоянное свойство, когда оно установлено?Body Adjustable Velocity AndEngine/Box2D

это в моем populateScene:

rect = new Rectangle(220, -200, 24, 24, this.getVertexBufferObjectManager()); 
rect.setColor(Color.GREEN); 
mScene.attachChild(rect); 

ball = PhysicsFactory.createBoxBody(mPhysicsWorld, rect, BodyType.DynamicBody, droppingBoxDef); 

mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(
        rect, ball)); 

и это, где я пытаюсь изменить скорость:

@Override 
    public void onAccelerationChanged(AccelerationData pAccelerationData) { 

     int accellerometerSpeedX = (int)pAccelerationData.getX(); 
     // accellerometerSpeedY = (int)pAccelerometerData.getY(); 
     //Log.v("Accelerometer X Y Z: ", ""+pAccelerationData); 

     ball.setLinearVelocity(accellerometerSpeedX, 0); 

    } 

Без второй части выше прямоугольника нагрузки хорошо и имеет физический организм работает правильно. Кажется, исчезает, когда я пытаюсь использовать: ball.setLinearVelocity.

Объект Body является глобальной переменной в классе, поэтому он может ссылаться на оба метода. Я попытался использовать обработчик обновления внутри Populationscene и установил ball.setLinearVelocity там, однако это дало те же результаты.

По существу Мой вопрос: Можно ли изменить скорость тела после того, как он подключен к физическому миру?

+1

Не связывайтесь с physicsworld из другого потока, чем AndEngine UpdateThread! Я не могу вспомнить, из какой системы вызывается вызов обратного вызова акселерометра (UIThread, SensorThread?), Но это не AndEngine UpdateThread, и поэтому вы можете получить неожиданное поведение или сбой, если вы не отправляете этот вызов UpdateThread. –

+0

Итак, что мне делать? Сохранить изменение акселерометра в глобальной переменной и использовать это значение в AndEngine UpdateThread? –

+0

Это или 'runOnUpdateThread'. –

ответ

2

Обычно в Box2D вы не устанавливаетеVelocities, а скорее применяете импульсы или силы к телу, чтобы заставить его ускоряться или замедляться.
Для чего вы описываете выше, вы не должны использовать setLinearVelocity. Попробуйте использовать

ball.applyForce(new Vector2(accellerometerSpeedX, 0), ball.getWorldCenter()); 

или

boxBody.applyAngularImpulse(new Vector2(accellerometerSpeedX, 0));