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

ported chipmunk demos
author Extrawurst
date Sat, 04 Dec 2010 02:02:29 +0100
parents
children 4604c914f2ab
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.Tumble;
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 static cpBody *staticBody;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
12
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
13 static void
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
14 update(int ticks)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
15 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
16 enum int steps = 3;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
17 enum cpFloat dt = 1.0f/60.0f/cast(cpFloat)steps;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
18
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
19 for(int i=0; i<steps; i++){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
20 cpSpaceStep(space, dt);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
21
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
22 // Manually update the position of the static shape so that
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
23 // the box rotates.
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
24 cpBodyUpdatePosition(staticBody, dt);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
25
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
26 // Because the box was added as a static shape and we moved it
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
27 // we need to manually rehash the static spatial hash.
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
28 cpSpaceRehashStatic(space);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
29 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
30 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
31
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
32 static cpSpace *
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
33 init()
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
34 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
35 staticBody = cpBodyNew(INFINITY, INFINITY);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
36
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
37 cpResetShapeIdCounter();
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
38
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
39 space = cpSpaceNew();
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
40 cpSpaceResizeActiveHash(space, 40.0f, 999);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
41 cpSpaceResizeStaticHash(space, 40.0f, 99);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
42 space.gravity = cpv(0, -600);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
43
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
44 cpBody *_body;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
45 cpShape *shape;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
46
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
47 // Vertexes for the bricks
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
48 int num = 4;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
49 cpVect verts[] = [
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
50 cpv(-30,-15),
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
51 cpv(-30, 15),
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
52 cpv( 30, 15),
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
53 cpv( 30,-15),
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 // Set up the static box.
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
57 cpVect a = cpv(-200, -200);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
58 cpVect b = cpv(-200, 200);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
59 cpVect c = cpv( 200, 200);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
60 cpVect d = cpv( 200, -200);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
61
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
62 shape = cpSpaceAddShape(space, cpSegmentShapeNew(staticBody, a, b, 0.0f));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
63 shape.e = 1.0f; shape.u = 1.0f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
64 shape.layers = NOT_GRABABLE_MASK;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
65
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
66 shape = cpSpaceAddShape(space, cpSegmentShapeNew(staticBody, b, c, 0.0f));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
67 shape.e = 1.0f; shape.u = 1.0f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
68 shape.layers = NOT_GRABABLE_MASK;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
69
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
70 shape = cpSpaceAddShape(space, cpSegmentShapeNew(staticBody, c, d, 0.0f));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
71 shape.e = 1.0f; shape.u = 1.0f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
72 shape.layers = NOT_GRABABLE_MASK;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
73
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
74 shape = cpSpaceAddShape(space, cpSegmentShapeNew(staticBody, d, a, 0.0f));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
75 shape.e = 1.0f; shape.u = 1.0f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
76 shape.layers = NOT_GRABABLE_MASK;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
77
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
78 // Give the box a little spin.
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
79 // Because staticBody is never added to the space, we will need to
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
80 // update it ourselves. (see above).
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
81 // NOTE: Normally you would want to add the segments as normal and not static shapes.
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
82 // I'm just doing it to demonstrate the cpSpaceRehashStatic() function.
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
83 staticBody.w = 0.4f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
84
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
85 int foo;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
86 // Add the bricks.
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
87 for(int i=0; i<3; i++){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
88 for(int j=0; j<7; j++){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
89 _body = cpSpaceAddBody(space, cpBodyNew(1.0f, cpMomentForPoly(1.0f, num, verts.ptr, cpvzero)));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
90 _body.p = cpv(i*60 - 150, j*30 - 150);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
91
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
92 //BUG: crazy fucking dmd codegen bug when optimizing (2.050)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
93 foo = i+j;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
94
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
95 shape = cpSpaceAddShape(space, cpPolyShapeNew(_body, num, verts.ptr, cpvzero));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
96 shape.e = 0.0f; shape.u = 0.7f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
97 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
98 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
99
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
100 return space;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
101 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
102
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
103 static void
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
104 destroy()
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
105 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
106 cpBodyFree(staticBody);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
107 cpSpaceFreeChildren(space);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
108 cpSpaceFree(space);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
109 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
110
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
111 chipmunkDemo Tumble = {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
112 "Tumble",
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
113 null,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
114 &init,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
115 &update,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
116 &destroy,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
117 };