120 lines
8.6 KiB
HTML
120 lines
8.6 KiB
HTML
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
|
<title>Chipmunk Game Dynamics Documentation</title>
|
|
<link rel="stylesheet" type="text/css" href="stylesheet.css" />
|
|
</head>
|
|
<body>
|
|
|
|
<h1>Example Code Snippets:</h1>
|
|
|
|
<!-- Transformation Example -->
|
|
<a name="Transform" />
|
|
<h2>Getting a Transformation from a Rigid Body:</h2>
|
|
|
|
<p>You can quickly and easily build a transformation matrix from a Chipmunk body. The following code is for OpenGL, but it should be trivial to modify for DirectX or affine transforms. (Note that OpenGL matrices are column-major)</p>
|
|
|
|
<pre style="text-align:left;color:#000000; background-color:#ffffff; border:solid black 1px; padding:0.5em 1em 0.5em 1em; overflow:auto;font-size:small; font-family:monospace; ">cpVect pos = body->p;
|
|
cpVect rot = body->rot;
|
|
|
|
GLFloat matrix[<span style="color:#0000ff;">16</span>] = {
|
|
rot.x, rot.y, <span style="color:#0000ff;">0.0f</span>, <span style="color:#0000ff;">0.0f</span>,
|
|
-rot.y, rot.x, <span style="color:#0000ff;">0.0f</span>, <span style="color:#0000ff;">0.0f</span>,
|
|
<span style="color:#0000ff;">0.0f</span>, <span style="color:#0000ff;">0.0f</span>, <span style="color:#0000ff;">1.0f</span>, <span style="color:#0000ff;">0.0f</span>,
|
|
pos.x, pos.y, <span style="color:#0000ff;">0.0f</span>, <span style="color:#0000ff;">1.0f</span>,
|
|
};
|
|
|
|
<span style="color:#003369;">glMultMatrixf</span>(matrix.farr);
|
|
</pre>
|
|
|
|
<!-- Collision Callbacks Example -->
|
|
<a name="CollisionCallbacks" />
|
|
<h2>Collision Callbacks:</h2>
|
|
|
|
<p>This snippet demonstrates several Chipmunk collision callback features. It defines a collision handler that is called when collision shapes start touching and also a post-step callback to remove the collision shape and body.</p>
|
|
|
|
<pre style="text-align:left;color:#000000; background-color:#ffffff; border:solid black 1px; padding:0.5em 1em 0.5em 1em; overflow:auto;font-size:small; font-family:monospace; "><strong><span style="color:#881350;">static</span></strong> <strong><span style="color:#881350;">void</span></strong>
|
|
<span style="color:#003369;">postStepRemove</span>(cpSpace *space, cpShape *shape, <strong><span style="color:#881350;">void</span></strong> *unused)
|
|
{
|
|
<span style="color:#003369;">cpSpaceRemoveBody</span>(space, shape->body);
|
|
<span style="color:#003369;">cpSpaceRemoveShape</span>(space, shape);
|
|
|
|
<span style="color:#003369;">cpShapeFree</span>(shape);
|
|
<span style="color:#003369;">cpBodyFree</span>(shape->body);
|
|
}
|
|
|
|
<strong><span style="color:#881350;">static</span></strong> <strong><span style="color:#881350;">int</span></strong>
|
|
<span style="color:#003369;">begin</span>(cpArbiter *arb, cpSpace *space, <strong><span style="color:#881350;">void</span></strong> *unused)
|
|
{
|
|
<em><span style="color:#236e25;">// Get the cpShapes involved in the collision
|
|
</span></em> <em><span style="color:#236e25;">// The order will be the same as you defined in the handler definition
|
|
</span></em> <em><span style="color:#236e25;">// a->collision_type will be BULLET_TYPE and b->collision_type will be MONSTER_TYPE
|
|
</span></em> cpShape *a, *b; <span style="color:#003369;">cpArbiterGetShapes</span>(arb, &a, &b);
|
|
|
|
<em><span style="color:#236e25;">// Alternatively you can use the CP_ARBITER_GET_SHAPES() macro
|
|
</span></em> <em><span style="color:#236e25;">// It defines and sets the variables for you.
|
|
</span></em> <em><span style="color:#236e25;">//CP_ARBITER_GET_SHAPES(arb, a, b);
|
|
</span></em>
|
|
<em><span style="color:#236e25;">// Add a post step callback to safely remove the body and shape from the space.
|
|
</span></em> <em><span style="color:#236e25;">// Calling cpSpaceRemove*() directly from a collision handler callback can cause crashes.
|
|
</span></em> <span style="color:#003369;">cpSpaceAddPostStepCallback</span>(space, (cpPostStepFunc)postStepRemove, b, <strong><span style="color:#881350;">NULL</span></strong>);
|
|
|
|
<em><span style="color:#236e25;">// The object is dead, don’t process the collision further
|
|
</span></em> <strong><span style="color:#881350;">return</span></strong> <span style="color:#0000ff;">0</span>;
|
|
}
|
|
|
|
<span style="color:#683821;">#define BULLET_TYPE </span><span style="color:#0000ff;">1</span><span style="color:#683821;">
|
|
#define MONSTER_TYPE </span><span style="color:#0000ff;">2</span><span style="color:#683821;">
|
|
</span>
|
|
<em><span style="color:#236e25;">// Define a collision handler for bullets and monsters
|
|
// Kill the monster by removing it’s shape and body from the space as soon as it’s hit by a bullet
|
|
</span></em><span style="color:#003369;">cpSpaceAddCollisionHandler</span>(space, BULLET_TYPE, MONSTER_TYPE, begin, <strong><span style="color:#881350;">NULL</span></strong>, <strong><span style="color:#881350;">NULL</span></strong>, <strong><span style="color:#881350;">NULL</span></strong>, <strong><span style="color:#881350;">NULL</span></strong>);</pre>
|
|
|
|
<p>For more callback examples, see the <a href="http://code.google.com/p/chipmunk-physics/source/browse/trunk/Demo/OneWay.c">One Way Platform Demo</a>, <a href="http://code.google.com/p/chipmunk-physics/source/browse/trunk/Demo/Sensors.c">Sensors Demo</a>, or the <a href="http://code.google.com/p/chipmunk-physics/source/browse/trunk/Demo/Player.c">Player Demo</a>.</p>
|
|
|
|
<!-- Query Examples -->
|
|
<a name="Query" />
|
|
<h2>Query Examples:</h2>
|
|
|
|
<p>The following example is taken directly from <a href="http://code.google.com/p/chipmunk-physics/source/browse/trunk/Demo/ChipmunkDemo.c#319">ChipmunkDemo.c</a>. When the mouse is clicked, a point query is performed to see if there is a shape under the mouse. If there is, it adds a joint to the body that links it to the mouse's movement.</p>
|
|
|
|
<pre style="text-align:left;color:#000000; background-color:#ffffff; border:solid black 1px; padding:0.5em 1em 0.5em 1em; overflow:auto;font-size:small; font-family:monospace; "><strong><span style="color:#881350;">static</span></strong> <strong><span style="color:#881350;">void</span></strong>
|
|
<span style="color:#003369;">click</span>(<strong><span style="color:#881350;">int</span></strong> button, <strong><span style="color:#881350;">int</span></strong> state, <strong><span style="color:#881350;">int</span></strong> x, <strong><span style="color:#881350;">int</span></strong> y)
|
|
{
|
|
<strong><span style="color:#881350;">if</span></strong>(button == GLUT_LEFT_BUTTON){
|
|
<strong><span style="color:#881350;">if</span></strong>(state == GLUT_DOWN){
|
|
cpVect point = <span style="color:#003369;">mouseToSpace</span>(x, y);
|
|
|
|
cpShape *shape = <span style="color:#003369;">cpSpacePointQueryFirst</span>(space, point, GRABABLE_MASK_BIT, <span style="color:#0000ff;">0</span>);
|
|
<strong><span style="color:#881350;">if</span></strong>(shape){
|
|
cpBody *body = shape->body;
|
|
mouseJoint = <span style="color:#003369;">cpPivotJointNew2</span>(mouseBody, body, cpvzero, <span style="color:#003369;">cpBodyWorld2Local</span>(body, point));
|
|
mouseJoint->maxForce = <span style="color:#0000ff;">50000.0f</span>;
|
|
mouseJoint->biasCoef = <span style="color:#0000ff;">0.15f</span>;
|
|
<span style="color:#003369;">cpSpaceAddConstraint</span>(space, mouseJoint);
|
|
}
|
|
} <strong><span style="color:#881350;">else</span></strong> <strong><span style="color:#881350;">if</span></strong>(mouseJoint){
|
|
<span style="color:#003369;">cpSpaceRemoveConstraint</span>(space, mouseJoint);
|
|
<span style="color:#003369;">cpConstraintFree</span>(mouseJoint);
|
|
mouseJoint = <strong><span style="color:#881350;">NULL</span></strong>;
|
|
}
|
|
}
|
|
}</pre>
|
|
|
|
<p>Perform a segment query to see if a laser beam hits a shape. We want to draw particles at both the position where the beam enters and exits the shape.</p>
|
|
|
|
<pre style="text-align:left;color:#000000; background-color:#ffffff; border:solid black 1px; padding:0.5em 1em 0.5em 1em; overflow:auto;font-size:small; font-family:monospace; ">cpVect a = <span style="color:#003369;">cpv</span>(...), b = <span style="color:#003369;">cpv</span>(...);
|
|
|
|
cpSegmentQueryInfo info = {};
|
|
<strong><span style="color:#881350;">if</span></strong>(<span style="color:#003369;">cpSpaceSegmentQueryFirst</span>(space, a, b, -<span style="color:#0000ff;">1</span>, <span style="color:#0000ff;">0</span>, &info)){
|
|
cpSegmentQueryInfo info2;
|
|
<span style="color:#003369;">cpShapeSegmentQuery</span>(info.shape, b, a, &info2);
|
|
|
|
cpVect enterPoint = <span style="color:#003369;">cpSegmentQueryHitPoint</span>(a, b, info);
|
|
cpVect exitPoint = <span style="color:#003369;">cpSegmentQueryHitPoint</span>(b, a, info2);
|
|
}</pre>
|
|
|
|
</body>
|
|
</html>
|