annotate trunk/tests/ChipmunkDemos/samples/Simple.d @ 16:af2f61a96318

ported chipmunk demos
author Extrawurst
date Sat, 04 Dec 2010 02:02:29 +0100
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
16
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
1
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
2 // written in the D programming language
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
3
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
4 module samples.Simple;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
5
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
6 import chipmunkd.chipmunk;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
7
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
8 import samples.ChipmunkDemo;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
9
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
10 static cpSpace *space;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
11
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
12 // Init is called by the demo code to set up the demo.
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
13 static cpSpace *
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
14 init()
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
15 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
16 // Create a space, a space is a simulation world. It simulates the motions of rigid bodies,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
17 // handles collisions between them, and simulates the joints between them.
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
18 space = cpSpaceNew();
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
19
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
20 // Lets set some parameters of the space:
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
21 // More iterations make the simulation more accurate but slower
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
22 space.iterations = 10;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
23 // These parameters tune the efficiency of the collision detection.
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
24 // For more info: http://code.google.com/p/chipmunk-physics/wiki/cpSpace
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
25 cpSpaceResizeStaticHash(space, 30.0f, 1000);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
26 cpSpaceResizeActiveHash(space, 30.0f, 1000);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
27 // Give it some gravity
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
28 space.gravity = cpv(0, -100);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
29
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
30 // Create A ground segment along the bottom of the screen
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
31 // By attaching it to &space.staticBody instead of a body, we make it a static shape.
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
32 cpShape *ground = cpSegmentShapeNew(&space.staticBody, cpv(-320,-240), cpv(320,-240), 0.0f);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
33 // Set some parameters of the shape.
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
34 // For more info: http://code.google.com/p/chipmunk-physics/wiki/cpShape
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
35 ground.e = 1.0f; ground.u = 1.0f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
36 ground.layers = NOT_GRABABLE_MASK; // Used by the Demo mouse grabbing code
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
37 // Add the shape to the space as a static shape
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
38 // If a shape never changes position, add it as static so Chipmunk knows it only needs to
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
39 // calculate collision information for it once when it is added.
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
40 // Do not change the postion of a static shape after adding it.
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
41 cpSpaceAddShape(space, ground);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
42
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
43 // Add a moving circle object.
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
44 cpFloat radius = 15.0f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
45 cpFloat mass = 10.0f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
46 // This time we need to give a mass and moment of inertia when creating the circle.
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
47 cpBody *ballBody = cpBodyNew(mass, cpMomentForCircle(mass, 0.0f, radius, cpvzero));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
48 // Set some parameters of the body:
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
49 // For more info: http://code.google.com/p/chipmunk-physics/wiki/cpBody
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
50 ballBody.p = cpv(0, -100 + radius+50);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
51 ballBody.v = cpv(0, -20);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
52 // Add the body to the space so it will be simulated and move around.
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
53 cpSpaceAddBody(space, ballBody);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
54
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
55
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
56 // Add a circle shape for the ball.
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
57 // Shapes are always defined relative to the center of gravity of the body they are attached to.
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
58 // When the body moves or rotates, the shape will move with it.
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
59 // Additionally, all of the cpSpaceAdd*() functions return the thing they added so you can create and add in one go.
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
60 cpShape *ballShape = cpSpaceAddShape(space, cpCircleShapeNew(ballBody, radius, cpvzero));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
61 ballShape.e = 0.0f; ballShape.u = 0.9f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
62
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
63 return space;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
64 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
65
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
66 // Update is called by the demo code each frame.
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
67 static void
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
68 update(int ticks)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
69 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
70 // Chipmunk allows you to use a different timestep each frame, but it works much better when you use a fixed timestep.
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
71 // An excellent article on why fixed timesteps for game logic can be found here: http://gafferongames.com/game-physics/fix-your-timestep/
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
72 cpSpaceStep(space, 1.0f/60.0f);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
73 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
74
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
75 // destroy is called by the demo code to free all the memory we've allocated
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
76 static void
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
77 destroy()
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
78 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
79 cpSpaceFreeChildren(space);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
80 cpSpaceFree(space);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
81 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
82
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
83 chipmunkDemo Simple = {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
84 "Simple",
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
85 null,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
86 &init,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
87 &update,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
88 &destroy,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
89 };