我正在使用 Cocos2d iPhone 和 Box2D 来创建一个基本的物理引擎。
有时用户需要在一个小的 box2D 对象周围拖动。
在小物体上创建触摸关节有点偶然,游戏引擎将其视为对空白空间的点击,就像实际创建适当的触摸关节一样频繁。在实践中,这意味着用户不断地用手指在屏幕上捣碎,但徒劳地试图移动一个顽固的物体。我希望游戏能够轻松选择小物体,而不会出现这种“命中注定”的效果。
我可以创建带有较大传感器的小物体,但这并不理想,因为超过一定尺寸(直径约 40 像素)的物体不需要这种额外的复杂层;小物体只是按比例缩小的大物体。
在移动小物体时,我可以使用哪些策略来让用户体验更好?
这是 ccTouchBegan 中的 AABB 代码:
b2Vec2 locationWorld = b2Vec2(touchLocation.x/PTM_RATIO, touchLocation.y/PTM_RATIO);
b2AABB aabb;
b2Vec2 delta = b2Vec2(1.0/PTM_RATIO, 1.0/PTM_RATIO);
//Changing the 1.0 here to a larger value doesn't make any noticeable difference.
aabb.lowerBound = locationWorld - delta;
aabb.upperBound = locationWorld + delta;
SimpleQueryCallback callback(locationWorld);
world->QueryAABB(&callback, aabb);
if(callback.fixtureFound){
//dragging code, updating sprite location etc.
}
SimpleQueryCallback 代码:
class SimpleQueryCallback : public b2QueryCallback
{
public:
b2Vec2 pointToTest;
b2Fixture * fixtureFound;
SimpleQueryCallback(const b2Vec2& point) {
pointToTest = point;
fixtureFound = NULL;
}
bool ReportFixture(b2Fixture* fixture) {
b2Body* body = fixture->GetBody();
if (body->GetType() == b2_dynamicBody) {
if (fixture->TestPoint(pointToTest)) {
fixtureFound = fixture;
return false;
}
}
return true;
}
};