我正在开发一个游戏,使用jbox2d和jBox2d for android。我想检测用户是否触摸了我世界各种身体中特定的动态身体。我试过迭代所有的身体,找到我的兴趣之一,但它对我没有用。请帮忙 继承人我做了什么:
@Override
public boolean ccTouchesEnded(MotionEvent event)
{
CGPoint location = CCDirector.sharedDirector().convertToGL(CGPoint.ccp(event.getX(),
event.getY()));
for(Body b = _world.getBodyList();b.getType()==BodyType.DYNAMIC; b.getNext())
{
CCSprite sprite = (CCSprite)b.getUserData();
if(sprite!=null && sprite instanceof CCSprite)
{
CGRect body_rect = sprite.getBoundingBox();
if(body_rect.contains(location.x, location.y))
{
Log.i("body touched","<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<");
expandAndStopBody(b);
break;
}
}
}
return true;
}
触摸后,系统继续打印GC_CONCURRENT释放1649K,14%释放11130K / 12935K,暂停1ms + 2ms,一切都像状态一样挂起。
答案 0 :(得分:1)
要检查身体是否被触摸,您可以使用世界对象的方法 queryAABB 。我尝试重新排列您的代码以使用该方法:
// to avoid creation every time you touch the screen
private QueryCallback qc=new QueryCallback() {
@Override
public boolean reportFixture(Fixture fixture) {
if (fixture.getBody()!=null)
{
Body b=fixture.getBody();
CCSprite sprite = (CCSprite)b.getUserData();
Log.i("body touched","<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<");
expandAndStopBody(b);
}
return false;
}
};
private AABB aabb;
@Override
public boolean ccTouchesEnded(MotionEvent event)
{
CGPoint location = CCDirector.sharedDirector().convertToGL(CGPoint.ccp(event.getX(), event.getY()));
// define a bounding box with width and height of 0.4f
aabb=new AABB(new Vec2(location.x-0.2f, location.y-0.2f),new Vec2(location.x+0.2f, location.y+0.2f));
_world.queryAABB(qc, aabb);
return true;
}
我尝试减少垃圾收集器,但必须要有一些东西才能实现。 有关http://www.iforce2d.net/b2dtut/world-querying
的更多信息答案 1 :(得分:0)
您应该检查以确保列表中的正文不为空,例如
for ( Body b = world.getBodyList(); b!=null; b = b.getNext() )
{
// do something
}
不确定这是否能解决问题,但应该这样做。