annotate trunk/tests/ChipmunkDemos/samples/Pump.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.Pump;
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 import gameApp;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
11
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
12 import std.math;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
13
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
14 enum M_PI = PI;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
15 enum M_PI_2 = PI*0.5f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
16
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
17 static cpSpace *space;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
18 static cpConstraint *motor;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
19
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
20 enum numBalls = 5;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
21 static cpBody *balls[numBalls];
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
22
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
23 static void
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
24 update(int ticks)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
25 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
26 cpFloat coef = (2.0f + arrowDirection.y)/3.0f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
27 cpFloat rate = arrowDirection.x*30.0f*coef;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
28
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
29 cpSimpleMotorSetRate(motor, rate);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
30 motor.maxForce = (rate ? 1000000.0f : 0.0f);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
31
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
32 enum int steps = 2;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
33 enum cpFloat dt = 1.0f/60.0f/cast(cpFloat)steps;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
34
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
35 for(int i=0; i<steps; i++){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
36 cpSpaceStep(space, dt);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
37
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
38 for(int j=0; j<numBalls; j++){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
39 cpBody *ball = balls[j];
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
40 if(ball.p.x > 320.0f){
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
41 ball.v = cpvzero;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
42 ball.p = cpv(-224.0f, 200.0f);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
43 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
44 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
45 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
46 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
47
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
48 static cpBody *
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
49 add_ball(cpVect pos)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
50 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
51 cpBody *_body = cpSpaceAddBody(space, cpBodyNew(1.0f, cpMomentForCircle(1.0f, 30, 0, cpvzero)));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
52 _body.p = pos;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
53
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
54 cpShape *shape = cpSpaceAddShape(space, cpCircleShapeNew(_body, 30, cpvzero));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
55 shape.e = 0.0f; shape.u = 0.5f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
56
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
57 return _body;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
58 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
59
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
60 static cpSpace *
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
61 init()
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
62 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
63 space = cpSpaceNew();
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
64 space.gravity = cpv(0, -600);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
65
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
66 cpBody *staticBody = &space.staticBody;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
67 cpShape *shape;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
68
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
69 // beveling all of the line segments slightly helps prevent things from getting stuck on cracks
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
70 shape = cpSpaceAddShape(space, cpSegmentShapeNew(staticBody, cpv(-256,16), cpv(-256,300), 2.0f));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
71 shape.e = 0.0f; shape.u = 0.5f; shape.layers = 1;
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, cpv(-256,16), cpv(-192,0), 2.0f));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
75 shape.e = 0.0f; shape.u = 0.5f; shape.layers = 1;
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 shape = cpSpaceAddShape(space, cpSegmentShapeNew(staticBody, cpv(-192,0), cpv(-192, -64), 2.0f));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
79 shape.e = 0.0f; shape.u = 0.5f; shape.layers = 1;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
80 shape.layers = NOT_GRABABLE_MASK;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
81
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
82 shape = cpSpaceAddShape(space, cpSegmentShapeNew(staticBody, cpv(-128,-64), cpv(-128,144), 2.0f));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
83 shape.e = 0.0f; shape.u = 0.5f; shape.layers = 1;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
84 shape.layers = NOT_GRABABLE_MASK;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
85
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
86 shape = cpSpaceAddShape(space, cpSegmentShapeNew(staticBody, cpv(-192,80), cpv(-192,176), 2.0f));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
87 shape.e = 0.0f; shape.u = 0.5f; shape.layers = 1;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
88 shape.layers = NOT_GRABABLE_MASK;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
89
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
90 shape = cpSpaceAddShape(space, cpSegmentShapeNew(staticBody, cpv(-192,176), cpv(-128,240), 2.0f));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
91 shape.e = 0.0f; shape.u = 0.0f; shape.layers = 1;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
92 shape.layers = NOT_GRABABLE_MASK;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
93
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
94 shape = cpSpaceAddShape(space, cpSegmentShapeNew(staticBody, cpv(-128,144), cpv(192,64), 2.0f));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
95 shape.e = 0.0f; shape.u = 0.5f; shape.layers = 1;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
96 shape.layers = NOT_GRABABLE_MASK;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
97
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
98 cpVect verts[] = [
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
99 cpv(-30,-80),
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
100 cpv(-30, 80),
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
101 cpv( 30, 64),
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
102 cpv( 30,-80),
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
103 ];
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
104
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
105 cpBody *plunger = cpSpaceAddBody(space, cpBodyNew(1.0f, INFINITY));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
106 plunger.p = cpv(-160,-80);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
107
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
108 shape = cpSpaceAddShape(space, cpPolyShapeNew(plunger, 4, verts.ptr, cpvzero));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
109 shape.e = 1.0f; shape.u = 0.5f; shape.layers = 1;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
110
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
111 // add balls to hopper
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
112 for(int i=0; i<numBalls; i++)
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
113 balls[i] = add_ball(cpv(-224 + i,80 + 64*i));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
114
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
115 // add small gear
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
116 cpBody *smallGear = cpSpaceAddBody(space, cpBodyNew(10.0f, cpMomentForCircle(10.0f, 80, 0, cpvzero)));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
117 smallGear.p = cpv(-160,-160);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
118 cpBodySetAngle(smallGear, cast(float)-M_PI_2);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
119
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
120 shape = cpSpaceAddShape(space, cpCircleShapeNew(smallGear, 80.0f, cpvzero));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
121 shape.layers = 0;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
122
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
123 cpSpaceAddConstraint(space, cpPivotJointNew2(staticBody, smallGear, cpv(-160,-160), cpvzero));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
124
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
125 // add big gear
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
126 cpBody *bigGear = cpSpaceAddBody(space, cpBodyNew(40.0f, cpMomentForCircle(40.0f, 160, 0, cpvzero)));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
127 bigGear.p = cpv(80,-160);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
128 cpBodySetAngle(bigGear, cast(float)M_PI_2);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
129
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
130 shape = cpSpaceAddShape(space, cpCircleShapeNew(bigGear, 160.0f, cpvzero));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
131 shape.layers = 0;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
132
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
133 cpSpaceAddConstraint(space, cpPivotJointNew2(staticBody, bigGear, cpv(80,-160), cpvzero));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
134
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
135 // connect the plunger to the small gear.
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
136 cpSpaceAddConstraint(space, cpPinJointNew(smallGear, plunger, cpv(80,0), cpv(0,0)));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
137 // connect the gears.
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
138 cpSpaceAddConstraint(space, cpGearJointNew(smallGear, bigGear, -M_PI_2, -2.0f));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
139
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
140
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
141 // feeder mechanism
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
142 cpFloat bottom = -300.0f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
143 cpFloat top = 32.0f;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
144 cpBody *feeder = cpSpaceAddBody(space, cpBodyNew(1.0f, cpMomentForSegment(1.0f, cpv(-224.0f, bottom), cpv(-224.0f, top))));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
145 feeder.p = cpv(-224, (bottom + top)/2.0f);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
146
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
147 cpFloat len = top - bottom;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
148 cpSpaceAddShape(space, cpSegmentShapeNew(feeder, cpv(0.0f, len/2.0f), cpv(0.0f, -len/2.0f), 20.0f));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
149
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
150 cpSpaceAddConstraint(space, cpPivotJointNew2(staticBody, feeder, cpv(-224.0f, bottom), cpv(0.0f, -len/2.0f)));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
151 cpVect anchr = cpBodyWorld2Local(feeder, cpv(-224.0f, -160.0f));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
152 cpSpaceAddConstraint(space, cpPinJointNew(feeder, smallGear, anchr, cpv(0.0f, 80.0f)));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
153
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
154 // motorize the second gear
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
155 motor = cpSpaceAddConstraint(space, cpSimpleMotorNew(staticBody, bigGear, 3.0f));
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
156
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
157 return space;
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
158 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
159
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
160 static void
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
161 destroy()
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
162 {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
163 cpSpaceFreeChildren(space);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
164 cpSpaceFree(space);
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
165 }
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
166
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
167 chipmunkDemo Pump = {
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
168 "Pump",
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
169 null,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
170 &init,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
171 &update,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
172 &destroy,
af2f61a96318 ported chipmunk demos
Extrawurst
parents:
diff changeset
173 };