我有点问题。我正在制作空气曲棍球比赛。我想拖放玩家身体,以便它可以在PhysicsWorld中碰撞/给予其他物体但是! 我确实希望我的身体(触摸)能够像我的手指一样伸出并移动(并且仍然有力!) 我在下面给你的代码几乎具有我想要的效果但是当我移动手指时......在我触摸的区域周围“弹跳”。如何使它坚持我的手指仍然计算力? 有人可以帮助我在这段代码中改变什么吗?非常感谢你:)!
private Body groundBody = null;
public MouseJoint createMouseJoint(AnimatedSprite box , float x, float y){
final Body boxBody = this.mPhysicsWorld.getPhysicsConnectorManager().findBodyByShape(box);
float pixelToMeteRatio=64;
Vector2 v =boxBody.getWorldPoint(new Vector2(x/pixelToMeteRatio, y/pixelToMeteRatio));
MouseJointDef mjd = new MouseJointDef();
mjd.bodyA = groundBody;
mjd.bodyB = boxBody;
mjd.dampingRatio = 1f;
mjd.frequencyHz = 30;
mjd.maxForce = (float) (200.0f * boxBody.getMass());
mjd.collideConnected = true;
mjd.target.set(v);
return (MouseJoint) this.mPhysicsWorld.createJoint(mjd);
}
MouseJoint mjActive = null;
private float pixelToMeteRatio = PhysicsConstants.PIXEL_TO_METER_RATIO_DEFAULT;
@Override
public boolean onAreaTouched(
final TouchEvent pSceneTouchEvent,
final ITouchArea pTouchArea ,
final float pTouchAreaLocalX,
final float pTouchAreaLocalY )
{
if(pSceneTouchEvent.getAction() == MotionEvent.ACTION_DOWN) {
this.runOnUpdateThread(new Runnable() {
@Override
public void run() {
final AnimatedSprite face = (AnimatedSprite)pTouchArea; //The touched body
//If we have a active MouseJoint, we are just moving arround don't create an 2nd one.
if( mjActive == null)
{
Vector2 vector = new Vector2(pTouchAreaLocalX/pixelToMeteRatio,pTouchAreaLocalY/pixelToMeteRatio);
//=====================================
// GROUNDBODY - Used for the MouseJoint
//=====================================
BodyDef groundBodyDef = new BodyDef();
groundBodyDef.position.set(vector);
groundBody = mPhysicsWorld.createBody(groundBodyDef);
//====================================
// CREATE THE MOUSEJOINT
//====================================
mjActive = createMouseJoint(face, pTouchAreaLocalX, pTouchAreaLocalY);
}
}});
return true;
}
return false;
}
@Override
public boolean onSceneTouchEvent(final Scene pScene, final TouchEvent pSceneTouchEvent) {
if(this.mPhysicsWorld != null) {
if(pSceneTouchEvent.getAction() == MotionEvent.ACTION_MOVE) {
this.runOnUpdateThread(new Runnable() {
@Override
public void run() {
if( mjActive != null ){ //If the MJ is active move it ..
// =========================================
// MOVE THE MOUSEJOINT WITH THE FINGER..
// =========================================
Vector2 vec = new Vector2(pSceneTouchEvent.getX()/pixelToMeteRatio, pSceneTouchEvent.getY()/pixelToMeteRatio);
mjActive.setTarget(vec);
}
}});
return true;
}
//===========================================
// RELEASE THE FINGER FROM THE SCENE..
//===========================================
if( pSceneTouchEvent.getAction() == MotionEvent.ACTION_UP || pSceneTouchEvent.getAction() == MotionEvent.ACTION_CANCEL
) {
this.runOnUpdateThread(new Runnable() {
@Override
public void run() {
if( mjActive != null )
{
//======================================
// DESTROY OUR MOUSEJOINT
//======================================
mPhysicsWorld.destroyJoint(mjActive);
// groundBody.setTransform(pSceneTouchEvent.getX(), pSceneTouchEvent.getY(), groundBody.get);
mPhysicsWorld.destroyBody(groundBody);
mjActive = null;
}
}});
// groundBody.setLinearVelocity(0,0);
return true;
}
}
return false;
答案 0 :(得分:0)
调整以下参数:dampingRatio,frequencyHz,maxForce。此外,降低身体的质量应该有所帮助。我认为将阻尼设置得非常接近1,频率稍微高一些,而非常高的力应该可以解决问题。