我正在使用onSceneTouchEvent在TMX地图上移动玩家:
@Override
public Scene onCreateScene() {
...
mScene.setOnSceneTouchListener(this);
}
...
@Override
public boolean onSceneTouchEvent(Scene pScene, final TouchEvent pSceneTouchEvent) {
switch(pSceneTouchEvent.getAction()) {
case TouchEvent.ACTION_DOWN:
mLastMotionX = pSceneTouchEvent.getX();
mLastMotionY = pSceneTouchEvent.getY();
break;
case TouchEvent.ACTION_MOVE:
mLastMotionX1 = pSceneTouchEvent.getX();
mLastMotionY1 = pSceneTouchEvent.getY();
SpeedVector(mLastMotionX, mLastMotionY, mLastMotionX1,
mLastMotionY1);
break;
case TouchEvent.ACTION_UP:
mLastMotionX2 = pSceneTouchEvent.getX();
mLastMotionY2 = pSceneTouchEvent.getY();
SpeedVectorStop(mLastMotionX, mLastMotionY, mLastMotionX2,
mLastMotionY2);
break;
}
return false;
}
...
public void SpeedVector(float x1, float y1, float x2, float y2) {
if ((Math.abs(x2 - x1) < 55) && (Math.abs(y2 - y1) < 55)) {
float r = (float) Math.sqrt(((x2 - x1) * (x2 - x1))
+ ((y2 - y1) * (y2 - y1)));
float rx = (x2 - x1) / r;
float ry = (y2 - y1) / r;
new Vector2(rx * 100, ry * 100);
new Vector2(x2, y2);
if (speedThread) {
mPlayerBody.setLinearVelocity(rx * 15, ry * 15);
} else
mPlayerBody.setLinearVelocity(rx * 5, ry * 5);
}
}
public void SpeedVectorStop(float x1, float y1, float x2, float y2) {
if ((Math.abs(x2 - x1) < 10) && (Math.abs(y2 - y1) < 10)) {
mPlayerBody.setLinearVelocity(0, 0);
}
}
现场还有很多追求玩家的精灵(敌人)(简单的AI)。他们的位置和速度根据与玩家的距离而变化。 因此,所有数据都在下一个方法中更新:
@Override
public final void onUpdate(final float pSecondsElapsed) {
//some code
}
当我几次触摸现场时 - AndEngine会崩溃 这是一个LogCat:
05-05 17:13:06.539:V / AndEngine(2676): org.andengine.input.touch.TouchEvent $ TouchEventPool是 筋疲力尽,2件尚未回收。分配1个。 05-05 17:13:06.539:V / AndEngine(2676): org.andengine.util.adt.pool.PoolUpdateHandler $ 1 已经筋疲力尽,还有2件尚未回收。分配1个。 05-05 17:13:06.559:V / AndEngine(2676): org.andengine.input.touch.TouchEvent $ TouchEventPool是 筋疲力尽,3件尚未回收。分配1个。 05-05 17:13:06.559:V / AndEngine(2676): org.andengine.util.adt.pool.PoolUpdateHandler $ 1 已经筋疲力尽,还有3件尚未回收。分配1个。 05-05 17:13:06.579:V / AndEngine(2676): org.andengine.input.touch.TouchEvent $ TouchEventPool是 疲惫不堪,还有4件尚未回收。分配1个。 05-05 17:13:06.579:V / AndEngine(2676): org.andengine.util.adt.pool.PoolUpdateHandler $ 1 已经筋疲力尽,还有4件尚未回收。分配了1个。
等等。
有人遇到过这个问题吗?
问题非常紧迫,尚无解决方案(
答案 0 :(得分:2)
您的消息由TouchEventPool类中的私有静态成员包含的TouchEventPool生成。
此日志调用由GenericPool<T>
类中的第136行生成,但这不是问题,实际上我也在应用程序中收到它们。
只是通知引擎将分配额外的touchEvent,因为它们被重用。
您可以通过在TouchEventPool,public GenericPool(final int pInitialSize)
构造函数中调用正确的构造函数,或者通过在TouchEventPool中公开public synchronized void batchAllocatePoolItems(final int pCount)
,然后使用正确的参数在应用程序中调用它来增加起始池。
顺便说一句,除非你存储TouchEvent(你真的不应该!!如果你需要它,请复制它!),这是一条信息消息,不会让你的应用程序崩溃。