我正在使用开源游戏平台andEngine。我有一个精灵在屏幕上连续移动并在与屏幕边界碰撞时改变方向。现在,我想将其方向改为屏幕上的玩家触摸点。我无法管理这一部分。我使用 PhysicsHandler 以速度移动精灵。我知道我必须实现 IOnSceneTouchListener ,以获得触摸点并在精灵上设置方向。但现在一无所获。这是我的代码:
Pilot aPilot;
PhysicsHandler mPhysicsHandler;
aPilot = new Pilot(222, 333, pilotTexures, vbom) {
@Override
protected void onManagedUpdate(float pSecondsElapsed) {
/*
* change direction when collides with boundary wall of Screen
*/
if (this.mX < 0) {
mPhysicsHandler.setVelocityX(AtomicEngine.DEMO_VELOCITY);
} else if (this.mX + this.getWidth() > ResourcesManager.CAMERA_WIDTH) {
mPhysicsHandler.setVelocityX(-AtomicEngine.DEMO_VELOCITY);
}
if (this.mY < 0) {
mPhysicsHandler.setVelocityY(AtomicEngine.DEMO_VELOCITY);
} else if (this.mY + this.getHeight() > ResourcesManager.CAMERA_HEIGHT) {
mPhysicsHandler.setVelocityY(-AtomicEngine.DEMO_VELOCITY);
}
super.onManagedUpdate(pSecondsElapsed);
}
};
/*
* initialize mPhysicsHandler
*/
mPhysicsHandler = new PhysicsHandler(aPilot);
registerUpdateHandler(this.mPhysicsHandler);
mPhysicsHandler.setVelocity(AtomicEngine.DEMO_VELOCITY,
AtomicEngine.DEMO_VELOCITY);
attachChild(aPilot);
aPilot.setScale(3f);
我的覆盖 onSceneTouchEvent 方法就像:
@Override
public boolean onSceneTouchEvent(Scene pScene, TouchEvent pSceneTouchEvent) {
if (pSceneTouchEvent.isActionDown()) {
// need some idea here
}else if (pSceneTouchEvent.isActionMove()) {
}
return false;
}
等待你的超级敲门声。
答案 0 :(得分:2)
你必须计算飞行员当前位置之间的差异(例如通过调用飞行员精灵的getSceneCenterCoordinates()
你得到场景中的坐标)和触摸事件的位置 - 记住这个区别,你可以计算角度(在UnitCircle上测量)或使用max_velocity&amp;之间百分比的因子。距离长度,然后使用物理处理程序并设置新的速度。该因子用于将速度限制为最大速度。
所以,你的代码应该看起来像这样(没有测试,问它是否不起作用)
@Override
public boolean onSceneTouchEvent(Scene pScene, TouchEvent pSceneTouchEvent) {
MainActivity.this.mCamera.convertCameraSceneToSceneTouchEvent(touchEvent);//see edit
float touchX = touchEvent.getX();
float touchY = touchEvent.getY();
float[] pilotCoord = aPilot.getEntity.getSceneCenterCoordinates();
float pilotX = pilotCoord[0];
float pilotY = pilotCoord[1];
float xDiff = touchX - pilotX;
float yDiff = touchY - pilotY; // could be wrong with AnchorCenter branch
// use the max velo divided by the distance to get the velo factor for x & y,
// but perhaps calculating angles is faster, dunno
float veloFactor = MAX_VELO/sqrt(xDiff^2 + yDiff^2);
float xVelo = xDiff*veloFactor;
float yVelo = yDiff*veloFactor;
mPhysicshandler.setVelocityX(xVelo);
mPhysicshandler.setVelocityY(yVelo);
return true;
}
到目前为止,将速度设定为手指方向的计算。如果你想要某种(de)加速度(例如:只要手指向下,飞行员(de)加速到手指的方向,否则他将坚持他的速度,你必须setLinearVelocity(xVelo, yVelo)
相反,将当前速度设置为速度(以保持速度)
修改强>
将touchEvent从CameraScene转换为SceneTouchEvent仅在将onSceneTouchListener
添加到HUD时才有用。它将基于当前摄像机位置(在场景上)的事件x / y值转换为在场景中发生的xy值。
否则,如果您将侦听器直接添加到场景中,则无需转换触摸事件,并且可以删除该行。