1

Chipmunk Physics の cpSpaceBBQuery 関数の例でさえ、ガイドを求めてインターネット全体を探しています。著者自身が提供したドキュメントを読んで再読しましたが、うまくいきませんでした。

すべての Chipmunk に関するドキュメントは次のとおりです: http://chipmunk-physics.net/release/ChipmunkLatest-Docs/

私の理解では、関数 cpSpaceBBQuery をコードのどこかで呼び出し、境界ボックスを参照として設定し、形状が見つかったときに呼び出される関数を設定する必要があります。これら 2 つの要素を設定すると、関数が呼び出されることはありません。スプライトをデータパラメータとして追加しようとしましたが、うまくいきませんでした。私は何が欠けていますか?

これに合う例は素晴らしいでしょう。

御時間ありがとうございます!

4

1 に答える 1

1

これについての専門家はいませんが、次のことを見つけました。

http://cutecoder.org/programming/wrapping-style-callbacks-blocks/

http://code.google.com/p/chipmunk-physics/source/browse/wiki/Queries.wiki?r=408

==Bounding Box Queries==

{{{
typedef void (*cpSpaceBBQueryFunc)(cpShape *shape, void *data);
void cpSpaceBBQuery(cpSpace *space, cpBB bb, cpLayers layers, cpGroup group, cpSpaceBBQueryFunc func, void *data);
}}}
 Query `space` over the area of `bb` filtering out matches using the given `layers` and `group`. `func` is called for each shape found along with the `data` argument passed to `cpSpaceBBQuery()`. The bounding box of all shapes passed to the callback overlap the given bounding box, but the shapes themselves might not overlap the box. This function is meant to be an efficient way to find objects in an area, but not a detailed intersection test.

==Examples==

This is the mouse button handler function from the demo app. On mouse down, it finds the shape under the mouse if there is one and adds a joint to it so that you can drag it around.
{{{
static void
click(int button, int state, int x, int y)
{
        if(button == GLUT_LEFT_BUTTON){
                if(state == GLUT_DOWN){
                        cpVect point = mouseToSpace(x, y);

                        cpShape *shape = cpSpacePointQueryFirst(space, point, GRABABLE_MASK_BIT, 0);
                        if(shape){
                                cpBody *body = shape->body;
                                mouseJoint = cpPivotJointNew2(mouseBody, body, cpvzero, cpBodyWorld2Local(body, point));
                                mouseJoint->maxForce = 50000.0f;
                                mouseJoint->biasCoef = 0.15f;
                                cpSpaceAddConstraint(space, mouseJoint);
                        }
                } else if(mouseJoint){
                        cpSpaceRemoveConstraint(space, mouseJoint);
                        cpConstraintFree(mouseJoint);
                        mouseJoint = NULL;
                }
        }
}
}}}

Shoot a laser through a space, find the first shape it hits. We want to draw particles where the laser beam enters and exits the shape.
{{{
cpSegmentQueryInfo info;
if(cpSpaceSegmentQueryFirst(space, a, b, -1, 0, &info)){
        cpSegmentQueryInfo info2;
        cpShapeSegmentQuery(info.shape, b, a, &info2);

        cpVect enterPoint = cpSegmentQueryHitPoint(a, b, info);
        cpVect exitPoint = cpSegmentQueryHitPoint(b, a, info2);
}
}}}
于 2013-01-04T08:10:06.580 に答える