我已经尝试了很多寻找在屏幕上顺畅地移动动感的车身的解决方案。 鼠标接头不工作对我来说,它有橡皮筋效果不是流畅的动作非常有用。 我也曾尝试运用线性速度使球移动,但却无法做到这样。 怎么样才能使身体上的一个简单的触摸移动的选项? 例如,类似于夜光曲棍球?
答案不一定具体到AndEngine。 Cocos2D中会为我正常工作。
我已经注册触摸监听器,并试图移动身体上使用“移动”操作:
public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final ITouchArea pTouchArea, final float pTouchAreaLocalX, final float pTouchAreaLocalY) {
switch(pSceneTouchEvent.getAction()){
case TouchEvent.ACTION_DOWN:
break;
case TouchEvent.ACTION_MOVE:
strikerBody.setLinearVelocity((pSceneTouchEvent.getX()-strikerBody.getPosition().x * PIXEL_TO_METER_RATIO_DEFAULT),(pSceneTouchEvent.getY()-strikerBody.getPosition().y * PIXEL_TO_METER_RATIO_DEFAULT));
break;
case TouchEvent.ACTION_UP:
break;
default:
break;
}}
身体不动,并在正确的方向,但如果手指动作快一点它运行从手指离开,随着速度的增加幅度。
如果不使用物理身体的鼠标关节运动变得不那么容易。 如果更改鼠标的联合定义一些值,那么你一定得到你的愿望的效果。
鼠标接头的默认行为是如此的弹性。 你必须改变它按您的要求。 一个值而定,我提供给你,为我工作。 您检查您的身边。
mouseJointDef.bodyA = this.mGroundBody;
mouseJointDef.bodyB = body;
mouseJointDef.dampingRatio = 4f;
mouseJointDef.frequencyHz = 30;
mouseJointDef.maxForce = (1000.0f * body.getMass());
mouseJointDef.collideConnected = true;
感谢大家的建议。 我终于得到它使用线性速度工作。 现在是相当顺利。 当用户尝试通过使用触摸屏移动身体,手指有时接触到身体,有时你必须从中逃脱。 所以,线速度是在两种情况下被分配:
- 当手指正在触摸的身体,而其移动(onAreaTouched)
当手指不接触身体,它仍然是移动(onSceneTouchEvent)
在使用它都取得了运动流畅的事件下面几行:
情况下TouchEvent.ACTION_MOVE:body.setLinearVelocity(。(pSceneTouchEvent.getX() - body.getPosition()X * PIXEL_TO_METER_RATIO_DEFAULT),(pSceneTouchEvent.getY() - body.getPosition()Y * PIXEL_TO_METER_RATIO_DEFAULT));
据我可以看到它,setPosition两种无助(因为身体会失去它的速度,并且会影响碰撞)?
测量两个触摸事件之间的时间,并计算取决于速度,因为速度的方式/时间,而你的VELO只是方式(固定时间)快速手指运动时 - 即可以解释低速,是不是?
尝试是这样的:
public class YourTouchListener {
long lastTouch = 0;
public boolean onAreaTouched(final TouchEvent pSceneTouchEvent,
final ITouchArea pTouchArea, final float pTouchAreaLocalX,
final float pTouchAreaLocalY) {
switch(pSceneTouchEvent.getAction()){
case TouchEvent.ACTION_DOWN:
this.lastTouch = System.currentTimeMillis();
break;
case TouchEvent.ACTION_MOVE:
long time = System.getCurrentTimeMillis() - lastTouch;
if (time > 0)
strikerBody.setLinearVelocity(
1000* (pSceneTouchEvent.getX() - strikerBody.getPosition().x *
PIXEL_TO_METER_RATIO_DEFAULT)/time,
1000 * (pSceneTouchEvent.getY()-strikerBody.getPosition().y *
PIXEL_TO_METER_RATIO_DEFAULT)/time);
break;
case TouchEvent.ACTION_UP:
this.lastTouch = 0;
break;
default:
break;
}
}
}
我不能答应,这正确工作在第一次尝试(BC i'don't知道什么TIMEUNIT是正确的,但我相信秒,所以(1000 *方式)/(秒* 1000)应该是正确的),或者如果它会在所有的工作,从来没有尝试过。
也许,你将不得不使用的情况下,setPosition两种(X,Y) TouchEvent.ACTION_DOWN
BC身体没有一个不会动TouchEvent.ACTION_MOVE
,你有没有时间(被零除)测定