64 lines
5.3 KiB
HTML
64 lines
5.3 KiB
HTML
|
|
<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; "><span style="color:#683821;">#include <stdio.h>
|
||
|
|
#include <chipmunk.h>
|
||
|
|
</span>
|
||
|
|
<strong><span style="color:#881350;">int</span></strong> <span style="color:#003369;">main</span>(<strong><span style="color:#881350;">void</span></strong>){
|
||
|
|
<em><span style="color:#236e25;">// cpVect is a 2D vector and cpv() is a shortcut for initializing them.
|
||
|
|
</span></em> cpVect gravity = <span style="color:#003369;">cpv</span>(<span style="color:#0000ff;">0</span>, -<span style="color:#0000ff;">100</span>);
|
||
|
|
|
||
|
|
<em><span style="color:#236e25;">// Create an empty space.
|
||
|
|
</span></em> cpSpace *space = <span style="color:#003369;">cpSpaceNew</span>();
|
||
|
|
<span style="color:#003369;">cpSpaceSetGravity</span>(space, gravity);
|
||
|
|
|
||
|
|
<em><span style="color:#236e25;">// Add a static line segment shape for the ground.
|
||
|
|
</span></em> <em><span style="color:#236e25;">// We'll make it slightly tilted so the ball will roll off.
|
||
|
|
</span></em> <em><span style="color:#236e25;">// We attach it to space->staticBody to tell Chipmunk it shouldn't be movable.
|
||
|
|
</span></em> cpShape *ground = <span style="color:#003369;">cpSegmentShapeNew</span>(space->staticBody, <span style="color:#003369;">cpv</span>(-<span style="color:#0000ff;">20</span>, <span style="color:#0000ff;">5</span>), <span style="color:#003369;">cpv</span>(<span style="color:#0000ff;">20</span>, -<span style="color:#0000ff;">5</span>), <span style="color:#0000ff;">0</span>);
|
||
|
|
<span style="color:#003369;">cpShapeSetFriction</span>(ground, <span style="color:#0000ff;">1</span>);
|
||
|
|
<span style="color:#003369;">cpSpaceAddShape</span>(space, ground);
|
||
|
|
|
||
|
|
<em><span style="color:#236e25;">// Now let's make a ball that falls onto the line and rolls off.
|
||
|
|
</span></em> <em><span style="color:#236e25;">// First we need to make a cpBody to hold the physical properties of the object.
|
||
|
|
</span></em> <em><span style="color:#236e25;">// These include the mass, position, velocity, angle, etc. of the object.
|
||
|
|
</span></em> <em><span style="color:#236e25;">// Then we attach collision shapes to the cpBody to give it a size and shape.
|
||
|
|
</span></em>
|
||
|
|
cpFloat radius = <span style="color:#0000ff;">5</span>;
|
||
|
|
cpFloat mass = <span style="color:#0000ff;">1</span>;
|
||
|
|
|
||
|
|
<em><span style="color:#236e25;">// The moment of inertia is like mass for rotation
|
||
|
|
</span></em> <em><span style="color:#236e25;">// Use the cpMomentFor*() functions to help you approximate it.
|
||
|
|
</span></em> cpFloat moment = <span style="color:#003369;">cpMomentForCircle</span>(mass, <span style="color:#0000ff;">0</span>, radius, cpvzero);
|
||
|
|
|
||
|
|
<em><span style="color:#236e25;">// The cpSpaceAdd*() functions return the thing that you are adding.
|
||
|
|
</span></em> <em><span style="color:#236e25;">// It's convenient to create and add an object in one line.
|
||
|
|
</span></em> cpBody *ballBody = <span style="color:#003369;">cpSpaceAddBody</span>(space, <span style="color:#003369;">cpBodyNew</span>(mass, moment));
|
||
|
|
<span style="color:#003369;">cpBodySetPos</span>(ballBody, <span style="color:#003369;">cpv</span>(<span style="color:#0000ff;">0</span>, <span style="color:#0000ff;">15</span>));
|
||
|
|
|
||
|
|
<em><span style="color:#236e25;">// Now we create the collision shape for the ball.
|
||
|
|
</span></em> <em><span style="color:#236e25;">// You can create multiple collision shapes that point to the same body.
|
||
|
|
</span></em> <em><span style="color:#236e25;">// They will all be attached to the body and move around to follow it.
|
||
|
|
</span></em> cpShape *ballShape = <span style="color:#003369;">cpSpaceAddShape</span>(space, <span style="color:#003369;">cpCircleShapeNew</span>(ballBody, radius, cpvzero));
|
||
|
|
<span style="color:#003369;">cpShapeSetFriction</span>(ballShape, <span style="color:#0000ff;">0.7</span>);
|
||
|
|
|
||
|
|
<em><span style="color:#236e25;">// Now that it's all set up, we simulate all the objects in the space by
|
||
|
|
</span></em> <em><span style="color:#236e25;">// stepping forward through time in small increments called steps.
|
||
|
|
</span></em> <em><span style="color:#236e25;">// It is *highly* recommended to use a fixed size time step.
|
||
|
|
</span></em> cpFloat timeStep = <span style="color:#0000ff;">1.0</span>/<span style="color:#0000ff;">60.0</span>;
|
||
|
|
<strong><span style="color:#881350;">for</span></strong>(cpFloat time = <span style="color:#0000ff;">0</span>; time < <span style="color:#0000ff;">2</span>; time += timeStep){
|
||
|
|
cpVect pos = <span style="color:#003369;">cpBodyGetPos</span>(ballBody);
|
||
|
|
cpVect vel = <span style="color:#003369;">cpBodyGetVel</span>(ballBody);
|
||
|
|
<span style="color:#003369;">printf</span>(
|
||
|
|
<span style="color:#760f15;">"Time is %5.2f. ballBody is at (%5.2f, %5.2f). It's velocity is (%5.2f, %5.2f)\n"</span>,
|
||
|
|
time, pos.x, pos.y, vel.x, vel.y
|
||
|
|
);
|
||
|
|
|
||
|
|
<span style="color:#003369;">cpSpaceStep</span>(space, timeStep);
|
||
|
|
}
|
||
|
|
|
||
|
|
<em><span style="color:#236e25;">// Clean up our objects and exit!
|
||
|
|
</span></em> <span style="color:#003369;">cpShapeFree</span>(ballShape);
|
||
|
|
<span style="color:#003369;">cpBodyFree</span>(ballBody);
|
||
|
|
<span style="color:#003369;">cpShapeFree</span>(ground);
|
||
|
|
<span style="color:#003369;">cpSpaceFree</span>(space);
|
||
|
|
|
||
|
|
<strong><span style="color:#881350;">return</span></strong> <span style="color:#0000ff;">0</span>;
|
||
|
|
}</pre>
|